Hi,
I use BQ7694003 with i2c interface,but I found that BQ7694003 i2c interface will not work after write or read 1~2 byte to BQ7694003 .Many Thanks for your answer!
Driver as follows:
#include "i2c.h"
#include "derivative.h" /* include peripheral declarations */
void i2c0_init(void){
SIM_SCGC |= SIM_SCGC_I2C0_MASK; //Enable Clock Gate
I2C0_C1 = 0x00; //Disable I2C0 for configuration
I2C0_S1 |= I2C_S_IICIF_MASK; //Set 1 to Clear Interrupt Flag
SIM_PINSEL0 &= ~SIM_PINSEL_I2C0PS_MASK; //Configure I2C Pin to PTA2,PTA3
PORT_PUE0 |= 0x0c; //Enable Internal Pull-Up for I2C
I2C0_A1 = 0x02; //If I2C0 is used as Slave, the address is 0b0000_0010
I2C0_F = 0x14; //BusClock = 8MHz, I2C0 Baud Rate = 100kbs
I2C0_C1 |= I2C_C1_IICEN_MASK; //Enable I2C0
I2C0_C1 &= ~I2C_C1_TXAK_MASK; //Clear TXAX. This function is to set the I2C0 as Master
}
INT8U I2C0_read1(INT8U DeviceAddr, INT8U AccessAddr, INT8U *RdData){
INT8U reWait;
I2C0_C1 |= I2C_C1_TX_MASK; //Set Master to Transmit Mode
//I2C0_FLT |= I2C_FLT_SHEN_MASK;
if((I2C0_S1 & I2C_S_BUSY_MASK)==0){
I2C0_C1 |= I2C_C1_MST_MASK; //Start Signal
}else{
I2C0_C1 |= I2C_C1_RSTA_MASK; //Restart Signal
}
I2C0_D = DeviceAddr & 0xFE; //Device Address with Write
if(I2C0_wait('T')){
return 1;
}
if(I2C0_wait('A')){
return 1;
}
I2C0_D = AccessAddr; //Register Address
if(I2C0_wait('T')){
return 1;
}
if(I2C0_wait('A')){
return 1;
}
//I2C0_C1 |= I2C_C1_RSTA_MASK; //Generate Restart
I2C0_C1 &= ~I2C_C1_MST_MASK; //Stop Signal
for(reWait=0; reWait<100; reWait++);
I2C0_C1 |= I2C_C1_TX_MASK; //Set Master to Transmit Mode
I2C0_C1 |= I2C_C1_MST_MASK; //Start Signal
I2C0_D = DeviceAddr | 0x01; //Device Address with Read
if(I2C0_wait('T')){
return 1;
}
if(I2C0_wait('A')){
return 1;
}
I2C0_C1 &= ~I2C_C1_TXAK_MASK; //Send ACK after Receive
I2C0_C1 &= ~I2C_C1_TX_MASK; //Set Master to Receive Mode
RdData[0] = I2C0_D; //Dummy Read
if(I2C0_wait('T')){
return 1;
}
//if(I2C0_wait('A')){
// return 1;
//}
I2C0_C1 &= ~I2C_C1_TXAK_MASK; //Send ACK after Receive
I2C0_C1 &= ~I2C_C1_TX_MASK; //Set Master to Receive Mode
RdData[0] = I2C0_D; //Read 1st Byte
if(I2C0_wait('T')){
return 1;
}
//if(I2C0_wait('A')){
// return 1;
//}
//I2C0_FLT |= (I2C_FLT_STOPF_MASK | I2C_FLT_STARTF_MASK);
I2C0_C1 &= ~I2C_C1_MST_MASK; //Stop Signal
RdData[1] = I2C0_D; //Read 2nd Byte
return 0;
}
INT8U I2C0_write1(INT8U DeviceAddr, INT8U AccessAddr, INT8U wrData){
I2C0_C1 |= I2C_C1_TX_MASK; //Set Master to Transmit Mode
//I2C0_FLT |= I2C_FLT_SHEN_MASK;
I2C0_C1 |= I2C_C1_MST_MASK; //Start Signal
I2C0_D = DeviceAddr & 0xFE; //Device Address with Write
if(I2C0_wait('T')){
return 1;
}
if(I2C0_wait('A')){
return 1;
}
I2C0_D = AccessAddr; //Register Address
if(I2C0_wait('T')){
return 1;
}
if(I2C0_wait('A')){
return 1;
}
I2C0_D = wrData; //Data Byte
if(I2C0_wait('T')){
return 1;
}
if(I2C0_wait('A')){
return 1;
}
I2C0_C1 &= ~I2C_C1_MST_MASK; //Stop Signal
//I2C0_FLT |= (I2C_FLT_STOPF_MASK | I2C_FLT_STARTF_MASK);
return 0;
}
INT8U I2C0_wait(INT8U AckOption){
INT16U waitTime;
for(waitTime=0; waitTime < 0x100; waitTime++){
if(AckOption=='A'){
if((I2C0_S1 & I2C_S_RXAK_MASK)==0)
return 0;
}else if(AckOption=='T'){
if((I2C0_S1 & I2C_S_IICIF_MASK)!=0){
I2C0_S1 |= I2C_S_IICIF_MASK;
return 0;
}
}//end_AckOption
}//end_waitTime_for
if(waitTime >= 0x100){
I2C0_C1 &= ~I2C_C1_MST_MASK; //Stop Signal
return 1;
}else{
return 0;
}//end_waitTime_if
}
INT8U I2C0_reset(void){
INT8U wkCounter, sclDelay;
I2C0_C1 = 0x00; //Disable I2C0 for configuration
GPIOA_PDDR |= (1<<3); //Configure SCL,PTA3 as output
//GPIOA_PDDR |= (1<<2); //Configure SDA,PTA2 as input
for(wkCounter=0; wkCounter<26; wkCounter++){
GPIOA_PTOR |= (1<<3);
for(sclDelay=0; sclDelay<100; sclDelay++);
}
i2c0_init();
if(I2C0_S1 == I2C_S_TCF_MASK){
return 0;
}else{
return 1;
}
}