大家好、
我的客户正在 F28035上开发 I2C EEPROM 代码。
当他们使用我们的示例代码时、一切都正常。 但是、如果它们切换到自己的 I2C 代码、SCL 和 SDA 都会始终保持高电平状态。
随附的文件是它们的 I2C 初始化和 I2C 函数代码:
void Class_I2CDrv::Drv_I2CInit (void)
{
Int16 i16_Temp;
I2caRegs.I2CSAR = 0x50;
I2caRegs.I2CPSC.all = 5;
I2caRegs.I2CCLKL = 10;
I2caRegs.I2CCLKH=5;
I2caRegs.I2CIER.ALL = 0x0000;
I2caRegs.I2CMDR.ALL = 0x0020;
I2caRegs.I2CFFTX.ALL = 0x6000;
I2caRegs.I2CFFRX.ALL = 0x2040;
m_i16_Pagewields = 32;
对于(i16_Temp = 0;i16_Temp < 10000;i16_Temp++)
{
asm (" rpt #99||nop");
}
}
void Class_I2CDrv::Drv_I2CRead (UINT16 U16_Addr、Int16 i16_Num、UINT16 *pDest)
{
int16 i16_Temp0、i16_Temp1、i16_Temp2、i16_DataCnt;
uint16 u16_DataL、u16_DataH;
i16_DataCnt = i16_Num << 1;
I2caRegs.I2CCNT = 2;
I2caRegs.I2CDXR = U16_Addr >> 8;
I2caRegs.I2CDXR = U16_Addr & 0x00FF;
I2caRegs.I2CMDR.ALL = 0x6620;
i16_Temp1 = 0;
while (I2cRegs.I2CSTR.bit.ARDY!= 1)
{
i16_Temp1++;
IF (i16_Temp1 > 5000)
{
返回;
}
I2caRegs.I2CCNT = i16_DataCnt;
I2caRegs.I2CMDR.ALL = 0x6C20;
i16_Temp2 = 0;
while (I2caRegs.I2CMDR.bit.STP==1)
{
i16_Temp2++;
IF (i16_Temp2 > 5000)
{
返回;
}
}
对于(i16_Temp0 = 0;i16_Temp0 < i16_Num;i16_Temp0 ++)
{
U16_DataH = I2caRegs.I2CDRR;
U16_DataL = I2caRegs.I2CDRR;
*(pDest + i16_Temp0)=(U16_DataH << 8)| U16_DataL;/
}
I2caRegs.I2CSTR.bit.ARDY = 1;
//test EEPROM read cnt
objFaultRecord.testEEPROMRad++;
if (objFaultRecord.testEEPROMRad>60000)
{
objFaultRecord.testEEPROMRead= 60000;
}
//test EEPROM read cnt
}
它们只是将读取函数放置在主 while (1)循环中、并且无法观察 IO 上的任何内容。
请帮助确定问题。
此致、
Brian