This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
以上是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; } } }
为更加有效地解决您的问题,我们建议您将问题发布在E2E英文技术论坛上https://e2e.ti.com/support/microcontrollers/c2000/f/171,将由资深的工程师为您提供帮助。我们的E2E英文社区有TI专家进行回复,并得到全球各地工程师的支持,分享他们的知识和经验。