首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的SPI接收缓冲区总是返回0xFF

我的SPI接收缓冲区总是返回0xFF
EN

Stack Overflow用户
提问于 2019-04-25 22:18:08
回答 1查看 1.2K关注 0票数 2

我正在尝试使用Microchip Harmonyv2.02bSPI驱动程序来连接SST26和Pic32MX470F。我能够根据我在逻辑分析仪上看到的内容正确地写入/读取,因为MISO和MOSI线都显示了正确的数据。

我面临的问题是,在我的RX缓冲区中,我没有获得正确的数据,并且只看到其中的0xFF。

除了read /write函数之外。在写入任何内容之前,我还会执行全局解锁、块擦除和写启用。我还确保SDI线路被设置为来自和声引脚配置的输入。我的SDI引脚连接到pic32上的pin45(RPD11/PMCS1/RD11)。

下面是我的实现。

代码语言:javascript
复制
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缓冲区中获得正确的数据吗?

EN

回答 1

Stack Overflow用户

发布于 2019-05-01 01:59:56

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

给其他人的提醒:如果你通过MOSI和MISO的输出和后续输入看起来很好,你的时钟看起来很准确,你的引脚设置正常,但你没有得到数据,你的芯片上可能只是一个错误的输入连接。

至少在我们的配置中,将SDI引脚配置为Microchip harmony的开放漏极,并声明缓冲区为一致性是有帮助的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55851490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档