void init_fosc(void)
{
OSCCON = 0xF7;//16MHZ
}
void init_gpio(void)
{
ANSEL=0x00;//使能数字输入
ANSELH = 0x00;
PORTB=0;
LATB =0;
TRISB =0xFF;
PORTC=0;
LATC=0;
TRISC =0x00;
}
void init_i2c_master()
{
TRISB4 = input;
TRISB6 = input;
SSPCON1bits.SSPM0 = 0;
SSPCON1bits.SSPM1 = 0;
SSPCON1bits.SSPM2 = 0;
SSPCON1bits.SSPM3 = 1;// I2C Master mode ,clock=Fosc/(4*(SSPxADD+1))
SSPSTATbits.SMP = 0;//使能压摆率 400khz速度下
SSPADD = 0x09;//SCL CLOCK Frequency 400KHZ
SSPCON1bits.SSPEN = 1;
}
void i2c_master_tx(unsigned char tx_deviceaddr,unsigned char tx_resaddr,unsigned char tx_data)
{
PIR1bits.SSPIF = 0;//需要软件置0
SSPCON2bits.SEN = 1;//启动条件
while(SSPCON2bits.SEN == 1);//等启动条件完成 SEN由硬件清零
// PIR1bits.SSPIF = 1; 由硬件置1
SSPBUF = tx_deviceaddr;//从机设备地址
while(ACKSTAT); // ~ACK
while(PIR1bits.SSPIF == 0);
PIR1bits.SSPIF = 0;//需要软件置0
SSPBUF = tx_resaddr;//写命令的寄存器
while(ACKSTAT); // ~ACK
while(PIR1bits.SSPIF == 0);
PIR1bits.SSPIF = 0;
SSPBUF = tx_data;//写数据
while(ACKSTAT); // ~ACK
while(PIR1bits.SSPIF == 0);
PIR1bits.SSPIF = 0;
SSPCON2bits.PEN = 1;//Stop condition
}
|