TI中文支持网
TI专业的中文技术问题搜集分享网站

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

Part Number:TMS320F28035

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

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

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

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

谢谢大家!

Susan Yang:

TX dong 说:我也是搞了十多年的C2000了

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

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

13.6.2.6 I2CCNT Registerhttps://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这些寄存器的位

uint16_t data1, data2, data3; // Could also utilize an array for thisI2caRegs.I2CSAR = 0x0060;I2caRegs.I2CCNT = 0x0001;I2caRegs.I2CMDR.all = 0x2020; //Start in receive slave modewhile(!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);
data2 = I2caRegs.I2CDRR;
while(!I2caRegs.I2CSTR.bit.RRDY);
data3 = I2caRegs.I2CDRR;

,

yongtao ma59:

主要是配置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; // 发送数据

,

Susan Yang:

谢谢您的分享!

,

user78960159:

确实,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:读取电流

,

Susan Yang:

谢谢您的分享!

,

TX dong:

谢谢你,谢谢

离线 yongtao ma59,谢谢
离线 Susan Yang

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

,

Susan Yang:

谢谢您的反馈!

赞(0)
未经允许不得转载:TI中文支持网 » TMS320F28035: c2000之I2C,有没有查询的例程?
分享到: 更多 (0)