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.

透過I2C介面通信TI BQ32002 ,前置I2C LoopBack通信調試疑問 ?

Other Parts Discussed in Thread: BQ32002

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