CC2530 ADS7822 三线SPI
CC2530连接ADS7822,UBART1作为SPI模式,P1.4——CS,P1.5——CLK,P1.7——Dout【CC2530——ADS7822】.硬件查询方式。
因为ADS7822没有Din(对应MCU的MOSI),所以CC2530的P1.6没有连接,悬空。
P_ADS7822_CS=0; //启动A/D转换
U1DBUF=0x66;
while (!U1RX_BYTE);
U1RX_BYTE = 0;
ADS7822_SPI_MSB=U1DBUF;
U1DBUF=0x66;
while (!U1RX_BYTE);
U1RX_BYTE = 0;
ADS7822_SPI_LSB=U1DBUF;
P_ADS7822_CS=1; //关闭A/D转换
这部分的代码,想法是拉低CS使能,然后向DBUF中写入0x66(可以是任意值,因为ADS7822没有Din,不需要接受命令。MCU的P1.6悬空),在将0x66写入DBUF的时候,硬件MCU触发CLK,ADS7822接收到CLK,返回12位数据。
经示波器检测,CLK无输出波形。请问我的代码处理思路是否是正确的。或者,ADS7822的使用方法谁能讲解一下。
你好,
根据你的描述,你是通过向DBUF写数据来触发CLK,既然CLK没有输出波形,建议你用示波器检查一下MCU的MOSI管脚是不是有数据输出。
现在看起来是波特率设置的问题。
感谢各位回复,昨天SPI通讯调试通过,但是结果很不准确。先说一下之前的问题:
1、在进行通讯之前还是要先将UART映射到相应端口上,即设定PERCFG寄存器。
2、设定U1CSR寄存器,确定操作模式。如果做SPI的话,这里似乎只要关心bit7、bit5、bit2和bit1就行了。
3、设定U1BAUD寄存器,确定用于波特率的U1BAUD_M,参看手册中波特率那一节
4、设定U1GCR寄存器,去顶用于波特率的U1GCR_E、时钟极性和相位。
对于ADS7822而言,因为它没有Din(对MCU而言是MOSI),所以可以不考虑bit5的ORDER设定,目前我是这么认为的。我最终设定的是19200.
5、拉低CS
6、然后向UxDNUF写值(比如0x66,这个值在示波器里是个方波)以触发CLK——ADS7822靠CLK脉冲触发发送数据,只要CLK上有脉冲,即发送数据。
7、判断UxTX_BYTE,确定发送完成,读取UxDBUF。
这里注意,对于ADS7822而言,MCU是主设备,所以CC2530寄存器U1CSR的UxRX_BYTE没有意义。
在手册里UxRX_BYTE的说明是当MCU昨从设备时有意义的。
8、重复步骤6、7的操作。
9、拉高CS
以上是我认为的SPI通讯查询方式的完整过程,此前的问题大概是因为没有注意与波特率相关的U1BAUD_M和U1GCR_E的设定,造成CLK没有输出。但是只是猜测,没有再去确认。如果谁有类似的情况,可以在回复中说明。