蓝桥杯—PCF8591、IIC总线、EEPROM介绍

僤鯓⒐⒋嵵緔 提交于 2020-02-21 22:25:11

1、IIC总线相关介绍

  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)控制字节

   

 PCF8591上提供了4路模拟通道,根据需求进行选择,如选择通道3即发送控制字节:0x03;

 (4)A/D转换时序要求配置

   

 配置初始化函数

   这个是初始化的协议:分别是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:Device Address

   从图1上看,读数据地址为:0XA1;写地址为:0XA0

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!