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資料卻也能自發自收成功不知其原因 

          懇請幫助。

附上程式代碼。

LOOPBACK.txt
Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX