I2C初始化中(P1423)
The transaction is ended by setting the STOP bit in theI2CMCSregister.
然后我点到Register Map
找到0x004 I2CMCS RW 0x0000.0020 I2C Master Control/Status P1427
这里写的是RW
进入P1427
里面却是Read-Only Status Register ,怎么setting the STOP bit , 而且,我在I2CMCS register也找不到STOP bit?是我英语不好弄错了吗?
Maka Luo:
Shuai Wang16
I2C初始化中(P1423)
The transaction is ended by setting the STOP bit in the I2CMCS register.
然后我点到Register Map
找到0x004 I2CMCS RW 0x0000.0020 I2C Master Control/Status P1427
这里写的是RW
进入P1427
里面却是Read-Only Status Register ,怎么setting the STOP bit , 而且,我在I2CMCS register也找不到STOP bit?是我英语不好弄错了吗?
qz boy:
回复 Maka Luo:
TM4C129 I2CMCS 问题。
故事 使用TM4C129 10组I2C 作为Master,每组上面接不通slave,通过Address 区分
1:用TI提供的I2cm_drv.c 里面的I2CMInit来例化每组I2C;用I2CMWrite,I2CMRead来操作读写
2:一开始10组I2C都能正常读写(暂时认为I2C这边是OK的)
3:项目中有用到USB,把USB加入进来之后,有测到USB在枚举过程的时候,I2C Master 可能就随机的出现Clk 敲不出来。à第一个时间认为USB的中断把I2C影响了,把USB ISR prority 设定为7 最低,发现问题同样还存在。
4:出现了3的状况,开始debug I2C;用压力测试的方式 ,在systemclk initial 跟i2c initial 后就做一个循环I2C的读写,如下
While(1)
{
For(u8i=5;u8i<100;u8i++)
{
I2CMWrite(port ,u8i,buffer,u8len);
UARTprintf(“address=0x%x\n”,u8i); }
}
5:由于Slave没有接这么多设备,所以一定有Address Nack的状况,测试发现当出现 Address Nack的时候 Master 之后就敲不出Clk了(Nack后,产了Stop 然后SDA=1 SCL=1),但是程序并没有卡在网络上写的MasterBusy 或者MasterBusBusy,里面的打印有正常在跑
6:用单步去看I2C的状况,在I2CMIntHandler里面ui32Status= HWREG(psInst->ui32Base + I2C_O_MCS);
打印UARTprintf("g=0x%x,P=0x%x\n",ui32Status,psInst->ui8State );
发现Nack 进入中断的时候ui32Status=0x20,P=0x2;表示这个是IDLE,而实际上应该是ui32Status=0x26,P=0x2;导致后面写是错误。
I2cm_drv.c里面太多了,debug的时候再I2CMIntHandler函数里面的ui32Status= HWREG(psInst->ui32Base + I2C_O_MCS);之后加上
if(ui32Status==0x20)
{
ui32Status=0x26; }
这样clk就都能正常打出,
7:这表明有进中断,但是中断里面读到的状态跟Bus上的不一,是I2CMCS 这个寄存器更新问题,还是怎样?