OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5618|回复: 6

大家好,这是我按照红牛开发板的例程写的一个关于AT45DB161D的程序,但是在进行写操作时,当写的大小超过528BYTE时,就会写不进去,读出来全是0xFF

[复制链接]

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2014-8-28
在线时间
29 小时
发表于 2015-12-14 14:42:37 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]主函数的代码:[/mw_shl_code] [mw_shl_code=c,true]#define ADDR_ALL_USERS 0 typedef struct { // uint16_t flag; // uint16_t amount; //已经存储的用户数量 u8 flag; u8 amount; //已经存储的用户数量 uint64_t ID[200]; //最多存储200个用户的卡号 }User_ALL; //单独的一个扇区存储已经保存的用户信 User_ALL RFID_users; typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus; /* Private define ------------------------------------------------------------*/ #define  FLASH_WriteAddress     0x000000 #define  FLASH_ReadAddress      FLASH_WriteAddress #define  FLASH_SectorToErase    FLASH_WriteAddress #define  AT45DB161D_FLASH_ID    0x1F260000 #define  BufferSize (countof(Tx_Buffer)-1) #define countof(a) (sizeof(a) / sizeof(*(a))) u8 Tx_Buffer[] = "STM32F10x SPI Firmware Library Example: communication with an AT45DB161D SPI FLASH"; u8 Index, Rx_Buffer[BufferSize]; vu32 flash_ID = 0; volatile TestStatus TransferStatus1 = FAILED, TransferStatus2 = PASSED; TestStatus Buffercmp(u8* pBuffer1, u8* pBuffer2, u16 BufferLength); void Flash_read_allusers(User_ALL *pAllusers) { // uint32_t size =  sizeof(User_ALL)/2; u16 size =  sizeof(User_ALL); // FSMC_NOR_ReadBuffer((uint16_t *)pAllusers, ADDR_ALL_USERS, size); SPI_FLASH_BufferRead((u8 *)pAllusers, ADDR_ALL_USERS, size); } void Flash_write_allusers(User_ALL *pAllusers) { u16 size =  sizeof(User_ALL); SPI_FLASH_PageErase(ADDR_ALL_USERS); SPI_FLASH_BufferWrite((u8 *)pAllusers, ADDR_ALL_USERS, 529); } int main(void) { RCC_Config(); //RCC_HSE_Configuration(); GPIO_Config(); USART_Configuration(); NVIC_Configuration(); SPI_FLASH_Init(); // flash_ID = SPI_FLASH_ReadID(); // SPI_FLASH_BulkErase(); // SPI_FLASH_PageErase(FLASH_SectorToErase);  //页擦出 // SPI_FLASH_BufferWrite(Tx_Buffer, FLASH_WriteAddress, BufferSize); //写入数据 // SPI_FLASH_BufferRead(Rx_Buffer, FLASH_ReadAddress, BufferSize);   //读出数据 Flash_read_allusers(&RFID_users); printf("RFID_users.flag=%d\r\n",RFID_users.flag); if (RFID_users.flag != 0x5B) { RFID_users.flag = 0x5B; RFID_users.amount = 0; Flash_write_allusers(&RFID_users); Flash_read_allusers(&RFID_users); printf("RFID_users.flag=%d\r\n",RFID_users.flag); } // printf("FLSH_ID=%d\r\n",flash_ID); // printf("%s",Rx_Buffer); // printf("RFID_users.flag=%d\r\n",RFID_users.flag); // printf("FLSH_ID=%d\r\n",RFID_users.amount); while(1) { Flash_read_allusers(&RFID_users); printf("RFID_users.flag=%d\r\n",RFID_users.flag); delay_ms(1000); } }
AT45DB161D的代码:[/mw_shl_code] [mw_shl_code=c,true]#include "pbdata.h" /* Private typedef -----------------------------------------------------------*/ //#define SPI_FLASH_PageSize    512 #define SPI_FLASH_PageSize 512 #define SPI_FLASH_PageNum  4096   /* Private define ------------------------------------------------------------*/ #define WRITE      0x82  /* Write to Memory instruction */ #define READ       0xD3  /* Read from Memory instruction */ #define RDSR       0xD7  /* Read Status Register instruction  */ #define RDID       0x9F  /* Read identification */ #define PE         0x81  /* Page Erase instruction */ #define BE1        0xC7  /* Bulk Erase instruction */ #define BE2        0x94  /* Bulk Erase instruction */ #define BE3        0x80  /* Bulk Erase instruction */ #define BE4        0x9A  /* Bulk Erase instruction */ #define BUSY_Flag  0x80 /* Ready/busy status flag */ #define Dummy_Byte 0xA5 u8 dat; [/mw_shl_code] [mw_shl_code=c,true]void SPI_FLASH_BufferWrite(u8* pBuffer, u32 WriteAddr, u16 NumByteToWrite) { u16 NumOfPage = 0, NumOfSingle = 0, count = 0, temp = 0; u32 Addr = 0; Addr = WriteAddr % SPI_FLASH_PageSize;   NumOfPage =  NumByteToWrite / SPI_FLASH_PageSize; NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize; count = SPI_FLASH_PageSize-Addr; if (Addr == 0) /* WriteAddr is SPI_FLASH_PageSize aligned  */ { if (NumOfPage == 0) /* NumByteToWrite < SPI_FLASH_PageSize */ { SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite); } else /* NumByteToWrite > SPI_FLASH_PageSize */ { while (NumOfPage--) {   SPI_FLASH_PageWrite(pBuffer, WriteAddr, SPI_FLASH_PageSize); WriteAddr +=  SPI_FLASH_PageSize; pBuffer += SPI_FLASH_PageSize; } SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle); } } else /* WriteAddr is not SPI_FLASH_PageSize aligned  */ { if (NumOfPage == 0) /* NumByteToWrite < SPI_FLASH_PageSize */ { if (NumOfSingle > count) /* (NumByteToWrite + WriteAddr) > SPI_FLASH_PageSize */ { temp = NumOfSingle - count; SPI_FLASH_PageWrite(pBuffer, WriteAddr, count); WriteAddr +=  count; pBuffer += count; SPI_FLASH_PageWrite(pBuffer, WriteAddr, temp); } else { SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite); } } else /* NumByteToWrite > SPI_FLASH_PageSize */ { NumByteToWrite -= count; NumOfPage =  NumByteToWrite / SPI_FLASH_PageSize; NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize; SPI_FLASH_PageWrite(pBuffer, WriteAddr, count); WriteAddr +=  count; pBuffer += count; while (NumOfPage--) { SPI_FLASH_PageWrite(pBuffer, WriteAddr, SPI_FLASH_PageSize); WriteAddr +=  SPI_FLASH_PageSize; pBuffer += SPI_FLASH_PageSize; } if (NumOfSingle != 0) { SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle); } } } }[/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true]void SPI_FLASH_PageWrite(u8* pBuffer, u32 WriteAddr, u16 NumByteToWrite) {   /* Select the FLASH: Chip Select low */   SPI_FLASH_CS_LOW();   /* Send "Write to Memory " instruction */   SPI_FLASH_SendByte(WRITE);   /* Send WriteAddr high nibble address byte to write to */   SPI_FLASH_SendByte((WriteAddr & 0xFF0000) >> 16);   /* Send WriteAddr medium nibble address byte to write to */   SPI_FLASH_SendByte((WriteAddr & 0xFF00) >> 8);   /* Send WriteAddr low nibble address byte to write to */   SPI_FLASH_SendByte(WriteAddr & 0xFF);   /* while there is data to be written on the FLASH */   while (NumByteToWrite--)   {   dat = *pBuffer;      /* Send the current byte */     SPI_FLASH_SendByte(dat);     /* Point on the next byte to be written */     pBuffer++;   }   /* Deselect the FLASH: Chip Select high */   SPI_FLASH_CS_HIGH();   /* Wait the end of Flash writing */   SPI_FLASH_WaitForWriteEnd(); } 现在的情况是这样,在调用 SPI_FLASH_BufferWrite()这个函数往FLASH中写数据的时候,如果传递的NumByteToWrite参数大于528,然后在读数据的时候读出来的全是0xFF,各位有没有遇到过这种情况呢? [/mw_shl_code]

