I2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。下面根据官方提供的库文件,介绍需要注意的函数有:
(1)void init_pcf8591(void)
void init_pcf8591(void)
{
i2c_start();
i2c_sendbyte(0x90);
i2c_waitack();
i2c_sendbyte(0x03); //ADC通道3
i2c_waitack();
i2c_stop();
operate_delay(10);
}
这个函数为PCF8591初始化函数,对于选择通道函数为i2c_sendbyte(),上述代码选择通道3。
最后两位配置选择哪个通道 ,其余位不用管。
(2)unsigned char adc_pcf8591(void)
unsigned char adc_pcf8591(void)
{
unsigned char temp;
i2c_start();
i2c_sendbyte(0x91);
i2c_waitack();
temp = i2c_receivebyte();
i2c_sendack(1);
i2c_stop();
return temp;
}
通过I2C总线提取ADC结果,此函数为ADC转化结果函数。可以直接调用。
2、PCF8591芯片
(1)原理图
PCF8591的功能包括多路模拟输入、内置跟踪保持、8-bit模数转换和8-bit数模转换。PCF8591的最大转化速率由I2C总线的最大速率决定。AIN0~AIN3:模拟信号输入端,A0~A2:引脚地址端,SDA、SCL:I2C 总线的数据线、时钟线。OSC:外部时钟输入端,内部时钟输出端,EXT:内部、外部时钟选择线,使用内部时钟时 EXT 接地,AGND:模拟信号接地。AOUT:D/A 转换输出端。
(2)地址字节
A2、A1、A0硬件接地为0;
最低位表示的是你要从IIC总线上读数还是写数据,1表示读,0表示写,故写地址为:0X90;读地址为:0X91;
(3)控制字节
这个是初始化的协议:分别是startIIC、(地址写)发送0x90、等待应答、发送控制字节(AD这里是选择通道的指令,如选择通道3,0x03)0x03、等待应答、(达到目的,没有后续的操作,直接停止总线)StopIIC。
配置转换数值函数
首先开始startIIC—发送读地址0X91—等待应答—读数值—返回给PCF8591表示收到—如果不在接受则要传参数1—StopIIC。
(5) A/D转换要求
D/A转换其实就是把数字信号转换成模拟信号输出,用单片机发数字通过D/A转换成电压输出,检测的方法可以用电压表测量。配置方面和D/A类似。
3、EEPROM使用
(1) AT24C02芯片原理图
管脚介绍:
AT24C02,可以掉电依旧保存上一次操作的数据,下次上电后接着运行。
(2)相关官方定义函数
向AT24C02(add)写入数据val。
void write_eeprom(unsigned char add,unsigned char val)
{
i2c_start();
i2c_sendbyte(0xa0);
i2c_waitack();
i2c_sendbyte(add);
i2c_waitack();
i2c_sendbyte(val);
i2c_waitack();
i2c_stop();
operate_delay(10);
}
向AT24C02(add)读出数据da。
unsigned char read_eeprom(unsigned char add)
{
unsigned char da;
i2c_start();
i2c_sendbyte(0xa0);
i2c_waitack();
i2c_sendbyte(add);
i2c_waitack();
i2c_start();
i2c_sendbyte(0xa1);
i2c_waitack();
da = i2c_receivebyte();
i2c_sendack(0);
i2c_stop();
return da;
}
其中写函数需要指定AT24C02的地址以及需要写入的数据,读函数要想取回写进的数据,需要从相同的地址里面读。
从图1上看,读数据地址为:0XA1;写地址为:0XA0;
作者:范飓飞