一般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,

所以需要依實際裝況作調整 ~~~~

 

 

 

 

 

 

 

 

 

 

 

 

arrow
arrow
    創作者介紹
    創作者 fishark 的頭像
    fishark

    魚的方舟圖形語言的世界 - LabVIEW & Arduino & Python工作室 - 新網站https://labview-tech.blogspot.com/

    fishark 發表在 痞客邦 留言(0) 人氣()