📄 i2c.c
字号:
#define FOSC 48000000
#define I2Clock 400000
void i2c_idle(void);
void i2c_init(void);
void i2c_stop(void);
void i2c_start(void);
void i2c_restart(void);
unsigned char i2c_write(far ram unsigned char);
unsigned char i2c_read(unsigned char);
void i2c_init()
{
TRISBbits.TRISB0 =1;
TRISBbits.TRISB1 =1;
PORTBbits.RB0 =1;
PORTBbits.RB1 =1;
SSPSTAT = 0;
SSPADD = (((FOSC/I2Clock)/0x04) -1);
SSPCON1 =0x28;
i2c_idle();
}
void i2c_start()
{
i2c_idle();
SSPCON2bits.SEN = 1;
while(SSPCON2bits.SEN);
}
void i2c_stop()
{
i2c_idle();
SSPCON2bits.PEN = 1;
while(SSPCON2bits.PEN);
}
unsigned char i2c_write(far ram unsigned char i2c_data)
{
i2c_idle();
PIR1bits.SSPIF = 0;
SSPBUF = i2c_data;
while(!PIR1bits.SSPIF);
if(SSPCON2bits.ACKSTAT)
return 0;
else
return 1;
}
unsigned char i2c_read( unsigned char ack)// 0:ACK 1:NACK
{
unsigned char rcv_data;
i2c_idle();
PIR1bits.SSPIF = 0;
SSPCON2bits.RCEN = 1;
while(!PIR1bits.SSPIF);
rcv_data = SSPBUF;
if(!ack)
SSPCON2bits.ACKDT = 0;
else
SSPCON2bits.ACKDT = 1;
SSPCON2bits.ACKEN = 1;
while(SSPCON2bits.ACKEN);
return rcv_data;
}
void i2c_restart()
{
i2c_idle();
SSPCON2bits.RSEN = 1;
while(SSPCON2bits.RSEN);
}
void i2c_idle()
{
while(SSPSTATbits.R_W);
while((SSPCON2 & 0x1F)!= 0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -