【问题标题】:MY SPI receive buffer always returns 0xFF我的 SPI 接收缓冲区总是返回 0xFF
【发布时间】: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 &lt; 20; loop ++) { flashData.TXbuffer[dataCount++] = 0xFF; // dummy bytes } 真的有必要吗? DRV_SPI_BufferAddRead 中的读取计时不是完成了吗?
  • 是的,但我添加了虚拟字节进行测试,因为它仍然给我 0xFF 没有虚拟字节。

标签: c embedded spi microchip pic32


【解决方案1】:

Atlast 解决了这个问题,结果发现两个不同 PIC32 上的 SDI 端口出现故障。我们今天得到的第三个成功了。

提醒其他人:如果您通过 MOSI 和 MISO 的输出和后续输入看起来不错,则您的时钟看起来正确,您的引脚设置正常但您没有获取数据,您可能只是芯片上的输入连接有问题.

将 SDI 引脚配置为 Microchip 和谐的开漏并且还声明缓冲区是一致的,这至少对我们的配置很有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-15
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 2018-07-13
    • 1970-01-01
    • 2012-12-05
    相关资源
    最近更新 更多