2011年6月22日 星期三

DIY - PIC:C18 PIC18F4550 I2C 函數庫程式 (八十八)

DIY - PICC18 PIC18F4550 I2C 函數庫程式 ()

Microchip C18 有內置支持 PIC18F4550 I2C 外設介面函數庫模塊 (i2c.h),衹需要用包括 i2c 頭文件 ( )。然後再呼叫不同的功能,便可控制 I2C 外設介面。



功能 AckI2C (產生 I2C 匯流排應答條件) 
原型void AckI2C( void ); 
說明該函數產生I2C 匯流排應答條件。 
檔案名acki2c.c 
範例AckI2C; 

功能 CloseI2C (禁止 SSP 模組) 
原型void CloseI2C( void ); 
說明:該函數禁止SSP 模組。 
檔案名:closei2c.c 
範例:CloseI2C; 

功能 DataRdyI2C (I2C 緩衝區中是否有資料) 
原型unsigned char DataRdyI2C( void ); 
說明確定SSP 緩衝區中是否有資料可讀。 
返回值:如果SSP 緩衝區中有資料,為1;如果SSP 緩衝區中沒有資料,則為0 
檔案名:dtrdyi2c.c 
範例if (DataRdyI2C()) { var = getcI2C();} 

功能 getcI2C (I2C 匯流排讀取一個位元組) 
參見ReadI2C 

功能 getsI2C (從工作在主 I2C 模式的 I2C 匯流排上讀取一個固定長度的資料串) 
原型unsigned char getsI2C( unsigned char * rdptr, unsigned char length ); 
參數:rdptr - 指向用於存儲從I2C 器件所讀取資料的PICmicro RAM 的字元型指標。 
            length - I2C 器件讀取的位元組數。 
說明:該函數從I2C 匯流排上讀取一個預定義長度的資料串。 
返回值:如果所有位元組都發送完畢,為0 ;如果發生匯流排衝突,則為-1  
檔案名:getsi2c.c 
範例:unsigned char string[15]; getsI2C(string, 15); 

功能 IdleI2C (迴圈直到 I2C 匯流排空閒) 
原型void IdleI2C( void ); 
說明該函數檢查I2C 外設的狀態並且等待匯流排變為空閒。由於硬體 I2C 外設不允許佇列
衝匯流排序列,所以需要函數IdleI2C。在開始I2C 操作或者產生寫衝突之前, I2C 外設必須處於空閒狀態。 
檔案名:idlei2c.c 
範例IdleI2C 

功能 NotAckI2C (產生 I2C 匯流排無應答條件) 
原型:void NotAckI2C( void ); 
說明:該函數產生I2C 匯流排無應答條件。 
檔案名:noacki2c.c 
範例:NotAckI2C; 

功能 OpenI2C (配置SSP 模組) 
原型void OpenI2C( unsigned char sync_mode, unsigned char slew ); 
參數:sync_mode - 取下列值之一,在i2c.h 中定義:
SLAVE_7
I2C 從模式, 7 位元位址
SLAVE_10
I2C 從模式, 10 位元位址
MASTER
I2C 主模式

              slew - 取下列值之一,在i2c.h 中定義:
SLEW_OFF
100 kHz 模式下禁止壓擺率
SLEW_ON
400 kHz 模式下使能壓擺率
 
說明:OpenI2C函數把SSP模組重定到POR狀態,然後將模組配置為主/從模式及選擇的壓擺率。 
檔案名:openi2c.c 
範例:OpenI2C(MASTER, SLEW_ON); 

功能 putcI2C (I2C 匯流排寫一個位元組) 
參見WriteI2C 

功能 putsI2C (向工作在主模式或從模式的I2C 匯流排寫一個資料串) 
原型:unsigned char putsI2C( unsigned char *wrptr ); 
參數:wrptr - 指向要寫到I2C 匯流排的資料的指標。 
說明:該函數向I2C 匯流排寫一個資料串,直到出現空字元為止。不傳送空字元本身。該函可以工作在主模式或從模式。 
返回值:主 I2C 模式: 
                如果在資料串中遇到空字元,為0  
                如果從I2C 器件響應一個無應答Not Ack 信號,為-2  
                如果發生寫衝突,則為-3  
 
                從I2C 模式: 
                如果在資料串中遇到空字元,為0  
                如果主 I2C 器件響應一個終止資料傳送的無應答Not Ack 信號,為-2  
檔案名:putsi2c.c 
範例:unsigned char string[] = data to send; putsI2C(string); 

功能 ReadI2C / getcI2C (I2C 匯流排讀取一個位元組) 
原型unsigned char ReadI2C (void); 
說明該函數從I2C 匯流排上讀入一個位元組。 
返回值:從I2C 匯流排上讀取的資料位元組。 
檔案名:readi2c.c 
代碼示例: unsigned char value; value = ReadI2C(); 

功能 RestartI2C (產生 I2C 匯流排重複啟動條件) 
原型void RestartI2C( void ); 
說明:該函數產生 I2C 匯流排重複啟動條件。 
檔案名:rstrti2c.c 
範例:RestartI2C; 

功能 StartI2C (產生I2C 匯流排啟動條) 
原型void StartI2C( void ); 
說明該函數產生 I2C 匯流排啟動條件。 
檔案名starti2c.c 
範例StartI2C; 

功能 StopI2C (產生 I2C 匯流排停止條件) 
原型void StopI2C( void ); 
說明該函數產生 I2C 匯流排停止條件。 
檔案名stopi2c.c 
範例StopI2C; 

功能 WriteI2C / putcI2C (I2C 匯流排器件寫一個位元組) 
原型unsigned char WriteI2C( unsigned char data_out ); 
參數:data_out - 要寫到 I2C 匯流排器件的一位元組資料。 
說明:該函數向I2C 匯流排器件寫一位元組資料。 
返回值:如果寫入成功,為0 ;如果發生寫衝突,則為-1 
檔案名:writei2c.c 
範例:WriteI2C(a); 

下面是一個簡單的代碼示例, 該程式舉例說明了配置為 I2C 主通訊的SSP 模組, 及其和Microchip 24LC01B I2C 電可擦除記憶體之間的I2C 通訊。
#include "p18cxx.h"
#include "i2c.h"
unsigned char arraywr[] = {1,2,3,4,5,6,7,8,0};
unsigned char arrayrd[20];
//***************************************************
void main(void)
{
OpenI2C(MASTER, SLEW_ON);// Initialize I2C module
SSPADD = 9;                  //400kHz Baud clock(9) @16MHz
//100kHz Baud clock(39) @16MHz
while(1)
{
EEByteWrite(0xA0, 0x30, 0xA5);
EEAckPolling(0xA0);
EECurrentAddRead(0xA0);
EEPageWrite(0xA0, 0x70, arraywr);
EEAckPolling(0xA0);
EESequentialRead(0xA0, 0x70, arrayrd, 20);
EERandomRead(0xA0,0x30);
}
}

資料來源:Microchip

2011 06 22 天氣報告 
氣溫:26.7 @ 22:00 
相對濕度:百分之94% 
天氣:雨 
三號強風信號 ( 2011 06 22 05 45 )

相關網頁

沒有留言:

張貼留言