Part Number:CC2530Other Parts Discussed in Thread:Z-STACK,
SPI 模式下,读取 U1DBUF始终是255,读取前增加延时直接死机
Nick Sun:
您好,
感谢您的对TI产品的关注!为更加有效地解决您的问题,我需要多一些时间查看这个问题,稍后会为您解答。
,
Nick Sun:
您好,
您是在做什么操作的情况下得到的错误?
是否可以提供一些相关参考?(SDK版本、示例)
,
Yong He:
你好!
我使用的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的波形
谢谢回复!
,
Nick Sun:
您好,
收到您的跟进消息,有结果及时通知您。
,
YiKai Chen:
可以參考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;)
,
Nick Sun:
您好,
DELAY_us 是 while / for 循环,还是将 CC2530器件置于低功耗模式?如果处于低功耗模式、则可能不允许 USART 外设访问驱动 SPI 线路所需的时钟。您能否提供示波器图像并确认时序是否符合 BMP280数据表中的预期?此外, CC2530-Software Examples 和 Z-STACK 软件资源都包含 SPI 层,这些层可以根据您的需求进行重用,应进一步审查。您可能需要检查 U1CSR 中的 RX_BYTE 位,并在以读取模式发送 BMP280芯片 ID 寄存器地址后再次驱动 SPI 线路,以便实际使用接收到的数据填充缓冲器。
感谢YiKai给出的建议,您可以参考YiKai的留言进行操作。
希望对您有所帮助。