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.
您好!
我在320F28069上使用 i2c 模块。 我正在使用 FIFO。
I2caRegs.I2CCNT =无线大小;
I2caRegs.I2CSAR =从地址;
I2caRegs.I2CFFTX.bit.TXFFIL = 0;
当我写入4个字节时、我在2个字节后获得 FIFO TX 中断并生成中断。
不再发送字节。 未产生中断。 任何指针或方向、以及要查找的内容。
此致
Jawwad
感谢 Kevin 的回复。
是的、我使用 的是 I2CFFTX.TXFFINT 和 I2CFFTX.RXFFINT。 XRDY 和 RRDY 中断被禁用、I2caRegs.I2CFFTX.bit.TXFFIL = 0;
我认为总线上有一些错误、我无法正确解决。 我认为我没有正确解决在通信期间收到的 NACK 问题。
你的看法是什么。 是否应启用 NACKint 并在接收到该 NACK 后发送停止。 或者、我应该检查 FIFO 中断中的 NACKint 并在接收到该中断时发送 STOP。 通过将中断编程为发生的方式:TXFFINT、RXFFINT、ARDYINT、SCDINT。
此致
Jawwad、您好!
[引用 user="Jawwad Hafeez">您有何意见? 如果我在接收到 NACK 后启用 NACKint 并发送 STOP。
我认为这是正确的方法。 这是我过去处理它的方式、但这不是基于中断的:
if (I2caRegs.I2CSTR.bit.nack = 1) { I2caRegs.I2CMDR.bit.STP= 1; I2caRegs.I2CSTR.All = I2C_CLR_Nack_bit; 状态= I2C_ERROR; 返回状态; }
如果您能够探测总线、最好使用逻辑分析仪、这将有助于您进行调试。
最棒的
Kevin
大家好、Kevin。
感谢你的帮助。 我解决了问题。 进行了一些实验以了解 TI i2c 的工作概念。 基本问题是、无论您写入 I2caRegs.I2CMDR.ALL = 0x6E20;//反复发送 FIFO、具有4个字节的 FIFO 只会发送2个字节并停止再发送任何数据。
在我的情况下、接收器在2个字节后发送了一个 NACK、但我没有正确处理 NACK。 停止任何未来的传输。 我必须通过执行以下操作来重置 FIFO:
I2caRegs.I2CFFTX.bit.TXFFRST=0;
USEC (10);//Dumy 延迟
I2caRegs.I2CFFTX.bit.TXFFRST=1;
这解决了问题。
接下来、我将检查确保 FIFO 被复位和启用所需的虚拟延迟。 当前10usec 是一个假延迟、一些空的计数指令可确保位被清除
相关代码如下所示。 如果这是最佳解决方案、我还会请 TI 评论 plz、任何其他潜在客户都很感激。 我使用 TIRTOS
//如下所示启用 I2C 中断
I2caRegs.I2CIER.ALL = 0x24;//启用 SCD 和 ARDY 中断
I2caRegs.I2CFFTX.ALL = 0x6020;//启用 FIFO 模式和 TXFIFO
I2caRegs.I2CFFRX.ALL = 0x2040;//启用 RXFIFO
I2caRegs.I2CFFTX.bit.TXFFINTCLR = 1;//清除 TXFFINT
I2caRegs.I2CFFRX.bit.RXFFINTCLR = 1;//清除 RXFFINT
//输入中断例程,如果是 ARDY int 检查 NACK
if (IntSource = I2C_ARDY_ISRC){
if (I2caRegs.I2CSTR.bit.nack = 1){
I2caRegs.I2CMDR.bit.STP= 1;//如果 NACK 发送停止
I2caRegs.I2CSTR.All = I2C_CLR_nack_bit;//清除 NACK
I2C.ErrCode = I2C_Nack_error;//设置用于检查的错误代码
I2C.WrDone=0;//Flag i2c 写入完成
}
}
//in I2C Write 函数
MSG->WrDone=1;
I2caRegs.I2CMDR.ALL = 0x6E20;//发送 FIFO
while (msg->WrDone);//wait for WrDone、由 i2c 中断例程清除、这是测试代码、
//不要在生产软件中使用阻塞等待,最好与经销商或主管一起使用
if (msg->ErrCode=I2C_Nack_error){
I2caRegs.I2CFFTX.bit.TXFFRST=0;
USEC(10);
I2caRegs.I2CFFTX.bit.TXFFRST=1;
返回-1;
}