### 注意事项
1、芯片的从机地址是根据硬件的的ADDR进行决定的,详细见官方手册P18
2、他给的是最小时序要求,不是最长时序要求,也就是你SCL和SDA边沿变换的时间是可以长达ms等
3、读取数据完全按照官方手册来(P12),(我这里是用模拟IIC口来实现的,因为单片机自带的IIC出不了相应时序图)
所以这里我再啰嗦写一下读数据过程:
1:写从机:起始、从机地址(根据硬件决定)、ACK(第8位数据低电平是写,高电平是读,读取是先写再读)(第8位8:0)
2:写寄存器:从机寄存器地址(见手册末尾寄存器章节)、ACK、结束位(这里才发送结束信号)
3、读从机:起始、从机地址(根据硬件决定)(第8位8:1)、ACK
4、接收两个数据然后结束
写数据过程仔细看手册就行,注意第8位,数据是从机地址还是从机寄存器地址、ACK的来源、结束位
4、经过我的测试
AIN2:0xE583(E才代表选择的是哪个采样通道,根据手册末尾寄存器的详解来算)
AIN1:0xDxx
AIN0:0x8xx
5、电压值 = 采样值/32768*自定义倍率(改变相应寄存器的相应位)
6、寄存器不是上电复位,如果需要复位的话先发送0x0通用呼叫地址,然后发送0x0006复用地址
### 伪码
#### 读
/* Frame 1 */
IIC_Start();
IIC_Send_Byte(0x90);
IIC_Wait_Ack();
/* Frame 2 */
IIC_Send_Byte(reg_addr);
IIC_Wait_Ack();
IIC_Stop();
/* Frame 3 */
IIC_Start();
IIC_Send_Byte(reg_addr);
IIC_Wait_Ack();
/* Frame 4 */
IIC_Read_Byte(); // 内部有个主机发送应答信号
/* Frame 5 */
IIC_Read_Byte(); // 内部有个主机发送应答信号
IIC_Stop();
#### 写
/* Frame 1 */
IIC_Start();
IIC_Send_Byte(0x91);
IIC_Wait_Ack();
/* Frame 2 */
IIC_Send_Byte(reg_addr);
IIC_Wait_Ack();
/* Frame 3 */
IIC_Send_Byte(data1);
IIC_Wait_Ack();
/* Frame 4 */
IIC_Send_Byte(data0);
IIC_Wait_Ack();
IIC_Stop();
SGM58031示例
最新推荐文章于 2023-07-20 12:02:46 发布