[英]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.