SPI测试.rar

1.42 MB, 下载次数: 405

最佳答案

查看完整内容[请看2#楼]

回复【5楼】墨白色雨天: --------------------------------- 肯定要加啊,SPI通信要加上拉的
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
304
金钱
304
注册时间
2012-10-12
在线时间
71 小时
发表于 2015-12-14 14:42:38 | 显示全部楼层
回复【5楼】墨白色雨天:
---------------------------------
肯定要加啊,SPI通信要加上拉的
我就是我,我就是想飞的毛驴!O(∩_∩)O~~~~~
回复

使用道具 举报

5

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
304
金钱
304
注册时间
2012-10-12
在线时间
71 小时
发表于 2015-12-14 16:46:58 | 显示全部楼层
AT45DB161一页最大528字节,4096页。和W25X系列不一样。
我就是我,我就是想飞的毛驴!O(∩_∩)O~~~~~
回复

使用道具 举报

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2014-8-28
在线时间
29 小时
 楼主| 发表于 2015-12-15 10:27:51 | 显示全部楼层
回复【2楼】飞思卡驴:
---------------------------------
但是我看了下,他那个片子是AT45DB161D的,我后来重新换了一个AT45DB161D的片子就没问题了。。。。。郁闷中
回复

使用道具 举报

5

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
304
金钱
304
注册时间
2012-10-12
在线时间
71 小时
发表于 2015-12-15 10:52:54 | 显示全部楼层
是不是你焊接没焊好?上拉电阻多大加了么?
我就是我,我就是想飞的毛驴!O(∩_∩)O~~~~~
回复

使用道具 举报

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2014-8-28
在线时间
29 小时
 楼主| 发表于 2015-12-15 14:45:45 | 显示全部楼层
回复【4楼】飞思卡驴:
---------------------------------
这个片子也要加上拉电阻么??我没有加
回复

使用道具 举报

5

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
304
金钱
304
注册时间
2012-10-12
在线时间
71 小时
发表于 2016-2-24 13:38:58 | 显示全部楼层
墨白色雨天 发表于 2015-12-15 14:45
回复【4楼】飞思卡驴:
---------------------------------
这个片子也要加上拉电阻么??我没有加

需要加的。
我就是我,我就是想飞的毛驴!O(∩_∩)O~~~~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 22:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表