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 }