一般MCU當Master使用I2C與Slave端的設備或IC溝通有兩種作法,
1. 硬體式: MCU本身已經有硬體I2C的架構, 在Microchip的MSSP包含SPI與I2C, 只需要作一些暫存器設定, 然後將資料丟到I2C buffer便可使用.
2. 軟體式: MCU本身沒有硬體式I2C的架構, 或是硬體式I2C的腳位不敷使用, 使用其他兩個Digital pin腳充當SDA與SCL, 不過I2C的Protocol是用軟體來控制的,
目前在c18中有提供software I2C protocol, 一般在C:\MCC18\src\pmc_common\SW_I2C
基本上可以從上述的.c檔去看SW I2C的Protocol 在c18中使用,
打開.c檔可以看到裡面的程式碼,
在sw_i2c.h中 (C:\MCC18\h)
有腳位的定義:
#define DATA_LOW TRISBbits.TRISB4 = 0; // define macro for data pin output
#define DATA_HI TRISBbits.TRISB4 = 1; // define macro for data pin input
#define DATA_LAT LATBbits.LATB4 // define macro for data pin latch
#define DATA_PIN PORTBbits.RB4 // define macro for data pin
#define CLOCK_LOW TRISBbits.TRISB3 = 0; // define macro for clock pin output
#define CLOCK_HI TRISBbits.TRISB3 = 1; // define macro for clock pin input
#define SCLK_LAT LATBbits.LATB3 // define macro for clock pin latch
#define SCLK_PIN PORTBbits.RB3
有functions的定義:
/***** FUNCTION PROTOTYPES FOR PIC18CXXX *****/
void SWStopI2C ( void );
void SWStartI2C ( void );
void SWRestartI2C ( void );
void SWStopI2C ( void );
signed char SWAckI2C( void );
signed char Clock_test( void );
unsigned int SWReadI2C( void );
signed char SWWriteI2C( auto unsigned char data_out );
signed char SWGetsI2C( auto unsigned char *rdptr, auto unsigned char length );
signed char SWPutsI2C( auto unsigned char *wrptr );
因為SDA與SCL的走線都必須接一個Pull high電阻,
經過測試,
DATA_LOW會使SDA接腳被拉 Low, 同時被設成是output,
DATA_HI會使SDA接腳被拉High, 同時被設成是input,
同理, CLOCK_LOW與 CLOCK_HI作用也是如此.
除了c18直接提供software I2C外, 另一個application note(AN997 Using the C18 Compiler to Interface I2C? Serial EEPROMs with PIC18 Devices)亦提供另一種software I2C的寫法, 請參考: http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en023776
不過由於每個slave端的設備或IC不一定是標準的I2C,
所以需要依實際裝況作調整 ~~~~