IIC通信
IIC總線是雙向、二線制、同步串行總線,是一種多向控制總線,即多個芯片可以連接到同一個總線結構下,每個芯片都可以作爲實時數據傳輸的控制源。
PCF8591芯片:
PCF8591:模數/數模轉換芯片,是一個單片集成、單獨供電、低功耗、8-bit CMOS數據獲取器件,具有4個模擬輸入、1個模擬輸出和一個串行IIC總線接口。原理圖如下:
1個模擬輸出:AOUT引腳,接在外部排針OUT上(比賽沒有涉及過DA輸出);
4個模擬輸入:AIN0接在外部排針(可以由外部輸入模擬信號),AIN1接在光敏電阻,AIN2接在LM324放大器,AIN3接在滑動變阻器Rb2,比賽沒有使用過AIN0和AIN2。光敏電阻和滑動變阻器原理圖如下:
如何確定使用的是IIC總線系統的PCF8591芯片——發送PCF8591的有效地址到器件(發送的第一個字節)
即
IIC_SendByte(0x90); //寫
或
IIC_SendByte(0x91); //讀
緊接着發送控制字到PCF8591 將被存儲在控制寄存器,用於控制器件功能。(發送的第二個字節)
控制寄存器的高半字節用於允許模擬輸出,和將模擬輸入編程爲單端或差分輸入。低半字節選擇一個由高半字節定義的模擬輸入通道。(見芯片手冊)通道3捕獲模擬信號輸入:0X03;允許模擬信號輸出:0X40。
讀模式的總線協議,A/D轉換:
即
uchar AD_Read(uchar add)
{
uchar temp;
//IIC寫
IIC_Start();
IIC_SendByte(0X90);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_Stop();
//IIC讀
IIC_Start();
IIC_SendByte(0X91);
IIC_WaitAck();
temp=IIC_AckByte();
IIC_Stop();
//返回temp值
return temp;
}
寫模式的總線協議,D/A轉換:
即
void AD_Write(uchar dat)
{
IIC_Start();
IIC_SendByte(0X90);
IIC_WaitAck();
IIC_SendByte(0X40);
IIC_WainAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
綜上讀寫程序,我們可以總結出,使用PCF8591芯片的步驟:
1.開啓IIC;2.發送PCF8591的寫有效地址;3.發送控制字確定輸入或輸出地址;4.如果需要寫入數據,則控制字確定的是模擬輸出模式,緊接着寫入數據;如果需要讀出數據,則控制字確定的是從通道0~3之一捕獲模擬信號輸入,關閉並重新開啓IIC,發送PCF8591的讀有效地址,通過IIC獲取數據。5.關閉IIC,如果是讀取數據則需返回值。