簡體   English   中英

使用xc8編譯器的pic16f1704的I2C通信

[英]I2C communication of pic16f1704 using xc8 compiler

我正在使用PIC16f1704單片機,我的編譯器是xc8。 我一直在嘗試獲取地址為0x00的控制器的I2C通信。 我的SCL引腳為RC0,SDA引腳為RC1。 我發現xc8編譯器的內置函數可與pic16一起使用。 我根據數據表編寫了以下代碼。 但是編譯代碼后我無法獲得SCL和SDA波形。

請查看我的代碼是否正確,並讓我知道我哪里出錯了。

#include<xc.h>
#pragma config FOSC=INTOSC, PLLEN=OFF, MCLRE=ON, WDTE=OFF
#pragma config LVP=OFF, CLKOUTEN=OFF
#define SCL     TRISC0
#define SDA     TRISC1
#define SCL_IN  RC0    
#define SDA_IN  RC1
void init()
{
    SDA = SCL = 1;
    SCL_IN = SDA_IN = 1;    //SDA & SCL at high state
}
void i2c_start(void)
{
    SDA = 1;             // i2c start bit sequence
    SCL = 1;
    _delay(10000);
    SDA = 0;
    SCL = 1;
    _delay(10000);
}
void i2c_stop(void)
{
    SDA = 0;             // i2c stop bit sequence
    _delay(10000);
    SCL = 1;
    _delay(1000);
    SDA = 1;
   _delay(10000);
}
void I2CWait()
{
    while ((SSPCON2 & 0x1F ) || ( SSPSTAT & 0x04 ) );
}

void main()
{
    OSCCONbits.SCS = 0x02; //set the SCS bits to select internal oscillator block
    OSCCONbits.IRCF = 0x0F; //set OSCCON IRCF
    BAUD1CONbits.BRG16=0;  //BRGH IS NOT VALID IN SYNCHRONOUS TRANSMISSION
    SPBRGH = 0X00;
    SPBRGL = 0X19;
    SLRCONC = 0xff;     //Slew rate IS LIMITED
    ANSELC = 0x00;      //Digital mode is selected
    SSPCLKPPS = 0x10;
    SSPDATPPS = 0X11;   //PPL for input pins
    RC0PPS = 0X10;
    RC1PPS = 0X11;      //PPL for output pins
    SSPCONbits.SSPM0=0;
    SSPCON1bits.SSPM1=0;
    SSPCON1bits.SSPM2=0;
    SSPCON1bits.SSPM3=1;    //selecting I2C master mode
    SSP1STATbits.SMP=1;    //SLEW RATE CONTROL
    SSP1STATbits.CKE=1;   //CLOCK EDGE SELECT BIT
    SPEN=1;
    ACKEN=1;
    SSPCON1=0X28;          //sync. serial port enable bit is set along with I2C mastermode
    SSPADD=0X27;           //calculated value
    GIE=1;
    PIE1=1;
    TXIE=1;
    init();
    SEN=1;               //start enable
    i2c_start();
    I2CWait();
    _delay(10000);
    SSPBUF=0X00;
    _delay(10000);
    PEN=1;                 //stop enable
    i2c_stop();
}

另外,請參見啟動條件需要進行此類初始化。

void i2c_start(void)
{
    SDA = 1;             // i2c start bit sequence
    SCL = 1;
    _delay(10000);
    SDA = 0;
    SCL = 1;
    _delay(10000);
}

我認為沒有必要。當SEN(啟動啟用)位置1時,控制器將SDA驅動為低電平,而SCL保持為高電平。

你說 :

我認為沒有必要。當SEN(啟動啟用)位置1時,控制器將SDA驅動為低電平,而SCL保持為高電平。

你是對的。 但是,不僅對於啟動條件,而且對於重復的啟動,停止等……您都不必自己直接控制SCL和SDA引腳(即使在初始化功能中,也只需將方向設置為輸入)。

啟動條件示例:

void i2c_start(void)
{
SSPCON2.SEN = 1;//start condition generation
while(!PIR1.SSPIF);//wait until MSSP has finished
PIR1.SSPIF = 0;//clear the flag
}//at the exit of the function, start condition is complete

Microchip未正確使用“啟動啟動條件”一詞:它不啟動啟動條件,但會生成啟動條件...

因此,您不必自己編寫SCL和SDA引腳,也無需使用延遲。 您只需要寫入用於條件生成的正確位(SEN,RSEN,PEN)或緩沖區(SSPBUF),然后等待SSPIF位來完成操作即可。

生成重復的開始和停止條件的方法相同。

您可以在數據表的第318頁中找到有關i2c主模式傳輸的完整信息。

希望能對您有所幫助,問候。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM