This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC2530:SPI 读取 U1DBUF 错误。

Guru**** 2465890 points
Other Parts Discussed in Thread: Z-STACK, CC2530

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/1177642/cc2530-spi-read-u1dbuf-error

器件型号:CC2530
Thread 中讨论的其他器件:Z-stack

大家好、

以下是客户的请求:

在 SPI 模式下、读取 U1DBUF 始终为255、在读取之前添加延迟会导致直接崩溃。

客户使用的是 IAR 版本8.10、但没有使用  Z-Stack。 它们 通过 SPI 将 CC2530连接到 BMP280气压传感器、CC2530处于主模式、BMP280处于从模式、并且发送数据正常(使用示波器观察 MOSI 波形)。

但是、读取传感器数据总是错误的、程序如下:

while(1)
{
P1_4 = 0; //Chip select
U1DBUF = 0xD0; //Send BMP280 Chip ID Register Address, read Mode
while( !U1TX_BYTE ); //Wait for transmission to complete
U1TX_BYTE = 0; //Clear the flag bit
//Delay_us(70); //Eight clocks
chip_id = U1DBUF; //Read the BMP280 chip ID
P1_4 = 1;
sprintf(strTemp, " id: %d", chip_id);
LCD_TextOut(0, 1, strTemp);
}

该程序始终读取255的 CHIP_id。使用仅具有一个负脉冲的示波器观察 MISO 波形、然后将芯片选择 P1_4拉高。很明显、CC2530不会获取 MISO 数据。  如果取消注释"delay_us (70);"、即添加延迟、以便 SPI 有足够的时间接收 MISO 数据、则程序被锁定、U1DBUF 的数据似乎没有完全接收、并且已经等待。  无论延迟多长时间、或判断 U1TX_BYTE (接收到的数据就绪标志)、程序都会被锁定。 在此锁定状态下、示波器无法观察 MISO 波形。

您可以帮助检查此案例吗? 谢谢。

此致、                                                        

Nick

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Nick、

    DELAY_us 是 while / for 循环、还是将 CC2530器件置于低功耗模式?  如果处于低功耗模式、则可能不允许 USART 外设访问驱动 SPI 线路所需的时钟。  它们能否提供示波器图像并确认时序是否符合 BMP280数据表中的预期?  此外 、CC2530软件示例 和 Z-stack 软件资源都包含 SPI 层、这些层可以根据客户的需求进行重用、应进一步审查。  它们可能需要检查 U1CSR 中的 RX_BYTE 位、并 在   以读取模式发送 BMP280芯片 ID 寄存器地址后再次驱动 SPI 线路、以便实际使用接收到的数据填充缓冲器。

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您应参考 LCD 驱动器相关代码、如下所示、并确保在 XNV_SPI_RX (读取 U1DBUF)之前调用 XNV_SPI_WAIT_RXRDY

    /* ----------- XNV ---------- */
    #define XNV_SPI_BEGIN()             st(P1_3 = 0;)
    #define XNV_SPI_TX(x)               st(U1CSR &= ~0x02; U1DBUF = (x);)
    #define XNV_SPI_RX()                U1DBUF
    #define XNV_SPI_WAIT_RXRDY()        st(while (!(U1CSR & 0x02));)
    #define XNV_SPI_END()               st(P1_3 = 1;)