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.
在官方的例程 project i2c_ex6_eeprom_interrupt from C:\ti\c2000\C2000Ware_4_03_00_00\driverlib\f2837xs\examples\cpu1\i2c.中
有下面一段发送数据的代码
145行:将待写入的目标地址写入Temp
147行:取出了temp的低24位数据,这里为啥是取低24位呢,是因为目标寄存器的存储区间最大只能到2^24吗?
149行:把待传输数据的字节数左移了24位,并与之前的temp进行了与操作。因此得到的temp,高8位,表示待传输的字节个数,低24位,表示待传输的目标地址
154行:因为待传输的目标地址字节数为2,因此for循环里的i,其实就是从1减到0,只有两个循环操作。这样的话,156行,就仅仅将temp的8~16位(对应i=1)和0~7位(对应i=0)写入了FIFO发送寄存器
那temp的其位数也并没有进行传输使用到吗?这里知识把目标地址寄存器的低16位数据发送了出去吗?
另外,还想再补充咨询下,这里因为把FIFO的发送寄存器深度设置为0,因此把这两个字节的数据发送出去后,就会进入FIFO中断吗?但141行也设置了寄存器发送个数为2,那这样2个字节发送完毕后也会产生NACK和STOP信号吧?为啥不会触发这两个对应的中断呢?软件里相应的中断也被使能了
这里设置了发送数据个数为2,但在随后又修改了发送数据个数,为(地址字节个数+待发送数据字节个数)。但是到了这一步的时候,,地址字节不是已经通过I2C_TransmitSlaveAddress_ControlBytes()函数发送出去了吗
I2C的发送寄存器每次只能传输8位数据。
其余的,比如这个函数的逻辑结构,以及移位的位数,比如24位这些,应该是与EEPROM芯片有关。我对EEPROM还不是很了解。
如果你想知道更多关于通过I2C连接EEPROM这方面的东西,我可以再帮你咨询下相关的工程师。
这样的话,156行,就仅仅将temp的8~16位(对应i=1)和0~7位(对应i=0)写入了FIFO发送寄存器
这里能说一下你的理解吗?
for循环会执行两次,即i=1和i=0;i=1时,temp右移1*8=8位后,将移位后的低8位(即原始temp的8~15位)送入发送寄存器;i=0时,temp继续移位0*8=0位、也就是不移位,然后将低8位、即原始temp的8~15位再次送入发送寄存器。也就是说原始temp的8~15位被发送了两次。
i=1时,对temp右移8位,通过i2c传输出去了
此时的temp数据并没有发生改变,移位操作的结果并没有被赋值作为新的temp,temp的数据和移位操作前的数据是相同的
i=0时,对temp的低8位取值,通过i2传输出去了
此时的temp数据并没有发生改变,移位操作的结果并没有被赋值作为新的temp,temp的数据和移位操作前的数据是相同的
好的,感谢!我之前的理解确实有些偏颇。
我已经咨询了相关工程师。
另外,还想再补充咨询下,这里因为把FIFO的发送寄存器深度设置为0,因此把这两个字节的数据发送出去后,就会进入FIFO中断吗?
不会的,红框框住的地方是配置Data Counter寄存器,主要用来控制发送/接收的数据的数量、以及产生NACK/STOP信号,和FIFO中断并没有关系;第187行的代码是用来配置FIFO中断的。
感谢大佬回复
红色框的184行,设置了待发送个数,主要是用来产生NACK/STOP信号,这俩不是也会触发相应的中断吗?
187行的配置FIFO接收和发送深度,也是为了触发FIFO中断
所以这里我的意思是这两个都被使能的中断谁先谁后不会产生冲突吗?
另外,这里还有一个比较大的困惑是,在已经通过I2C_TransmitSlaveAddress_ControlBytes()函数把待写地址发送出去后,为何在184行,设置待发送数据的时候,将其设置为(地址字节个数+待发送字节个数),我理解这里应该仅设置为待发送字节个数
1. I2C有两个中断,I2C中断和I2CFIFO中断,这两个中断在PIE中有各自的位置,是互相独立的。
这两个中断内部分别还有具体划分、以及相应的仲裁机制,这一部分可以看下TRM中的相关章节:
spruhx5g_TMS320F2837xS Microcontrollers Technical Reference Manual (Rev. G) 第2188页 19.4 Interrupt Requests Generated by the I2C Module
这两个框图可以简单直观的帮助你了解一下:
2. 这个我还需要与相关的工程师再讨论一下。