[DemoCode下载] 2M字节的串行Flash芯片At45DB161D单片机驱动代码

[复制链接]
 楼主| cowboy2014 发表于 2015-12-19 20:16 | 显示全部楼层 |阅读模式
  1. //----------------------------------------------------------
  2. // ATMEL串行Flash芯片At45DB161D驱动
  3. // 采用512字节/页模式以提高代码的时间/空间效率
  4. //----------------------------------------------------------
  5. #include "..\include\AT89X52.H"
  6. #include "..\include\at45db161_drv.h"

  7. //芯片的CS信号==由P20~P22经过3-8线译码器产生的Y2
  8. //若采用其他方式产生CS信号,应修改AT45161_CS()函数
  9. uint CS=0xff;
  10. void AT45161_CS(uchar v)
  11. {
  12.     CS |= 0x07;          //???? ?111
  13.     if(v==0) CS &= 0xfa; //???? ?010
  14.     P2 = CS;
  15. }
  16. //----------------------------------------------------------
  17. // 字节写函数
  18. //----------------------------------------------------------
  19. void Flash_Byte_Write(uchar v)
  20. {
  21.     uchar i;
  22.     for(i=0; i<8; i++)
  23.     {                                       //vvvv位值=>MOSI
  24.         if(v&0x80) AT45161_MOSI = 1;
  25.         else       AT45161_MOSI = 0;
  26.         AT45161_CLK = 0;            //CLK为低,准备产生上升沿
  27.         v <<= 1;                              //准备下一个位
  28.         AT45161_CLK = 1;   //CLK为高,产生一个上升沿,移进一位
  29.     }
  30. }


 楼主| cowboy2014 发表于 2015-12-19 20:17 | 显示全部楼层
  1. //----------------------------------------------------------
  2. // 字节读函数
  3. // 注意进入次函数之前要确保FLASH_CLK引脚为高
  4. //----------------------------------------------------------
  5. void Flash_Byte_Read(uchar* v)
  6. {
  7.     uchar i;
  8.     *v = 0x00;
  9.     AT45161_MISO = 0x01;                    //设置AT45161_MISO对应的Px_y为输入
  10.     for(i=0; i<8; i++)
  11.     {
  12.         AT45161_CLK = 0;       //CLK为低,产生下降沿,移出一位
  13.         (*v) <<= 1;
  14.         if(AT45161_MISO) (*v) += 0x01;    //取移出的那一位值
  15.         AT45161_CLK = 1;            //CLK为高,准备产生下降沿
  16.     }
  17. }
 楼主| cowboy2014 发表于 2015-12-19 20:18 | 显示全部楼层
  1. //----------------------------------------------------------
  2. // 函数: Flash_Init()
  3. // 参数:
  4. // 说明: 复位AT45DB161芯片到512Bytes/Page模式,注意本函数仅
  5. //       运行一次就够了
  6. // 返回: 无
  7. // 创建:
  8. // 修改:
  9. //----------------------------------------------------------
  10. void Flash_Init()
  11. {
  12.     AT45161_CLK = 1;                               //CLK为高
  13.     AT45161_CS(0);
  14.     Flash_Byte_Write(0x3d);//设置为512字节/页模式的命令==0x3d2a80a6
  15.     Flash_Byte_Write(0x2a);
  16.     Flash_Byte_Write(0x80);
  17.     Flash_Byte_Write(0xa6);
  18.     AT45161_CS(1);
  19. }
  20. //----------------------------------------------------------
  21. // 函数: Flash_Write(...)
  22. // 参数: address:写AT45DB161D的起始地址
  23. //       data:被写数据的缓冲区
  24. //       nbytes:要写入的字节数
  25. // 说明: 写一定字节的数据到AT45DB161D指定地址
  26. // 返回: 无
  27. // 创建:
  28. // 修改:
  29. // 命令格式:连续写=8位命令82H+3位任意+21位地址
  30. //                 1000 0010  ???a aaaa aaaa aaaa aaaa aaaa
  31. //----------------------------------------------------------
  32. void Flash_Write(ulong address, uchar* buf, uint nbytes)
  33. {
  34.     uint i;
  35.     uchar status = 0;
  36.     AT45161_CLK = 1;                               //CLK为高
  37.     AT45161_CS(0);
  38.     address |= ((ulong)0x82<<24);
  39.     for(i=0; i<4; i++)                      //4字节命令/地址
  40.         Flash_Byte_Write((address>>(24-8*i)) &0xff);
  41.     while(nbytes--) Flash_Byte_Write(*buf++);
  42.     AT45161_CS(1);
  43.     while((status & 0x80) == 0)  
  44.     {                    //读回状态寄存器,Bit7=1说明写成功了
  45.         AT45161_CS(0);   //注意读状态寄存器时对CS信号的要求!
  46.         Flash_Byte_Write(0xD7);
  47.         Flash_Byte_Read(&status);
  48.         AT45161_CS(1);
  49.     }
  50.     AT45161_CS(1);
  51. }
 楼主| cowboy2014 发表于 2015-12-19 20:18 | 显示全部楼层
  1. //----------------------------------------------------------
  2. // 函数: Flash_Read(...)
  3. // 参数: address:读AT45DB161D的起始地址
  4. //       buf:数据缓冲区
  5. //       nbytes:要读入的字节数
  6. // 说明: 从AT45DB161D指定地址开始读一定字节数的数据到buf
  7. // 返回: 无
  8. // 创建:
  9. // 修改:
  10. // 命令格式:连续读=8位命令E8H+3位任意+21位地址+32个填充位
  11. //                 1110 1000  ???a aaaa aaaa aaaa aaaa aaaa ....
  12. //----------------------------------------------------------
  13. void Flash_Read(ulong address, char* buf, uint nbytes)
  14. {
  15.     uchar i;
  16.     AT45161_CLK = 1;
  17.     AT45161_CS(0);
  18.     address |= ((ulong)0xE8<<24);   //注意ulong强制类型转换!
  19.     for(i=0; i<4; i++)                      //4字节命令/地址
  20.         Flash_Byte_Write((address>>(24-8*i))&0xff);
  21.     for(i=0; i<4; i++) Flash_Byte_Write(0xff); //4字节填充位
  22.     while(nbytes--) Flash_Byte_Read(buf++);
  23.     AT45161_CS(1);
  24. }
pjzmj2012 发表于 2019-12-26 12:48 | 显示全部楼层
没了?扇区擦除、页擦除、块擦除呢?
yiy 发表于 2019-12-29 17:41 | 显示全部楼层
是不是不完整。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

78

主题

821

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部