2023 05月17日
作者: 小白哥
  • 浏览: 266
  • 收藏:0
  • 点赞:0
解析PCF8591的IIC信号

1.PCF8591模块原理图及引脚定义

1.png

2.PCF8591的IIC通讯地址

2.png

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

3.PCF8591的控制字节

1.jpg

2.jpg

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

4.PCF8591的读时序

3.jpg

5.PCF8591的写时序

4.jpg

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):

5.jpg

6.jpg

其中,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):

7.jpg

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


  

发表评论

评论列表


没有评论

筛选

文章分类

热门文章

企业招聘网址

2023-12-07  浏览:3018次

BC1.2协议介绍

2023-06-14  浏览:2923次

USB2.0速度识别

2023-10-23  浏览:1350次