我想请您解释一下我的代码的这一部分。我不确定它到底在做什么。这是示例代码,我想理解它。原始代码的目的应该是在流模式下从ADC获取数据。这应该与形成原始数据有关。谢谢。
#define CH_DATA_SIZE 6
uint8_t read_buf[CH_DATA_SIZE];
uint32_t adc_data;
TI_ADS1293_SPIStreamReadReg(read_buf, count);
adc_data = ((uint32_t) read_buf[0] << 16) | ((uint16_t) read_buf[1] << 8)
| read_buf[2];
答案 0 :(得分:1)
我将跳过变量声明,因为我将在说明书的其余部分中引用它。
代码从这一行开始:
TI_ADS1293_SPIStreamReadReg(read_buf, count);
从Google搜索中,我假设您具有this file中的此功能。如果是此功能,它将从该模块读取三个寄存器(请参见 8.6寄存器映射,数据寄存器DATA_CHx_ECG
的长度为3个字节,即{{1 }}变量。
执行此功能后,您将在count
变量的前三个字节中保存ECG数据,但是由于量化值是24位值,因此您需要一个24位值。
由于C语言中没有read_buf
(并且我不知道其他语言),因此我们采用下一个可能的大小,即uint24_t
来声明uint32_t
变量。
现在,以下代码确实从我们从ADC读取的3个字节中重建了单个24位值:
adc_data
从数据表和adc_data = ((uint32_t) read_buf[0] << 16) | ((uint16_t) read_buf[1] << 8)
| read_buf[2];
中,我们知道该函数确实按地址的顺序读取值,在这种情况下,高字节,中字节和低字节分别以此顺序读取( TI_ADS1293_SPIStreamReadReg
,read_but[0]
和read_buf[1]
)。
要重建24位值,代码会将值偏移适当的偏移量:read_buf[2]
从第23位移至16,从而偏移了16位,read_buf[0]
从第15位移至8,因此偏移了8位和read_buf[1]
从7到0移位了0位(此移位未表示)。我们将这样表示它们(read_buf[2]
,0xAA
和0xBB
是显示发生情况的示例值):
0xCC
要组合三个移位的值,代码使用按位或read_buf[0] = 0xAA => read_buf[0] << 16 = 0xAA0000
read_buf[1] = 0xBB => read_buf[0] << 8 = 0x00BB00
read_buf[2] = 0xCC => read_buf[0] << 0 = 0x0000CC
的结果是:
|
现在您的ADC读数为24位。