[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]