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 错误

Part Number: CC2530
Other Parts Discussed in Thread: Z-STACK,

SPI 模式下,读取 U1DBUF始终是255,读取前增加延时直接死机

  • 您好,

    感谢您的对TI产品的关注!为更加有效地解决您的问题,我需要多一些时间查看这个问题,稍后会为您解答。

  • 您好,

    您是在做什么操作的情况下得到的错误?

    是否可以提供一些相关参考?(SDK版本、示例)

  • 你好!

    我使用的IAR 8.10版本,没有使用Z-Stack

    我是将 CC2530 以 SPI 方式接上 BMP280 气压传感器,CC2530为主模式,BMP280为从模式,发送数据正常(用示波器观察了MOSI波形)。

    读传感器数据始终出错,程序如下:

    变量定义、SPI配置、BMP初始化等忽略;

    while(1)
    {
    P1_4 = 0; //片选
    U1DBUF = 0xD0; //发送BMP280芯片ID寄存器地址,读模式
    while( !U1TX_BYTE ); //等待发送结束
    U1TX_BYTE = 0; //清标志位
    //Delay_us(70); //8个时钟
    chip_id = U1DBUF; //读BMP280芯片ID
    P1_4 = 1;
    sprintf(strTemp, " id: %d", chip_id);
    LCD_TextOut(0, 1, strTemp);
    }

    这段程序读出的chip_id始终为255。用示波器观察MISO波形只有一个负脉冲,接着片选P1_4被拉高。显然CC2530没有获得MISO数据。

    如果取消“Delay_us(70); //8个时钟“的注释,即加入一段延时,让SPI有足够时间接收MISO数据,则程序锁死,似乎U1DBUF的数据没接收完整,一直在等待。

    无论延时加多长,或者判断U1TX_BYTE(接收数据准备好标志),程序都锁死。这种锁死的状态,示波器也无法观看到MISO的波形

    谢谢回复!

  • 您好,

    收到您的跟进消息,有结果及时通知您。

  • 可以參考LCD driver相關代碼並確認你在讀取U1DBUF (XNV_SPI_RX)有先調用 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;)
    

  • 您好,

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

    感谢YiKai给出的建议,您可以参考YiKai的留言进行操作。

    希望对您有所帮助。