以上是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; } } }