AT45DB161D 概述

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 }

 

posted @ 2018-07-04 15:43  波特曼  阅读(4947)  评论(0编辑  收藏  举报