以上是F28035 I2C介面與BQ32002連接電路圖
問題1:先行測試I2C LoopBack自收自發功能,Slave Address位置 信號設定0x003F,使用示波器量測信號如上圖為0x007F不正確DATA資料卻能自發自收成功。
問題2: 相同Slave Address位置信號0x003F再一次發送資料 透過示波器量測SDA與SCL波型呈現下圖所示,兩個波型呈現相同現象,但是DATA資料卻能自發自收成功。感覺像是SDA與SCL短接在一起,使用三用電表量測發現確實短接,解決方式只要將板子電源關掉重新啟動便不會短接,但是只要使用I2C LoopBack自收自發功能發送第一筆資料後SDA與SCL就會短接,請問原因為何?
問題3:如國連續使用相同Slave Address位置 發送資料會得到下圖波型,位置資訊的波型都無法判讀,DATA資料卻也能自發自收成功不知其原因
懇請幫助。
附上程式代碼。
void InitI2CGpio()
{
EALLOW;
/* Enable internal pull-up for the selected pins */
// Pull-ups can be enabled or disabled disabled by the user.
// This will enable the pullups for the specified pins.
// Comment out other unwanted lines.
// GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0; // Enable pull-up for GPIO28 (SDAA)
// GpioCtrlRegs.GPAPUD.bit.GPIO29 = 0; // Enable pull-up for GPIO29 (SCLA)
GpioCtrlRegs.GPBPUD.bit.GPIO32 = 0; // Enable pull-up for GPIO32 (SDAA)
GpioCtrlRegs.GPBPUD.bit.GPIO33 = 0; // Enable pull-up for GPIO33 (SCLA)
/* Set qualification for selected pins to asynch only */
// This will select asynch (no qualification) for the selected pins.
// Comment out other unwanted lines.
// GpioCtrlRegs.GPAQSEL2.bit.GPIO28 = 3; // Asynch input GPIO28 (SDAA)
// GpioCtrlRegs.GPAQSEL2.bit.GPIO29 = 3; // Asynch input GPIO29 (SCLA)
GpioCtrlRegs.GPBQSEL1.bit.GPIO32 = 3; // Asynch input GPIO32 (SDAA)
GpioCtrlRegs.GPBQSEL1.bit.GPIO33 = 3; // Asynch input GPIO33 (SCLA)
/* Configure I2C pins using GPIO regs*/
// This specifies which of the possible GPIO pins will be I2C functional pins.
// Comment out other unwanted lines.
// GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 2; // Configure GPIO28 for SDAA operation
// GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 2; // Configure GPIO29 for SCLA operation
GpioCtrlRegs.GPBMUX1.bit.GPIO32 = 1; // Configure GPIO32 for SDAA operation
GpioCtrlRegs.GPBMUX1.bit.GPIO33 = 1; // Configure GPIO33 for SCLA operation
EDIS;
}
void i2c_init(void){
/************I2C LOOPBACK INIT****************/
EALLOW;
SysCtrlRegs.PCLKCR0.bit.I2CAENCLK = 1;
I2caRegs.I2COAR=0x003F; //7-bit addressing
I2caRegs.I2CMDR.bit.IRS = 0;
I2caRegs.I2CMDR.bit.DLB=1;
I2caRegs.I2CPSC.all = 5; // 7M <= 60M/(PSC+1) <=12M
I2caRegs.I2CCLKL = 7;
I2caRegs.I2CCLKH = 8;
I2caRegs.I2CMDR.bit.IRS = 1;
EDIS;
/************I2C LOOPBACK INIT***************END*/
}
void I2C_WriteData(unsigned char data)
{
I2caRegs.I2CSAR = 0x003F;
I2caRegs.I2CMDR.bit.MST = 1;
I2caRegs.I2CMDR.bit.TRX = 1;
I2caRegs.I2CMDR.bit.STT = 1;
I2caRegs.I2CMDR.bit.STP = 1;
while(I2caRegs.I2CSTR.bit.BB!=1);
I2caRegs.I2CDXR = data;
}
unsigned char I2C_ReadData()
{
unsigned char data;
I2caRegs.I2CMDR.bit.TRX = 0;
I2caRegs.I2CMDR.bit.STT = 1;
I2caRegs.I2CMDR.bit.STP = 1;
while(I2caRegs.I2CSTR.bit.RRDY!=1);
data = I2caRegs.I2CDRR&0x00ff;
return data;
}
void main(void) {//�D�{��
Hardware(); //�w���l��
firmware(); //�����l��
DELAY_US(20000);
while(1){
switch(TestCounter){
case 1: {
I2C_WriteData('A');
testdata=I2C_ReadData();
TestCounter=0;
break;
}
case 2: {
I2C_WriteData('5');
testdata=I2C_ReadData();
TestCounter=0;
break;
}
}
}


