最近调测I2C遇到一些问题,对比了例程和手册没找到合适的答案,请教一下:
1. I2C控制器使能之后发现CLK速率示波器实测并不是如标称的一样是100k or 400k而是几十mhz的速度....代码如下:
I2CMasterInitExpClk(I2C0_BASE,SysCtlClockGet(), false);
I2CMasterEnable(I2C0_BASE);
我的SysCtlClockGet()是120MHZ,查看手册发现MTPR值越大I2C时钟会越小,于是将120M直接*20后配进去发现I2C的CLK能降到60kbps
这个现象感觉特别诡异啊...
2. I2C在master连续写入+读取的过程中会出现丢失读周期或者写周期的情况....我试过很多次,只有在读写之间加延时才能解决这个问题,不知道是不是用法的错误,我阅读过TI给的示例代码...里面都是通过查询busy状态来等待的...不加就丢...完全无解...
while(1)
{
ROM_I2CMasterSlaveAddrSet(I2C3_BASE, SLAVE_ADDRESS, false);
ROM_I2CMasterDataPut(I2C3_BASE, reg_addr);
ROM_I2CMasterControl(I2C3_BASE, I2C_MASTER_CMD_BURST_SEND_START);
while(ROM_I2CMasterBusBusy(I2C3_BASE))
{
}
while(ROM_I2CMasterBusy(I2C3_BASE))
{
}
//这里如果不加200us时延就会出现读周期丢失的情况....
ROM_I2CMasterSlaveAddrSet(I2C3_BASE, SLAVE_ADDRESS, true);
ROM_I2CMasterControl(I2C3_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);
while(ROM_I2CMasterBusBusy(I2C3_BASE))
{
}
while(ROM_I2CMasterBusy(I2C3_BASE))
{
}
G_u32Data = ROM_I2CMasterDataGet(I2C3_BASE);
//这里如果不加200us时延就会出现写周期丢失的情况....
}