大家好!
在我的代码中、我能够从 SPI 闪存读取器件 ID、但无法执行读取 操作。 。 当我写入虚拟数据 A B C D 并尝试读取时、我将仅获取全部0xFF。 请查看我的代码并帮助我。
提前感谢。
在 IT RTOS 中使用 SPI 配置的 IM
void SPI_CONFIG (void)
{
SPI_PARAMS_INIT (&spiParams);
spiParams.transferMode = SPI_MODE_BLOCKING;
spiParams.transferTimeout = SPI_WAIT_FOREVER;
spiParams.transferCallbackFxn = NULL;
spiParams.mode = SPI_MASTER;
spiParams.bitrate = 1000000;
spiParams.dataSize = 8;
spiParams.frameFormat = SPI_POL1_PHA1;
spiHandle = SPI_open (Board_SPI0、&spiParams);
if (spiHandle == NULL)
{
// printf ("无法打开 SPI2...!");
}
}
//此函数使闪存写入使能
空 flashWriteEnable (void)
{
controlCSPin (true);//将 CS 引脚设置为低电平以启用器件
//启用写入使能
translBuffer[0]= 0x06;//写入使能命令
SPI_Transaction spiTransaction;
spiTransaction.count = 1;
spiTransaction.txBuf = translBuffer;
spiTransaction.rxBuf = NULL;
if (spi_transfer (spiHandle、&spiTransaction))
{
// printf ("写入启用成功...");
}
否则
{
// printf ("写入启用错误发生... !");
返回;
}
controlCSPin (false);//将 CS 引脚设置为高电平以禁用器件
}
//用于擦除闪存扇区的函数
空 flashSectorErase (uint32_t 地址)
{
controlCSPin (true);//将 CS 引脚设置为低电平以启用器件
//擦除扇区
SPI_Transaction spiTransaction;
// spiTransaction.count = length + 4;
// spiTransaction.count = length;
spiTransaction.txBuf = translBuffer1;
spiTransaction.rxBuf = receiveBuffer1;
translBuffer[0]= 0x20;//扇区擦除命令
translBuffer[1]=(地址>> 16)& 0xFF;//地址字节2
translBuffer[2]=(address >> 8)& 0xFF;// Address byte 1
translate_Buffer[3]=地址和0xFF;//地址字节0
spiTransaction.count = 4;
if (spi_transfer (spiHandle、&spiTransaction))
{
// printf ("扇区擦除成功... !");
}
否则
{
// printf ("出现扇区擦除错误... !");
返回;
}
}
//将数据写入 W25Q 闪存的函数
void flashWrite (uint32_t address、uint8_t * data、uint32_t length)
{
flashWriteEnable();
闪存扇区擦除(地址);
//读取 W25Q32闪存的状态寄存器
uint8_t statusRegister = readStatusRegister ();
SPI_Transaction spiTransaction;
// spiTransaction.count = length + 4;
spiTransaction.count =长度;
spiTransaction.txBuf = translBuffer1;
spiTransaction.rxBuf = receiveBuffer1;
//等待擦除操作完成(可以使用状态寄存器轮询)
if ((statusRegister & 0x02))//((statusRegister & 0x01)== 0) BUSY
{
//页面程序
controlCSPin (true);//将 CS 引脚设置为低电平以启用器件
translBuffer[0]= 0x02;// Page Program 命令
translBuffer[1]=(地址>> 16)& 0xFF;//地址字节2
translBuffer[2]=(address >> 8)& 0xFF;// Address byte 1
translate_Buffer[3]=地址和0xFF;//地址字节0
memcpy(&translBuffer[4],data,length,);
spiTransaction.count = length + 4;
if (spi_transfer (spiHandle、&spiTransaction))
{
// printf ("页面程序成功... !");
}
否则
{
// printf ("出现页面程序错误... !");
返回;
}
controlCSPin (false);//将 CS 引脚设置为高电平以禁用器件
}
}
//从 W25Q 闪存读取数据的函数
void flashRead (uint32_t address、uint8_t * data、uint32_t length)
{
controlCSPin (true);//将 CS 引脚设置为低电平以启用器件
translucBuffer1[0]= 0x03;//读取命令
translBuffer1[1]=(地址>> 16)& 0xFF;//地址字节2
translBuffer1[2]=(address >> 8)& 0xFF;// Address Byte 1
translBuffer1[3]= Address & 0xFF;// Address Byte 0
SPI_Transaction spiTransaction;
spiTransaction.count = length + 4;
// spiTransaction.count = length;
spiTransaction.txBuf = translBuffer1;
spiTransaction.rxBuf = receiveBuffer1;
if (spi_transfer (spiHandle、&spiTransaction))
{
memcpy (data、&receiveBuffer1[4]、length);
// printf ("读取成功... !");
}
否则
{
// printf ("读取错误发生... !");
}
controlCSPin (false);//将 CS 引脚设置为高电平以禁用器件
}