我正在尝试学习如何在28379D 处理器上使用 I2C、并遇到一些问题。 问题是数据的第二部分传输不会开始。
此处显示代码:
//点 a:代码开始
I2C_setDataCount (I2C_base、2);
I2C_sendStopCondition (I2C_base);
I2C_sendStartCondition (I2C_base);
I2C_putData (I2C_base、0xAC);
while ((I2C_getInterruptStatus (I2C_base)& I2C_INT_RX_DATA_RDY)=0);I2C_getData (I2C_base); //等待字节传输完成并读回它(请参阅下面的注释)
I2C_putData (I2C_base、0x02);
while ((I2C_getInterruptStatus (I2C_base)& I2C_INT_RX_DATA_RDY)=0);I2C_getData (I2C_base);
//等待 I2CMDR.STP 被清除
while (I2C_getStopConditionStatus (I2C_base));
//等待清除总线忙位
while (I2C_isBusy (I2C_base));
//点 B:数据的第一部分被传输
//尝试发送第二部分数据
I2C_setDataCount (I2C_base、1);
I2C_sendStopCondition (I2C_base);
I2C_sendStartCondition (I2C_base);
I2C_putData (I2C_base、0xEE);
//点 C:代码结束
while (1);
注释。 我不使用 FIFO 和中断、由于实际 I2C 从设备的潜逃、我使用数字回送模式。 因此、我将 RRDY 位监控为字节传输完成的标志。
在代码开始(A 点)之前、I2C-B 寄存器如下所示:
I2cbRegs I2C 寄存器
I2COAR 0x0048 I2C 自有地址 [存储器映射]
I2CIER 0x0000 I2C 中断使能 [存储器映射]
I2CSTR 0x0410 I2C 状态[存储器映射]
I2CCLKL 0x002D I2C 时钟低电平时间分频 器[存储器映射]
I2CCLKH 0x002D I2C 时钟高电平时间分频 器[存储器映射]
I2CCNT 0x0000 I2C 数据计数[存储器映射]
I2CDRR 0x0000 I2C 数据接收[存储器映射]
I2CSAR 0x0048 I2C 从器件地址[存储器映射]
I2CDXR 0x0000 I2C 数据发送 [存储器映射]
I2CMDR 0x4660 I2C 模式 [存储器映射]
I2CISRC 0x0000 I2C 中断源[存储器映射]
I2CEMDR 0x0001 I2C 扩展模式 [存储器映射]
I2CPSC 0x0013 I2C 预分频 器[存储器映射]
I2CFFTX 0x0000 I2C FIFO 发送 [存储器映射]
I2CFFRX 0x0000 I2C FIFO 接收 [存储器映射]
在数据的第一部分被传输后、我会在逻辑分析仪上看到它的序列
START、0x90、0xAC、0x02、STOP
现在一切都正常。
此时 i2c-regs 的值:
I2cbRegs I2C 寄存器
I2COAR 0x0048 I2C 自有地址 [存储器映射]
I2CIER 0x0000 I2C 中断使能 [存储器映射]
I2CSTR 0x0430 I2C 状态[存储器映射]
I2CCLKL 0x002D I2C 时钟低电平时间分频 器[存储器映射]
I2CCLKH 0x002D I2C 时钟高电平时间分频 器[存储器映射]
I2CCNT 0x0002 I2C 数据计数[存储器映射]
I2CDRR 0x0002 I2C 数据接收[存储器映射]
I2CSAR 0x0048 I2C 从器件地址[存储器映射]
I2CDXR 0x0002 I2C 数据发送 [存储器映射]
I2CMDR 0x4260 I2C 模式 [存储器映射]
I2CISRC 0x0000 I2C 中断源[存储器映射]
I2CEMDR 0x0001 I2C 扩展模式 [存储器映射]
I2CPSC 0x0013 I2C 预分频 器[存储器映射]
I2CFFTX 0x0000 I2C FIFO 发送 [存储器映射]
I2CFFRX 0x0000 I2C FIFO 接收 [存储器映射]
但在第二次调用 I2C_sendStartCondition (I2C_base)时不会发生任何情况;- SCL 或 SDA 线路上没有任何脉冲。
在 C i2c-regs 看起来是:
I2cbRegs I2C 寄存器
I2COAR 0x0048 I2C 自有地址 [存储器映射]
I2CIER 0x0000 I2C 中断使能 [存储器映射]
I2CSTR 0x0420 I2C 状态[存储器映射]
I2CCLKL 0x002D I2C 时钟低电平时间分频 器[存储器映射]
I2CCLKH 0x002D I2C 时钟高电平时间分频 器[存储器映射]
I2CCNT 0x0001 I2C 数据计数[存储器映射]
I2CDRR 0x0002 I2C 数据接收[存储器映射]
I2CSAR 0x0048 I2C 从器件地址[存储器映射]
I2CDXR 0x00EE I2C 数据发送 [存储器映射]
I2CMDR 0x6A60 I2C 模式 [存储器映射]
I2CISRC 0x0000 I2C 中断源[存储器映射]
I2CEMDR 0x0001 I2C 扩展模式 [存储器映射]
I2CPSC 0x0013 I2C 预分频 器[存储器映射]
I2CFFTX 0x0000 I2C FIFO 发送 [存储器映射]
I2CFFRX 0x0000 I2C FIFO 接收 [存储器映射]
您可以看到 MDR.STT 已启用、但没有任何数据传输。
我尝试使用中断、但仍然没有成功。
我弄错了什么?
此致、
Alex
