藍橋杯—PCF8591、IIC總線、EEPROM介紹

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)地址字節

   \bullet A2、A1、A0硬件接地爲0;

   \bullet 最低位表示的是你要從IIC總線上讀數還是寫數據,1表示讀,0表示寫,故寫地址爲:0X90;讀地址爲:0X91;

(3)控制字節

   \bullet PCF8591上提供了4路模擬通道,根據需求進行選擇,如選擇通道3即發送控制字節:0x03;

 (4)A/D轉換時序要求配置

   \bullet 配置初始化函數

   這個是初始化的協議:分別是startIIC、(地址寫)發送0x90、等待應答、發送控制字節(AD這裏是選擇通道的指令,如選擇通道3,0x03)0x03、等待應答、(達到目的,沒有後續的操作,直接停止總線)StopIIC。

  \bullet 配置轉換數值函數

  首先開始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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章