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上看,讀數據地址爲:0XA1;寫地址爲:0XA0;