Other Parts Discussed in Thread: Z-STACK,
SPI 模式下,读取 U1DBUF始终是255,读取前增加延时直接死机
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.
你好!
我使用的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的留言进行操作。
希望对您有所帮助。