昨天写的博客,对发送命令,及返回ACK介绍的不太清楚,今天着重介绍一下。
1.发送命令的时序,格式
发送的用户命令都列在下面的表中:
共有10种命令,分别如下:
NULL:空名令,啥都不干,设备字为0000h,返回的是状态STATUS。
RESET:软件复位,设备字为0011h,返回的是READY。
STANDBY:进入低功率待机模式。设备字为0022h,返回0022h。
WAKEUP:将设备从待机模式唤醒。设备字为0033h,返回0033h。
LOCK:将接口至于锁定状态,除了NULL,RREGS,UNLOCK命令外,其余的命令,全部忽略。设备字为0555h。返回0555h。
UNLOCK:将设备从POR(上电复位状态)或锁定的状态解锁。命令字为0655h。返回0655h。
RREG:读一个寄存器。命令字为(001a aaaa nnnn nnnn)其中a aaaa为寄存器的地址,nnnn nnnn 为00h。返回的应该是寄存器的值。
RREGS:读多个寄存器。从地址a aaaa开始读取(nnnn nnnn +1)寄存器。
WREG:将地址为a aaaa的寄存器的值置为dddd dddd 。返回刷新后的寄存器值。
WREGS:从地址a aaaa开始写(nnnn nnnn + 1)个寄存器。 需要其他设备字来将数据(dddd dddd)发送到寄存器地址(a),并将数据(eeee eeee)发送到寄存器地址(a + 1)。 每个设备字包含两个寄存器的数据。 数据帧大小扩展了(n / 2)个设备字,以允许完成命令。返回010a aaaa_nnnn_nnnn.
着重强调一点,命令字位于设备字的MSB也就是高位,命令状态响应位于DOUT中第一个设备字的MSB。我是用的设备字的长度为24bit,剩下的8为全都补0.
命令,及响应的时序图如图1所示:
从这张图中可以看出,前一帧发送的命令,在下一帧才能得到响应。
我用到的并非上图中连续发送命令的方式,我是等到当前发送的命令收到响应后,才发送下一个命令。图2是我仿真的波形。
2 寄存器
2.1 CLK1: Clock Configuration 1 Register (address = 0Dh)
该寄存器描述如图3所示:
CLKSRC:ADC时钟源,我选择SCLK,置为1.
Reserved:这3bit全置为0.
CLK_DIV[2:0]:其实这里我不需要配置,因为我没有使用外部时钟,所以全置为0.
Reserved:置为0.
于是写该寄存器的命令字为24’h4d8000
这里我补充一下什么是 fICLK 什么是 fCLKIN,具体的如图4所示:
这张图一目了然,相应的配置遵循以下公式:
f I C L K = f C L K I N C L K _ D I V f_{ICLK}=\frac{f_{CLKIN}}{CLK\_DIV} fICLK=C