在驱动里,主机发读指令后没有等待从机应答,而是发送两个周期sda的高电平,这便成了错误的根源
实际现象就是差分输入测量正量程范围时,数值会跳到负量程取值区间。经过逻辑分析仪显现的时序找到了问题。
如下:ads1115数据格式
所以一个正值范围的数据,丢失最高位0以后,次高位可能为1,而主机会把它存放在最高位,所以使数据掉入错误的取值范围。且采集的第八位实际为从机释放sda等待应答的电平信号,该为读取恒定为1.而第八位由于从机不再发送数据。采集的全为1,导致测量精度也不够。且计算时除以变成65535而不是32767。实际计算如果读到的值是对的,可以取绝对值除以32767(或者乘2/65535)。
测量的电压值 = (采集到的正值数据)/(2/65535)*4.096 (注:4.096为设定的满量程电压FS)
若数值在负量程区间可以用绝对值计算,再根据实际使用选择是否添加符号:
测量的电压值 = (0xffff - 采集到的负值数据)/(2/65535)*4.096 (注:根据ads1115的设定,用0xffff - 采集的负值数据 就是该负值的绝对值。负值是以二进制补码形式存在 转换数据寄存器中)
对iic的理解,由与硬件原因决定了sda总线空闲时为高定平,主机从机只能控制是否拉低电平。所以当一方释放控制权等待另一方应答或传输的数据时。如果需要应答ack或发送的位为0就把总线电平拉低,否则便不对总线做任何操作,即非应答Nack为1.
这张图是否能帮助你理解为什么它的数据格式是以补码的形式展示?