【发布时间】:2019-09-15 00:23:27
【问题描述】:
我正在尝试使用 Microchip Harmonyv 2.02b SPI 驱动程序将 SST26 与 Pic32MX470F 连接。我能够根据我在逻辑分析仪上看到的内容正确写入/读取,因为 MISO 和 MOSI 线都显示了正确的数据。
我面临的问题是,在我的 RX 缓冲区中,我没有得到正确的数据,只能看到 0xFF。
除了读/写功能。在写任何东西之前,我也会进行全局解锁、块擦除和写启用。我还确保将 SDI 线设置为和声引脚配置的输入。我的 SDI 引脚连接到 pic32 上的 pin45(RPD11/PMCS1/RD11)。
以下是我的实现。
void Flash1_TestWrite()
{
uint32_t num_of_bytes, loop, dataCount;
flashData.TXbuffer[0] = 0x02; // Write Flash Page1 address 0x0000
flashData.TXbuffer[1] = 0x00;
flashData.TXbuffer[2] = 0x00;
flashData.TXbuffer[3] = 0x00;
dataCount = 4;
for(loop =0; loop < 20; loop ++)
{
flashData.TXbuffer[dataCount++] = 0xAA;
}
num_of_bytes = dataCount; //opcode + address + data
Flash1_WREN(); / /Enable Write
nFlashCS1Off();
Flash1_Write_Buffer_Handle = DRV_SPI_BufferAddWrite(SPIHandle,(SPI_DATA_TYPE *) &flashData.TXbuffer[0], num_of_bytes, 0, 0);
if (DRV_SPI_BUFFER_EVENT_COMPLETE & DRV_SPI_BufferStatus(Flash1_Write_Buffer_Handle))
{
nFlashCS1On();
}
}
voidFlash1_Read( void )
{
switch(flashData.state)
{
uint32_t num_of_bytes, loop, dataCount;
case FLASH1_INIT:
{
nFlashCS1On();
flashData.state = FLASH1_SEND_READ_CMD;
break;
}
case FLASH1_SEND_READ_CMD:
{
flashData.TXbuffer[0] = 0x03; // Read Page
flashData.TXbuffer[1] = 0x00;
flashData.TXbuffer[2] = 0x00; // Address - MSB
flashData.TXbuffer[3] = 0x00; // Address - LSB
dataCount = 4;
for(loop =0; loop < 20; loop ++)
{
flashData.TXbuffer[dataCount++] = 0xFF; // dummy bytes
}
num_of_bytes = dataCount;
nFlashCS1Off();
Flash1_Write_Buffer_Handle = DRV_SPI_BufferAddWrite(SPIHandle, (SPI_DATA_TYPE *) &flashData.TXbuffer[0], num_of_bytes, 0, 0);
flashData.state = FLASH1_WAIT_FOR_REPLY;
break;
}
case FLASH1_WAIT_FOR_REPLY:
{
if(DRV_SPI_BUFFER_EVENT_COMPLETE &
DRV_SPI_BufferStatus(Flash1_Write_Buffer_Handle))
flashData.state = FLASH1_GET_DATA;
break;
}
case FLASH1_GET_DATA:
{
Flash1_Read_Buffer_Handle = DRV_SPI_BufferAddRead( SPIHandle, (SPI_DATA_TYPE *) &flashData.RXbuffer[0], 24, 0, 0);
flashData.state = FLASH1_WAIT_FOR_DATA;
break;
}
case FLASH1_WAIT_FOR_DATA:
{
if(DRV_SPI_BUFFER_EVENT_COMPLETE &
DRV_SPI_BufferStatus (Flash1_Read_Buffer_Handle))
{
nFlashCS1On(); // Assert CS line
flashData.state = FLASH1_READ_COMPLETE;
}
break;
}
case FLASH1_READ_COMPLETE:
{
break;
}
default:
break;
}
return false;
}
有人可以建议我如何在我的 rx 缓冲区中获取正确的数据吗?
【问题讨论】:
-
使用 SPI 时,总是怀疑“时钟偏差”。也就是说,请仔细检查您的 CPOL(时钟极性)和 CPHA(时钟相位)设置。
-
看起来它可能发送了太多时钟信号。
for(loop =0; loop < 20; loop ++) { flashData.TXbuffer[dataCount++] = 0xFF; // dummy bytes }真的有必要吗?DRV_SPI_BufferAddRead中的读取计时不是完成了吗? -
是的,但我添加了虚拟字节进行测试,因为它仍然给我 0xFF 没有虚拟字节。
标签: c embedded spi microchip pic32