我使用的nRF52832芯片连接到一个DW1000模块。问题是当从DW1000请求数据时,第一个字节丢失了。芯片应该发送0xDECA 0130,但我却收到0xCA0130FF。当我使接收缓冲区变大时,会显示缺少的0xDE (传输以最低字节开始)。我的问题是,这是怎么发生的,为什么会发生。
配置
SPI配置是根据DW1000的数据表,使用nRF SPI驱动程序进行的。它包括
在开始通信之前,DW1000是通过将其复位引脚拉低重新设置的,并在释放它之前保持足够长的时间。重置后,主机等待一段时间让模块启动。在此之后,第一件事是将所述值读取为32位寄存器值。
nRF设置
nRF设置包括
nrf_drv_spi_transfer和缓冲区长度为4字节的所采取的步骤
我已经尝试了以下几点,但没有解决任何问题:
我知道用(*)表示的步骤不应该解决问题。
不幸的是,它是一个嵌入式设备,所以我不能访问CLK和MISO引脚连接到示波器。
我感谢任何关于这件事的意见。
发布于 2018-03-20 14:59:23
因此,很明显,问题在于SPI从服务器对特定请求的响应方式。由于SPI是一个同步协议,所以从第一个时钟周期开始,从开始就必须发送数据。由于它不知道至少在传输第一个字节之前发送什么(如果是这样的话),所以它必须发送一些东西,所以主服务器应该忽略(至少)正在传输的第一个字符。如果读取请求的长度已知,则传输必须比请求的数据本身长一个字节。
发布于 2022-03-17 02:22:54
我正在使用NRF52840 + DW3000。我了解到SPI每次在这个芯片上传输多达255个数据。因此,我使用多个循环加上指针偏移量来解决这个问题。这是我的代码,希望你看到是否有任何错误,也希望能帮助你。`
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;
}`
https://stackoverflow.com/questions/49350128
复制相似问题