zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    剑指offer-树的子结构
    剑指offer-二叉搜索树的后序遍历序列
    剑指offer-调整数组顺序使奇数位于偶数前面
    剑指offer-包含min函数的栈
    剑指offer-从上往下打印二叉树
    剑指offer-链表中倒数第k个结点
    剑指offer-合并两个排列的链接
    剑指offer-替换空格
    剑指offer-旋转数组的最小数字
    剑指offer-数字在排序数组中出现的次数
  • 原文地址:https://www.cnblogs.com/liangbo-1024/p/9263585.html
Copyright © 2011-2022 走看看