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.

[参考译文] TMS320F28034:在 I2C 中添加了一个新的温度和湿度传感器、以读取6个字节的温度和湿度数据

Guru**** 2390755 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1398548/tms320f28034-a-new-temperature-and-humidity-sensor-is-added-to-i2c-to-read-6-bytes-of-temperature-and-humidity-data

器件型号:TMS320F28034
Thread 中讨论的其他器件:C2000WARE

工具与软件:

我已经有一个在 I2C 之上使用 FIFO 的 EEPROM、想在 I2C 之上添加一个 SHT3X、如果要读取6个数据、需要关闭 FIFO、我不知道如何更改它、而且它不会影响 EEPROM 的读取和写入?

我为 SHT3X 单独准备了一些读写函数(复制的 EEPROM)、试图仅关闭 FIFO 读取、但失败了、我不知道 why.please 会帮我。谢谢。

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

    尊敬的荣荣荣荣:

    确保您要 在模块处于复位状态时更改 I2C 设置、以防止产生任何不必要的结果。 例如 、这可以在 ISR 期间发生。   

    我为我的 SHT3X 单独准备了一些读写函数(复制的 EEPROM)、尝试仅关闭 FIFO 读取、但失败

    您能否提供有关此方面的更多详细信息?  

    此致、

    Aishwarya.

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

    您好、

    我通常在进入函数后立即处理数据和状态判断,并最终执行状态判断,而我读取的函数可以引用我修改的官方程序

    此致

    __interrupt void
    i2c_int1a_isr(void)
    {
        Uint16 IntSource, i;
    
        //
        // Read interrupt source
        //
        IntSource = I2caRegs.I2CISRC.all;
        IntSource1 = I2caRegs.I2CSTR.bit.RRDY;
        //
        // Interrupt source = stop condition detected
        //
        if(IntSource == I2C_SCD_ISRC)
        {
            //
            // If completed message was writing data, reset msg to inactive state
            //
            if (CurrentMsgPtr->MsgStatus == I2C_MSGSTAT_WRITE_BUSY)
            {
                CurrentMsgPtr->MsgStatus = I2C_MSGSTAT_INACTIVE;
            }
            else
            {
                //
                // If a message receives a NACK during the address setup portion
                // of the EEPROM read, the code further below included in the
                // register access ready interrupt source code will generate a stop
                // condition. After the stop condition is received (here), set the
                // message status to try again. User may want to limit the number
                // of retries before generating an error.
                //
                if(CurrentMsgPtr->MsgStatus == I2C_MSGSTAT_SEND_NOSTOP_BUSY)
                {
                    CurrentMsgPtr->MsgStatus = I2C_MSGSTAT_SEND_NOSTOP;
                }
               
                //
                // If completed message was reading EEPROM data, reset msg to
                // inactive state and read data from FIFO.
                //
                else if (CurrentMsgPtr->MsgStatus == I2C_MSGSTAT_READ_BUSY)
                {
                    CurrentMsgPtr->MsgStatus = I2C_MSGSTAT_INACTIVE;
                   
                    for(i=0; i < I2C_NUMBYTES; i++)
                    {
                        CurrentMsgPtr->MsgBuffer[i] = I2caRegs.I2CDRR;
                    }
                   
                    {
                        //
                        // Check received data
                        //
                        for(i=0; i < I2C_NUMBYTES; i++)
                        {
                            if(I2cMsgIn1.MsgBuffer[i] == I2cMsgOut1.MsgBuffer[i])
                            {
                                PassCount++;
                            }
                            else
                            {
                                FailCount++;
                            }
                        }
                       
                        if(PassCount == I2C_NUMBYTES)
                        {
                            pass();
                        }
                       
                        else
                        {
                            fail();
                        }
                    }
                }
            }
        }
        else if (IntSource1 == 1)
        {
    //        if (I2cMsg.status == I2C_MSG_STATUS_READ_BUSY)
    //        {
                static Uint16 ReadCount;
    
                ReadCount++;
                Buffer[ReadCount] = I2caRegs.I2CDRR;
    
                if(ReadCount == 5)
                {
                    ReadCount=0;
                }
    //        }
        }
        //
        // Interrupt source = Register Access Ready
        // This interrupt is used to determine when the EEPROM address setup
        // portion of the read data communication is complete. Since no stop bit is
        // commanded, this flag tells us when the message has been sent instead of
        // the SCD flag. If a NACK is received, clear the NACK bit and command a
        // stop. Otherwise, move on to the read data portion of the communication.
        //
        else if(IntSource == I2C_ARDY_ISRC)
        {
            if(I2caRegs.I2CSTR.bit.NACK == 1)
            {
                I2caRegs.I2CMDR.bit.STP = 1;
                I2caRegs.I2CSTR.all = I2C_CLR_NACK_BIT;
            }
            else if(CurrentMsgPtr->MsgStatus == I2C_MSGSTAT_SEND_NOSTOP_BUSY)
            {
                CurrentMsgPtr->MsgStatus = I2C_MSGSTAT_RESTART;
            }
             else if (I2cMsg.status == I2C_MSG_STATUS_WRITE_BUSY)
            {
                I2cMsg.status = I2C_MSG_STATUS_RW_OK;
              //  InitSetSHT3XI2ca();
                I2caRegs.I2CFFRX.all =0x0040;  // Enable RXFIFO, clear RXFFINT,
        }  
                //I2caRegs.I2CMDR.all = 0x0000;    // reset I2C
                //I2caRegs.I2CMDR.all = 0x0020;
    
            }
                    
       
        else
        {
            //
            // Generate some error due to invalid interrupt source
            //
            __asm("   ESTOP0");
        }
    
        //
        // Enable future I2C (PIE Group 8) interrupts
        //
        PieCtrlRegs.PIEACK.all = PIEACK_GROUP8;
    }
    但在修改调试后、我发现无法触发数据来读取数据、接收寄存器中的数据保持一致、有时会出现触发条件、有时不会触发、但都不会被读取

    我已经尝试使用 I2CIRC 寄存器的4个中断条件和 I2CSTR 的 RRDY 条件、但接收寄存器中的值不能被成功读取。

    我应该如何改变它,我应该在哪种状态下读取它?

    此致、

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


    我是否可以关闭接收 FIFO 并继续开启发送 FIFO?

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

    荣荣荣

    如果我理解正确、那么 预期的数据在接收寄存器中、但是您无法在 ISR 中读取这些值来采取适当的操作?  请查看 C2000Ware EEPROM 示例以及此 E2E。  (+) TMS320F28035:通过 I2C 使用 EEPROM 进行读写操作- C2000微控制器论坛- C2000 ︎ 微控制器- TI E2E 支持论坛

    但在我修改调试

    什么是调试?

    我能否关闭接收 FIFO 并继续打开发送 FIFO?

    接收和发送 FIFO 相互独立、但协同工作。 根据需要、您可以关闭 FIFO、只需确保清除中断状态即可确保 FIFO 按预期运行。

    此致、

    Aishwarya.

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

    荣荣荣

    如果没有其他问题了、我将继续并关闭该主题。  
    此致、

    Aishwarya.