首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SPI从数据移位4位

SPI从数据移位4位
EN

Stack Overflow用户
提问于 2018-03-18 16:17:52
回答 2查看 829关注 0票数 0

我使用的nRF52832芯片连接到一个DW1000模块。问题是当从DW1000请求数据时,第一个字节丢失了。芯片应该发送0xDECA 0130,但我却收到0xCA0130FF。当我使接收缓冲区变大时,会显示缺少的0xDE (传输以最低字节开始)。我的问题是,这是怎么发生的,为什么会发生。

配置

SPI配置是根据DW1000的数据表,使用nRF SPI驱动程序进行的。它包括

  • SPI默认频率设置为1 1MHz
  • SPI芯片选择配置为活动低的Pin
  • 使用SPI模式0
  • MSB首次传输

在开始通信之前,DW1000是通过将其复位引脚拉低重新设置的,并在释放它之前保持足够长的时间。重置后,主机等待一段时间让模块启动。在此之后,第一件事是将所述值读取为32位寄存器值。

nRF设置

nRF设置包括

  • 启用SPI和SPI0
  • SPI0 easyDMA禁用
  • 读取该值包括具有上述配置的nrf_drv_spi_transfer和缓冲区长度为4字节的

所采取的步骤

我已经尝试了以下几点,但没有解决任何问题:

  • 改变SPI频率
  • 更改SPI模式*
  • 重置后增加等待时间
  • 增加传输之间的等待时间
  • 改变MISO拉动配置*
  • 手动芯片选择(包括拉出配置*)

我知道用(*)表示的步骤不应该解决问题。

不幸的是,它是一个嵌入式设备,所以我不能访问CLK和MISO引脚连接到示波器。

我感谢任何关于这件事的意见。

EN

回答 2

Stack Overflow用户

发布于 2018-03-20 14:59:23

因此,很明显,问题在于SPI从服务器对特定请求的响应方式。由于SPI是一个同步协议,所以从第一个时钟周期开始,从开始就必须发送数据。由于它不知道至少在传输第一个字节之前发送什么(如果是这样的话),所以它必须发送一些东西,所以主服务器应该忽略(至少)正在传输的第一个字符。如果读取请求的长度已知,则传输必须比请求的数据本身长一个字节。

票数 0
EN

Stack Overflow用户

发布于 2022-03-17 02:22:54

我正在使用NRF52840 + DW3000。我了解到SPI每次在这个芯片上传输多达255个数据。因此,我使用多个循环加上指针偏移量来解决这个问题。这是我的代码,希望你看到是否有任何错误,也希望能帮助你。`

代码语言:javascript
复制
int readfromspi(uint16_t  headerLength,
                uint8_t   *headerBuffer,
                uint16_t  readLength,
                uint8_t   *readBuffer)
{
    uint8_t* p1,*pbuffer,*pbuffer_1;
    uint32_t idatalength = headerLength + readLength,len=0;
    uint8_t read_size;
    uint32_t f_size=0;
    //if (idatalength > DATALEN1)
    //{
    //    return NRF_ERROR_NO_MEM;
    //}

    while(pgSpiHandler.lock);

    __HAL_LOCK(pgSpiHandler);

    openspi(&pgSpiHandler.spi_inst);

    p1 = idatabuf;
    memcpy(p1, headerBuffer, headerLength);

    p1 += headerLength;
    memset(p1, 0x00, readLength);

    idatalength = headerLength + readLength;

    pbuffer = readBuffer;
    SPIFlash_CS_LOW;
    while(idatalength!=0){ 
        
        if(idatalength<=SPI_TXRX_MAX_LEN){
            
            read_size = idatalength;
            idatalength = 0;
        }else{
            read_size = SPI_TXRX_MAX_LEN;
            idatalength -= SPI_TXRX_MAX_LEN;
        }
        spi_xfer_done = false;
        APP_ERROR_CHECK(nrf_drv_spi_transfer(&pgSpiHandler.spi_inst, idatabuf, read_size, readBuffer, read_size));
        while(!spi_xfer_done);
        //for(int i=0;i<read_size;i++){
        //    pbuffer[len++] = itempbuf[i]; 
        //}
        if(idatalength != 0){
          readBuffer += read_size;

        }
    }
    
    SPIFlash_CS_HIGH;
    //itempbuf = pbuffer;
    readBuffer = pbuffer;
    p1 =  readBuffer  + headerLength;
   
    memcpy(readBuffer, p1, readLength);

    closespi(&pgSpiHandler.spi_inst);

    __HAL_UNLOCK(pgSpiHandler);

    return 0;
}

`

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

https://stackoverflow.com/questions/49350128

复制
相关文章

相似问题

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