解析PCF8591的IIC信号
e小白网址:www.e-xiaobai.com
1.PCF8591模块原理图及引脚定义

2.PCF8591的IIC通讯地址

模块上A2,A1,A0都连接GND,那么PCF8591的地址/写是0X90,地址/读是0x91。
3.PCF8591的控制字节


由此可知,读取1通道的AD值的控制字节为0x41or0x01;DA输出的控制字节为0x4?(此时“?”可以表示0,1,2,3,因为是DA输出与AD输入无关,一般直接写0x40即可)
4.PCF8591的读时序

5.PCF8591的写时序

6.代码
6.1读AD
//channel可取0x00,0x01,0x02,0x03或0x40,0x41,0x42,0x43
u8 ADCconversion(u8 channel)
{
u8 data;
PCF8591_IIC_Start(); //发送IIC开始信号
PCF8591_IIC_Send_Byte(0x90); //IIC发送一个字节
PCF8591_IIC_Wait_Ack();
PCF8591_IIC_Send_Byte(channel);
PCF8591_IIC_Wait_Ack();
PCF8591_IIC_Start();
PCF8591_IIC_Send_Byte(0x91);
PCF8591_IIC_Wait_Ack();
data=PCF8591_IIC_Read_Byte(0); //IIC读取一个字节
PCF8591_IIC_Stop(); //发送IIC停止信号
return(data);
}
下图为逻辑分析仪解析的IIC读时序(channel的值为0x03):


其中,0XB0为读取到的AD值,转化为10进制为176,与OLED显示的数字一致。
6.2写DA
//DA
//V的范围是0-5
void DACconversion(float V)
{
float a;
a=(u8)(V*255/5);
PCF8591_IIC_Start(); //发送IIC开始信号
PCF8591_IIC_Send_Byte(0x90); //IIC发送一个字节
PCF8591_IIC_Wait_Ack();
PCF8591_IIC_Send_Byte(0x40);
PCF8591_IIC_Wait_Ack();
PCF8591_IIC_Send_Byte(a);
PCF8591_IIC_Wait_Ack();
PCF8591_IIC_Stop(); //发送IIC停止信号
}
下图为逻辑分析仪解析的IIC写时序(V为3.5):

其中,0XB2为输出电压的数字值。