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.

TMS320F28035: c2000之I2C,有没有查询的例程?

Part Number: TMS320F28035

C2000的I2C,一直没有搞懂,始终没有掌握,我也是搞了十多年的C2000了,汇编可以搞定,其它外围可以搞定,唯独这个I2C (使用器件中的硬件)搞不定!

我太笨,是主要原因,然而,提供的例程对掌握硬件原理没有帮助。手册中对每个寄存器的作用,讲得不明白。

例如,作为主机,启动时写DXR,然而,DXR写入后,先将SAR送出(手册上应该交待清楚的,却没有),送出SAR的内容,又不是真正的写入的内容,而是左移一位了(这又是一个坑)。再者,DXR的内容在什么地方送出去的,也觉得乱七八糟的(是不是又是个坑?)。

希望掌握C2000 I2C的大侠,提供个例程,这TI真的是指望不住了(过去也有这方面的提问,说让看例程)。只有请大家帮忙了!!

谢谢大家!

  • 我也是搞了十多年的C2000了

    谢谢您长期对TI产品的支持!

    关于发送/接收多个字节,您需要查看 I2caRegs.I2CCNT 寄存器。这设置了您希望读取或写入的字节数。下面是用户指南的链接

    13.6.2.6 I2CCNT Register

    https://www.ti.com.cn/cn/lit/ug/sprui10/sprui10.pdf


    关于 STOP 条件、N​​ACK、START 条件,甚至可能是重复的 START 条件。您可以参考下面的代码(未进行测试)以及参考

    Table 13-6. Descriptions of the Basic I2C Interrupt Requests,可以让CPU去poll这些寄存器的位

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    uint16_t data1, data2, data3; // Could also utilize an array for this
    I2caRegs.I2CSAR = 0x0060;
    I2caRegs.I2CCNT = 0x0001;
    I2caRegs.I2CMDR.all = 0x2020; //Start in receive slave mode
    while(!I2caRegs.I2CSTR.bit.RRDY);
    I2caRegs.I2CCNT = 0x0003;
    I2caRegs.I2CMDR.all = 0x2C20; // Master receive.
    // I2caRegs.I2CMDR.all = 0x2820; // Other F28069 (slave) has 0x2820 for slave mode receive
    // May need some sort of start condition here...
    while(!I2caRegs.I2CSTR.bit.RRDY);
    data1 = I2caRegs.I2CDRR;
    while(!I2caRegs.I2CSTR.bit.RRDY);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

  • 主要是配置I2CMDR模式寄存器,先把I2CMDR清零,然后按照2182页中19-2表进行配置,最后使用IRS位进行使能,最后再向I2CDXR位写入数据就可以了,如果多个数据传输,建议使能FIFO,下面是发送的例子

    I2cbRegs.I2CFFTX.bit.I2CFFEN = 1;
    I2cbRegs.I2CFFTX.bit.TXFFRST = 1;

    while((I2cbRegs.I2CSTR.bit.BB != 0)) {};
    I2cbRegs.I2CMDR.all = 0;

    I2cbRegs.I2CSAR.bit.SAR = 0x22;
    I2cbRegs.I2CCNT = 2; // 需要输出两个Byte
    I2cbRegs.I2CMDR.bit.FREE = 0;
    I2cbRegs.I2CMDR.bit.MST = 1; // 作为主设备
    /******************************************/
    //RM STT STP 这三个位设定了S-A-D..(n)..D-P的通信模式
    I2cbRegs.I2CMDR.bit.RM = 0;
    I2cbRegs.I2CMDR.bit.STT = 1;
    I2cbRegs.I2CMDR.bit.STP = 1;
    /******************************************/
    I2cbRegs.I2CMDR.bit.NACKMOD = 1;
    I2cbRegs.I2CMDR.bit.XA = 0; // 7位地址模式
    I2cbRegs.I2CMDR.bit.TRX = 1; // 发送
    I2cbRegs.I2CMDR.bit.IRS = 1; // 使能I2C模块

    I2cbRegs.I2CDXR.bit.DATA = 0x03;
    I2cbRegs.I2CDXR.bit.DATA = 0x00;//tempChar; // 发送数据

  • 谢谢您的分享!

  • 确实,C2000的IIC例程理解起来不是太容易。我也来分享一个比较实用的代码,这是我根据例程修改的对IIA226电源监控IC的配置和数据读取代码

    链接:pan.baidu.com/.../1j9snOvMBAq-WbsU4q0izjg
    提取码:emou

    大家可到上面的地址下载相关文件

    基于状态机的编程,如下图:

    op = operation

    ck = check

    op_cfg :写配置寄存器

    CK_data:回读写入数据进行校验

    op_cfg:写calibration寄存器

    op_rd_bus_v:读取bus电压

    op_rd_cur:读取电流

  • 谢谢您的分享!

  • 谢谢你,谢谢

    离线 yongtao ma59,谢谢

    离线 Susan Yang

    我用IO搞好了程序,以后有时间再好好看看。

  • 谢谢您的反馈!