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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM