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.

TM4C129ENCPDT数据手册问题



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?是我英语不好弄错了吗?

  • 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?是我英语不好弄错了吗?

    此寄存器有点特殊,

    该寄存器在读取时访问状态位,在写入时访问控制位。读取时,状态寄存器可指示 I2C 总线控制器
    的状态。写入时,控制器寄存器可用来设置 I2C 控制器的操作。

    详细参考Table 21-5. Write Field Decoding for I2CMCS[6:0]

    里面有详细说明,此寄存器不同配置下是只读还是只写模式。 

  • 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 这个寄存器更新问题,还是怎样?