http://www.waveshare.net/shop/AT45DB161D-price.htm
AT45DB161的AT45DB161D版:
AT45DB161D是一款2.5V或2.7V,串行接口的FLASH存儲器,是各種數字語音,圖像,程序代碼和數據存儲應用的理想選擇。AT45DB161D支持RapidS串行接口,適用於要求高速操作的應用。RapidS串行接口兼容SPI,最高頻率可達66MHz。AT45DB161D的存儲容量為17,301,504位,組織形式為4,096頁,每頁512或528頁。
除了主存儲器外,AT45DB161D還包含2個512/528字節的SRAM緩沖區。緩沖區允許在對主存儲器的頁面重新編程時接收數據,也可寫入連續的數據串。通過獨立的“讀-改-寫”三步操作,可以輕松實現EEPROM仿真(可設置成位或字節)。DataFlash通過RapidS串行接口順序訪問數據,而不像傳統FLASH存儲器那樣通過復用總線和並行接口隨機存取。
簡單順序訪問機制極大的減少了有效引腳的數量,有利於硬件布局,增強了系統可靠性,將切換噪音降至最小,並縮小了封裝的尺寸。
對於許多要求高容量,低引腳數,低電壓和低功耗的商業級或工業級應用來講,AT45DB161D是最佳的選擇。
為了實現簡單的在系統重復編程,AT45DB161D並不需要高輸入電壓來支持編程。AT45DB161D工作在獨立的2.5V至3.6V或者2.7V至3.6V電壓下,用於編程和讀取操作。AT45DB161D可通過片選引腳(/CS)使能,並通過3-wire接口訪問,3-wire由串行輸入(SI),串行輸出(SO),和串行時鍾(SCK)組成。
所有的編程和擦除周期都遵循自時序。
AT45DB161的AT45DB161D版:
- 單獨2.5V至3.6V或者2.7V至3.6V工作電壓
- RapidS串行接口:66 MHz最小時鍾頻率
— SPI兼容模式 0 和 3 - 用戶自定義頁面大小
— 512 字節每頁
— 528 字節每頁
— 頁面大小可出廠預設為512字節 - 頁編程操作
— 智能編程操作
— 4,096 頁(512/528 字節/頁)主存儲器 - 靈活的擦除選項
— 頁擦除(512 Bytes)
— 塊擦除(4 Kbytes)
— 扇區擦除(128 Kbytes)
— 片擦除(16 Mbits) - 2個SRAM數據緩沖區(512/528 字節)
— 在對FLASH陣列重新編程時允許接收數據 - 通過整體陣列可連續讀取
— 代碼映射應用的理想選擇 - 低功耗
— 7 mA 典型有效讀取電流
— 25 μA典型待機電流
— 9 μA 典型掉電模式電流 - 硬件和軟件數據保護特性
— 獨立扇區 - 扇區鎖定,用於代碼安全和數據存儲
— 獨立扇區 - 安全性:128字節安全寄存器
— 64字節用戶可編程空間
— 唯一的64字節設備標識符 - JEDEC標准的制造商和器件ID標識
- 每頁編程/擦除周期最小100,000次
- 數據保存-20年 工業級溫度范圍
- 可選綠色環保(Pb/Halide-free/RoHS 認證)封裝
- 驅動程序
驅動程序:
1 #define FLASH_CHREAD 0x0B 2 #define FLASH_CLREAD 0x03 3 #define FLASH_PREAD 0xD2 4 5 #define FLASH_BUFWRITE1 0x84 6 #define FLASH_IDREAD 0x9F 7 #define FLASH_STATUS 0xD7 8 #define PAGE_ERASE 0x81 9 #define PAGE_READ 0xD2 10 #define MM_PAGE_TO_B1_XFER 0x53 // ??????????????????? 11 #define BUFFER_2_WRITE 0x87 // ??????? 12 #define B2_TO_MM_PAGE_PROG_WITH_ERASE 0x86 // ???????????????(????) 13 14 #define Dummy_Byte 0xA5 15 16 17 #define Select_Flash() GPIO_ResetBits(GPIOC, GPIO_Pin_7) 18 19 #define NotSelect_Flash() GPIO_SetBits(GPIOC, GPIO_Pin_7) 20 21 #define SPI_MOSI(C) GPIO_WriteBit(GPIOB,GPIO_Pin_15,(BitAction)C) 22 #define SPI_SCLK(C) GPIO_WriteBit(GPIOB,GPIO_Pin_13,(BitAction)C) 23 #define SPI_MISO GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14) 24 25 26 void SPI_Flash_Init(void); //SPI³õʼ»¯ 27 u8 SPI_Flash_ReadByte(void); //flash²Ù×÷»ù±¾º¯Êý£¬¶ÁÒ»¸ö×Ö½Ú 28 u8 SPI_Flash_SendByte(u8 byte); // FLASH²Ù×÷»ù±¾º¯Êý£¬·¢ËÍÒ»¸ö×Ö½Ú 29 void FlashWaitBusy(void); //Flash??? 30 void FlashReadID(u8 *ProdustID); //??flashID???? 31 void SPI_Flash_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite); 32 void FlashPageRead(u16 page,u8 *Data,u16 len); 33 void FlashPageWrite(u16 page,u8 *Data,u16 len); //????,???0-4095 34 35 36 #include "stm32f10x.h" 37 #include "SPI_Flash.h" 38 #include "stm32f10x_spi.h" 39 volatile u8 dat; 40 unsigned char SST25_buffer[4096]; 41 void SPI_Flash_Init(void); 42 u8 SPI_Flash_ReadByte(void); 43 u8 SPI_Flash_SendByte(u8 byte); 44 45 46 void SPI_Flash_Init(void); 47 48 49 void SPI_Flash_Init(void) 50 { 51 SPI_InitTypeDef SPI_InitStructure; 52 GPIO_InitTypeDef GPIO_InitStructure; 53 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); 54 // RCC_APB1PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); 55 // RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE); 56 // 57 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE); 58 RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,DISABLE); 59 60 // GPIO_PinRemapConfig(GPIO_Remap_SPI3,ENABLE); 61 62 // RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3 ,ENABLE); 63 64 //PB13-----SCK 65 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13; 66 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; 67 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; 68 GPIO_Init(GPIOB,&GPIO_InitStructure); 69 //PB14-----SO 70 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15; 71 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; 72 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; 73 GPIO_Init(GPIOB,&GPIO_InitStructure); 74 //PB15-SI 75 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14; 76 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; 77 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; 78 GPIO_Init(GPIOB,&GPIO_InitStructure); 79 80 81 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; 82 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 83 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 84 GPIO_Init(GPIOC, &GPIO_InitStructure); 85 86 NotSelect_Flash(); 87 88 89 } 90 91 92 u8 SPI_Flash_ReadByte(void) 93 { 94 //return (SPI_Flash_SendByte(Dummy_Byte)); 95 96 dat=0; 97 GPIO_WriteBit(GPIOB,GPIO_Pin_15,(BitAction)1); 98 SPI_SCLK(1);SPI_SCLK(0);dat|=(SPI_MISO&0x01)<<7; 99 SPI_SCLK(1);SPI_SCLK(0);dat|=(SPI_MISO&0x01)<<6; 100 SPI_SCLK(1);SPI_SCLK(0);dat|=(SPI_MISO&0x01)<<5; 101 SPI_SCLK(1);SPI_SCLK(0);dat|=(SPI_MISO&0x01)<<4; 102 SPI_SCLK(1);SPI_SCLK(0);dat|=(SPI_MISO&0x01)<<3; 103 SPI_SCLK(1);SPI_SCLK(0);dat|=(SPI_MISO&0x01)<<2; 104 SPI_SCLK(1);SPI_SCLK(0);dat|=(SPI_MISO&0x01)<<1; 105 SPI_SCLK(1);SPI_SCLK(0);dat|=(SPI_MISO&0x01)<<0; 106 return (dat); 107 108 109 110 } 111 112 113 114 115 116 u8 SPI_Flash_SendByte(u8 byte) 117 { 118 119 dat=byte; 120 GPIO_WriteBit(GPIOB,GPIO_Pin_15,(BitAction)((dat&0x80)>>7)) ;SPI_SCLK(0);SPI_SCLK(1); 121 GPIO_WriteBit(GPIOB,GPIO_Pin_15,(BitAction)((dat&0x40)>>6)) ;SPI_SCLK(0);SPI_SCLK(1); 122 GPIO_WriteBit(GPIOB,GPIO_Pin_15,(BitAction)((dat&0x20)>>5)) ;SPI_SCLK(0);SPI_SCLK(1); 123 GPIO_WriteBit(GPIOB,GPIO_Pin_15,(BitAction)((dat&0x10)>>4)) ;SPI_SCLK(0);SPI_SCLK(1); 124 GPIO_WriteBit(GPIOB,GPIO_Pin_15,(BitAction)((dat&0x08)>>3)) ;SPI_SCLK(0);SPI_SCLK(1); 125 GPIO_WriteBit(GPIOB,GPIO_Pin_15,(BitAction)((dat&0x04)>>2)) ;SPI_SCLK(0);SPI_SCLK(1); 126 GPIO_WriteBit(GPIOB,GPIO_Pin_15,(BitAction)((dat&0x02)>>1)) ;SPI_SCLK(0);SPI_SCLK(1); 127 GPIO_WriteBit(GPIOB,GPIO_Pin_15,(BitAction)((dat&0x01)>>0)) ;SPI_SCLK(0);SPI_SCLK(1); 128 } 129 void FlashWaitBusy(void) 130 { 131 unsigned char state_reg=0x00; 132 Select_Flash(); 133 SPI_Flash_SendByte(FLASH_STATUS); 134 while((state_reg&0x80) == 0) 135 { 136 state_reg = SPI_Flash_ReadByte(); 137 } 138 NotSelect_Flash(); 139 } 140 void FlashReadID(u8 *Data) 141 { 142 u8 i; 143 Select_Flash(); 144 SPI_Flash_SendByte(0x9F); 145 for(i = 0; i < 4; i++) 146 { 147 Data[i] = SPI_Flash_ReadByte(); 148 } 149 NotSelect_Flash(); 150 } 151 152 void FlashPageEarse(u16 page) 153 { 154 FlashWaitBusy(); 155 Select_Flash(); 156 SPI_Flash_SendByte(PAGE_ERASE); 157 SPI_Flash_SendByte((u8)(page >> 6)); 158 SPI_Flash_SendByte((u8)(page << 2)); 159 SPI_Flash_SendByte(Dummy_Byte); 160 //|-23-|-22-|21|20|19|18|17|16|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0| 161 //|2????|------------12????-------------|----10????-----| 162 NotSelect_Flash(); 163 } 164 165 void FlashPageRead(u16 page,u8 *Data,u16 len) 166 { 167 u16 i; 168 FlashWaitBusy(); 169 Select_Flash(); 170 SPI_Flash_SendByte(PAGE_READ); 171 SPI_Flash_SendByte((u8)(page >> 6)); 172 SPI_Flash_SendByte((u8)(page << 2)); 173 SPI_Flash_SendByte(0x00);//3??? 174 SPI_Flash_SendByte(0x00); 175 SPI_Flash_SendByte(0x00); 176 SPI_Flash_SendByte(0x00); 177 SPI_Flash_SendByte(0x00); 178 for (i = 0;i < len; i++) 179 { 180 Data[i] = SPI_Flash_ReadByte(); 181 } 182 NotSelect_Flash(); 183 } 184 185 void FlashPageWrite(u16 page,u8 *Data,u16 len) //????,???0-4095 186 { 187 unsigned int i; 188 FlashWaitBusy(); 189 Select_Flash(); 190 SPI_Flash_SendByte(BUFFER_2_WRITE); 191 SPI_Flash_SendByte(0x00); 192 SPI_Flash_SendByte(0x00); 193 SPI_Flash_SendByte(0x00); 194 for (i = 0;i 195 { 196 SPI_Flash_SendByte(Data[i]); 197 } 198 NotSelect_Flash(); 199 200 if ( page < 4096) 201 { 202 Select_Flash(); 203 SPI_Flash_SendByte(B2_TO_MM_PAGE_PROG_WITH_ERASE); 204 SPI_Flash_SendByte((u8)(page>>6)); 205 SPI_Flash_SendByte((u8)(page<<2)); 206 SPI_Flash_SendByte(0x00); 207 NotSelect_Flash(); 208 FlashWaitBusy(); 209 } 210 }