如果学了前文看这个就容易了,这个操作来自于ADS1115的转换数据读取。
可以看到是一个16bit的结果,所以就要接收和拼接
这个就是转换的代码
读取ADC数据:
工作流程:
regValue = 1 << 15 | registerMap[CONFIG_ADDRESS];
将regValue
的第15位设置为1,同时保留reg
的当前配置。
意思是说,单次转换启动
寄存器的地址在这里
TI的设计是,把寄存器的数量先定义好
然后在控制的时候,先定位到数组
就是后面
|
是按位或操作,用于合并位。也可以说前面1<<15其实是位掩码。一计算就把配置寄存器的值修改了。
调用 sendI2CData 函数,将 regData 写入ADC的配置寄存器(CONFIG_ADDRESS)。
如果I2C通信失败(retStatus != false),函数返回0。
看这个,&,这个读取一个寄存器的位
在这里
这里就判断单次转换模式是不是启用
do-while 循环:
这是一个后测试循环,先执行循环体,再检查条件。
循环会一直执行,直到条件 !(regData[0] & 0x80) 为假(即 regData[0] & 0x80 为真)。
receiveI2CData(CONFIG_ADDRESS, regData, 2):
通过I2C通信从ADC的配置寄存器(CONFIG_ADDRESS)读取2字节数据,并存储到 regData 数组中。
regData[0] 是配置寄存器的高8位,regData[1] 是低8位。
if (retStatus != false):
如果I2C通信失败(retStatus 不为0),函数返回0,表示读取失败。
!(regData[0] & 0x80):
regData[0] & 0x80 是一个按位与操作,用于检查 regData[0] 的第7位(最高位)是否为1。
0x80 的二进制表示为 10000000,掩码用于提取第7位。
!(regData[0] & 0x80) 表示“如果第7位为0,则继续循环”。
代码里面一把都有转换完成标志:
因为我们不知道什么时候会完成转换所以有轮询机制:
调用 readSingleRegister 函数,从ADC的转换结果寄存器(CONVERSION_ADDRESS)读取数据。
这里面有个合并函数,因为读取回来两个字节
相信你认真学习我的文章一定学会了
将读取的值存储在 registerMap[CONVERSION_ADDRESS] 中。
将结果强制转换为 int16_t 并返回。
也就是说,读取了寄存器的单次结果,括号里面是地址。接着把这个数据存到寄存器MAP的转换寄存器的位置。
最后就是把寄存器了里面,转换寄存器的数据强壮的转换,这就是完整的ADC读取数据的过程。
很多人可能会问,这么复杂有什么用?
TI也推出了自己的精密转换库,学会一个:
就相当于学会多,这个投资值了,很新的库