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.

[参考译文] TMS320F28069:I2C 模块 FIFO 发送中断

Guru**** 2196960 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/880746/tms320f28069-i2c-module-fifo-transmit-interrupt

器件型号:TMS320F28069

您好!  

我在320F28069上使用 i2c 模块。 我正在使用 FIFO。

I2caRegs.I2CCNT =无线大小;
I2caRegs.I2CSAR =从地址;
I2caRegs.I2CFFTX.bit.TXFFIL = 0;

当我写入4个字节时、我在2个字节后获得 FIFO TX 中断并生成中断。

不再发送字节。 未产生中断。 任何指针或方向、以及要查找的内容。

此致

Jawwad

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jawwad、您好!

    您说正在生成的中断是 I2CFFTX.TXFFINT 中断、对吧? 如果是、您的 I2CFFTX.TXFFIL 寄存器设置为什么?

    最棒的

    Kevin

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢 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;