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 条件、NACK、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:
谢谢您的反馈!