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.

[参考译文] CCS/TMS320F28377S:I2C 库、无中断

Guru**** 2475925 points
Other Parts Discussed in Thread: TMS320F28075

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/929199/ccs-tms320f28377s-i2c-lib-without-interrupt

器件型号:TMS320F28377S
主题中讨论的其他器件:TMS320F28075

工具/软件:Code Composer Studio

尊敬的所有人

我正在处理没有中断库的 I2C。 由于印度的锁定、我无法解决这个问题。 如我之前的帖子中所述、 程序在 while 循环中多次卡住、当我想读取两个器件 RTC 和 EEPROM 时、它不起作用、因此请重新打开此帖子并帮助我解决此问题。

这是我的旧帖子的链接。

https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/884602

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

    Sam、

    在您所提到的旧主题中、我没有看到我的上一篇帖子的任何回复。

    您是否尝试过这些建议? 什么是有效的? 还有什么不是呢?

    我的理解是、您可以毫无问题地与 EEPROM 和 RTC 进行通信。 现在唯一的问题是如何在运行时更改缓冲区大小。 对吧? 如果是、我的最后一个帖子会解决该问题。

    此致、

    曼诺伊

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

    主席先生,

    很抱歉我迟到了重播。  

    我使用下面给出的旧函数、但它不起作用。 我尝试过很多次、但在    I2C_READ_D 函数中、它在" while (I2cRegs.I2CSTR.bit.RRDY!= 1)"停止、它与旧函数类似、但不起作用。 (硬件已经过软 i2c 库的良好测试、因此毫无疑问、硬件是如此)。

    根据您上次的建议、还应在   "I2C_Init_New"函数中更改" I2cRegs.I2CFFRX.bit.RXFFIL = 7;"和" I2cRegs.I2CFFRX.bit.RXFFIENA=1;"。 但代码仍然不会形成 while 循环。 我还在 "while (I2cRegs.I2CSTR.bit.RRDY!= 1)"之前添加了"I2C_Init_New"函数中的内容、但没有效果

    还有一点、我也将相同的库用于 TMS320F28075。 因此、这需要进行任何其他更改。

    / /

    unsigned int my_var[20]={0};

    int main (空)

    I2C_Init_New ();

    init_rtc_d ();          //init RTC  

    while (1)

    I2C_READ_d (0x68、0X01、7、my_var); //读取 RTC 变量

    MS (200);

    / /

    void I2C_Init_New (void)

    //将 GetWordData 分配给的 I2C-A 版本
    //功能。 GetWordData 是函数的指针。
    //GetWordData = I2C_GetWord;

    I2C_GPIO_confi ();//为 I2C 配置 GPIO
    EALLOW;
    //初始化主发送器模式下的 I2C
    I2caRegs.I2CSAR.ALL = 0x00;//虚拟
    I2caRegs.I2CMDR.bit.IRS = 0;//保持复位
    I2caRegs.I2CPSC.all = 9;// d 值变为5。
    I2caRegs.I2CCLKL = 20;
    I2caRegs.I2CCLKH=10;
    I2caRegs.I2CIER.ALL = 0x00;

    I2caRegs.I2CFFRX.bit.RXFFIL = 7;  //从 RTC 只读字节  

    I2caRegs.I2CMDR.bit.MST = 1;//主器件
    I2caRegs.I2CMDR.bit.XA = 0;
    I2caRegs.I2CMDR.bit.RM = 1;
    I2caRegs.I2CMDR.bit.BC = 0;
    I2caRegs.I2CMDR.bit.STP= 0;

    I2caRegs.I2CFFRX.bit.RXFFIENA=1;
    I2caRegs.I2CMDR.bit.IRS = 1;//使 I2C 退出复位
    EDIS;

    返回;

    / /


    void I2C_GPIO_confi (void)

    EALLOW;
    GpioCtrlRegs.GPCPUD.ALL &= 0xE7FFFFFF;

    GpioCtrlRegs.GPCGMUX2.ALL |= 0x01400000;
    GpioCtrlRegs.GPCMUX2.ALL |= 0x02800000;

    GpioCtrlRegs.GPCQSEL2.all |= 0x03C00000;
    EDIS;

    / /
    void init_rtc_d (void)

    WRITE_VAL [0]= 0x00;

    I2C_Write_d (0X68、0X07、1、WRITE_Val + 0);

    返回;

    / /

    void I2C_Write_d (UINT16 Slave_address、UINT16 Start_address、UINT16 NO_of _databytes、UINT16 Write_Array[])

    uint16 i = 0;

    I2caRegs.I2CSAR.All = Slave_address;
    while (I2caRegs.I2CMDR.bit.STP!= 0);

    //起始位、写入模式、高16位地址、主控、重复模式。
    I2caRegs.I2CMDR.bit.TRX =发送消息;

    //########## 仅适用于 EEPROM ################## //
    if (Slave_address =EEPROM_24LC512_address)

    I2caRegs.I2CDXR.All =(Start_address)>>8;

    //###################################### //
    I2caRegs.I2CMDR.ALL = 0x26A0;

    //(低16)地址位
    while (I2cRegs.I2CSTR.bit.ARDY!= 1);
    IF (I2cRegs.I2CSTR.bit.ARDY = 1)

    I2caRegs.I2CDXR.All = Start_address;

    //要发送的数据字节
    while (i <= NO_O_DATABytes)

    while (I2caRegs.I2CSTR.bit.ARDY!= 1);   //此处程序停止  
    // DSP28x_usDelay (5000);
    IF (I2cRegs.I2CSTR.bit.ARDY = 1)

    I2caRegs.I2CDXR.All = Write_Array[I++];//低16地址位

    while (I2caRegs.I2CSTR.bit.nack = 1)//如果 NACK 被接收则清零

    I2caRegs.I2CSTR.bit.nack = 1;

    I2caRegs.I2CMDR.ALL = 0x0EA0;
    while (I2cRegs.I2CSTR.bit.SCD!= 1);
    I2caRegs.I2CSTR.bit.SCD = 1;//清除停止条件

    / /

    void I2C_read_d (uint16 Slave_address、uint16 Start_address、uint16 No_for_databytes、uint16 * read_Array)

    uint16 i = 0;
    I2caRegs.I2CSAR.All = Slave_address;
    I2caRegs.I2CCNT = NO_OD_DATABytes;//在非重复模式下运行时,该值将决定要接收/发送的字节数。
    uint16 * Temp_pointer=NULL;
    temp_pointer = Read_Array;

    while (I2caRegs.I2CMDR.bit.STP!= 0);//检测一个停止位

    //起始位、写入模式、高16位地址、主控、非重复模式。
    I2caRegs.I2CMDR.bit.TRX = 1;

    //###################### 仅适用于 EEPROM ################## //

    if (Slave_address =EEPROM_24LC512_address)

    I2caRegs.I2CDXR.All =(Start_address)>>8;

    //###################################### //

    I2caRegs.I2CMDR.ALL = 0x26A0;

    while (I2cRegs.I2CSTR.bit.ARDY!= 1);

    IF (I2cRegs.I2CSTR.bit.ARDY = 1)

    I2caRegs.I2CDXR.All = Start_address;

    while (I2cRegs.I2CSTR.bit.ARDY!= 1);

    I2caRegs.I2CMDR.bit.STP= 1;

    while (I2caRegs.I2CMDR.bit.STP!= 0);//检测一个停止位
    I2caRegs.I2CMDR.ALL = 0x2C20;

    I2caRegs.I2CFFRX.bit.RXFFIENA=1;

    while (i <= NO_OD_DATABytes)//I2CIER、I2CSTR


    // while (I2caRegs.I2CFFRX.bit.RXFFINT!= 1);
    while (I2cRegs.I2CSTR.bit.RRDY!= 1);//这是我检查 RRDY 位的位置
    *温度指针++= I2caRegs.I2CDRR.all;
    i++;

     

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

    Sam、

    I2CSTR.RRDY (接收就绪)位只能在非 FIFO 模式下使用。 在 FIFO 模式下、您需要使用 RXFFST (或) RXFFINT 标志位。

    此致、

    曼诺伊

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

    感谢您的支持、

    现在我到达3座老的情况。 我能够在 RTC 和 EEPROM 中进行读取和写入、但即使我将接收缓冲器保持在相同的值、也无法同时访问它们、方法 是保留"I2caRegs.I2CFFRX.bit.RXFFIL = 3;" void i2c_init_old (void)函数。   

    那么、请告诉我们如何读取这两个外设??

    这是我的代码、其他函数与我上一个帖子中给出的函数相同。

    / /

     unsigned int RTC_var[5]={0};

    unsigned int EEPROM_var[5]={0}'

    unsigned char sh、sm、sh;

    void main (void)

     I2C_INIT_OLD ();

    while (1)

    I2C_READ_d (0x68、0X00、3、RTC_var);

    sh=bcd2dec (RTC_var[0]);
    mh=bcd2dec (RTC_var[1]);
    hhhhh=bcd2dec (rtc_var[2]);

    I2C_READ_d (0x50、0X01、3、EEPROM_var);

    MS (200);

     / /

    void i2c_init_old (void)

    I2C_GPIO_confi ();//为 I2C 配置 GPIO

    EALLOW;
    //CpuSysRegs.PCLKCR9.bit.I2C_A = 1;//打开 I2C 模块时钟
    // EDIS;

    //初始化主发送器模式下的 I2C
    I2caRegs.I2CFFRX.bit.RXFFIL = 3;
    I2caRegs.I2CSAR.All= 0x68;//50//从器件地址- EEPROM 控制代码
    I2caRegs.I2CPSC.all =0x14;//9 I2C 时钟应该介于7MHz-12MHz 50MHz/6=8.33之间
    I2caRegs.I2CCLKL = 40;//43 //预分频器设置为100kHz 比特率
    I2caRegs.I2CCLKH = 40;//43 //在10MHz I2C 时钟上

    I2caRegs.I2CMDR.ALL = 0x0620;//主发送器
    //使 I2C 退出复位
    //暂停时停止

    I2caRegs.I2CFFTX.ALL = 0x6000;//启用 FIFO 模式和 TXFIFO
    I2caRegs.I2CFFRX.ALL = 0x2000;//启用 RXFIFO

    EDIS;
    返回;

     / /

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

    您是否使用逻辑分析仪/示波器来探测 I2C 总线? 检查 I2C 主设备何时调用这两个从设备时是否确认它们?

    -Manoj

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

    当我尝试调用这两个函  数时、代码停留在"I2C_READ_d"函数中的"while (I2cRegs.I2CSTR.bit.ARDY!= 1);"。 我还说  

    将"I2caRegs.I2CFFRX.bit.RXFFIL = NO_OFF_DATABytes;"添加到  "I2C_READ_D"、如下所示  

    I2caRegs.I2CFFRX.bit.RXFFIL =无数据字节;
    I2caRegs.I2CSAR.All = Slave_address;
    I2caRegs.I2CCNT = NO_OD_DATABytes;//操作时

    但我仍然没有得到任何东西。

    RTC+EEPROM 的波形

    这是使用 EEPROM 时的情况  

    仅 RTC。 这会读取错误的数据  

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

    您好、先生、

    请参阅我的代码的附件。

    当我运行这个时、数据应该出现在两个不同的数组"EEPROM_BUF1"和"RTC_BUF1"中。 正如我在上一篇文章中提到的、即使我尝试读取相同数量的字节、我也得到了错误的数据、并且两个数组中的数据互换了。 我发现该代码也多次被吸入循环(如"while (I2cRegs.I2CSTR.bit.ARDY!= 1)")。 这个代码进入关键项目、这就是我担心这一点的原因。

    我尝试了许多组合、但无法正确读取两个 IC。 在我的上一篇文章中、我还附加了波形。

    e2e.ti.com/.../4130.main1.ce2e.ti.com/.../6131.i2c_5F00_driver1.ce2e.ti.com/.../3125.i2c_5F00_driver1.h

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

    Sam、

    请检查随附的 I2C 示例代码、该代码可进行修改以适合您的应用。 我不使用 ARDY、而是使用 RXFFTST 和 TXFFST 标志来检查 FIFO 状态。

    e2e.ti.com/.../i2c_5F00_FIFO.c

    此致、

    曼诺伊

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

    感谢您重放、

    我测试此代码并进行一些更改以使其与电路板兼容、例如使用函数"I2C_GPIO_confi"为 I2C 设置 GPIO91、92、它可以工作一段时间、但大多数情况下它在写入函数中停留在"while (I2caRegs.I2CFFTX.bit.TXFFST);"循环中。

    我没有尝试过、但结果是相同的。

    / /

    #include "F28x_Project.h"

    //
    //定义
    //
    #define I2C_SLAVE_ADDR 0x50
    #define I2C_NUMBYTES 2.
    #define I2C_EEPROM_ADDRESS 0x0000
    #define I2C_FIFO_LEVEL 16

    #define I2C_SUCCESS 0
    #define I2C_BUS_BUS_BUSY_ERROR 999
    #define I2C_STP_NOT_READY_ERROR 1.
    #define SLAVE_NOT_READY_ERROR 2.

    //
    //函数原型
    //
    void I2CA_Init (void);

    uint16 checkBusStatus (void);

    uint16 I2CA_WriteData (uint16 SlaveAddress、uint16 address、uint16 *txbuffer、uint16 NumOfBytes);
    uint16 I2CA_ReadData (uint16_t SlaveAddress、uint16_t address、uint16_t * txbuffer、uint16_t NumOfBytes);

    UINT16传递计数= 0;
    uint16 failcount=0;

    void I2C_GPIO_confi (void)

    EALLOW;
    GpioCtrlRegs.GPCPUD.ALL &= 0xE7FFFFFF;

    GpioCtrlRegs.GPCGMUX2.ALL |= 0x01400000;
    GpioCtrlRegs.GPCMUX2.ALL |= 0x02800000;

    GpioCtrlRegs.GPCQSEL2.all |= 0x03C00000;
    EDIS;

    _interrupt void i2c_int1a_isr (void);

    void pass (void);
    失效失效(失效);

    uint16 r;

    uint16 I2C_STATUS = 9;

    //
    //主函
    //
    uint16_t TXDATA[66];                    //I 将此变量设为全局变量、以便在调试器上查看结果
    uint16_t RXDATA[66];

    void main (void)


    //
    //步骤1. 初始化系统控制:
    // PLL、安全装置、启用外设时钟
    //此示例函数位于 F2837xS_SYSCTRL.c 文件中。
    //
    InitSysCtrl();

    //
    //步骤2. 初始化 GPIO:
    //此示例函数位于 F2837xS_GPIO.c 文件和中
    //说明了如何将 GPIO 设置为其默认状态。
    //
    InitGpio();

    //
    //对于这个示例、只初始化针对 SCI-A 端口的引脚。
    //这些函数可在 F2837xS_GPIO.c 文件中找到。
    //
    // GPIO_SetupPinOptions (26、GPIO_input、(GPIO_异 步| GPIO_PULLUP));
    // GPIO_SetupPinMux (26、GPIO_MUX_CPU1、11);
    //
    // GPIO_SetupPinMux (27、GPIO_MUX_CPU1、11);
    // GPIO_SetupPinOptions (27、GPIO_INPUT、(GPIO_异 步| GPIO_PULLUP));

    I2C_GPIO_confi ();

    //
    //步骤3. 清除所有_interrupts 并初始化 PIE 矢量表:
    //禁用 CPU __interrupts
    //
    Dint;

    //
    //将 PIE 控制寄存器初始化为默认状态。
    //默认状态为禁用所有 PIE __interrupts 和标志
    //被清除。
    //此函数位于 F2837xS_PIECTRL.c 文件中。
    //
    InitPieCtrl();

    //
    //禁用 CPU __interrupts 并清除所有 CPU __interrupt 标志:
    //
    IER = 0x0000;
    IFR = 0x0000;

    //
    //使用指向 shell 中断的指针初始化 PIE 矢量表
    //服务例程(ISR)。
    //这将填充整个表,即使是__interrupt
    //在本例中未使用。 这对于调试很有用。
    //可以在 F2837xS_DefaultIsr.c 中找到 shell ISR 例程
    //此函数可在 F2837xS_PieVect.c 中找到
    //
    InitPieVectTable();

    //
    //此示例中使用的中断被重新映射到
    //此文件中的 ISR 函数。
    //
    EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
    PieVectTable.I2CA_INT =&i2c_int1a_ISR;
    EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的

    //
    //步骤4. 初始化器件外设:
    //
    I2CA_Init();

    //
    //步骤5. 特定于用户的代码
    //

    //
    //清除计数器
    //
    PassCount = 0;
    failcount = 0;

    //
    //启用此示例所需的__interrupts
    //

    //
    //在 PIE:组8 _interrupt 1中启用 I2C _interrupt 1
    //
    PieCtrlRegs.PIEIER8.bit.INTx1 = 1;//启用 I2C 非 FIFO 中断

    //
    //启用连接到 PIE 组8的 CPU INT8
    //
    IER |= M_INT8;
    EINT;

    // ESTOP0;
    R = 2;
    while (r<=66)

    asm (" NOP");
    TXDATA[r]= 0 + r - 2;
    R++;

    I2C_STATUS = I2CA_WriteData (I2C_SLAVE_ADDR、I2C_EEPROM_ADDRESS、TXDATA、64);
    F28x_usDelay (50000);
    F28x_usDelay (50000);

    while (1){

    I2C_STATUS = I2CA_ReadData (I2C_SLAVE_ADDR、0、RXDATA、64);
    F28x_usDelay (50000);
    F28x_usDelay (50000);

    //
    // I2CA_Init -初始化 I2CA 设置
    //
    空 I2CA_Init (空)

    I2caRegs.I2CSAR.ALL = 0x0050;//从地址- EEPROM 控制代码

    I2caRegs.I2CPSC.all = 9;//预分频器-模块时钟需要7-12MHz // I2C 模块时钟= 100MHz /(9+1)= 10MHz
    I2caRegs.I2CCLKL = 45;//注:必须为非零//在标准模式中配置 I2C
    I2caRegs.I2CCLKH = 45;//注意:必须为非零
    I2caRegs.I2CIER.ALL = 0x24;//启用 SCD 和 ARDY __interrupts

    I2caRegs.I2CMDR.ALL = 0x0020;//使 I2C 退出复位
    //挂起时停止 I2C

    I2caRegs.I2CFFTX.ALL = 0x6000;//启用 FIFO 模式和 TXFIFO
    I2caRegs.I2CFFRX.ALL = 0x2040;//启用 RXFIFO、清除 RXFFINT、

    返回;

    //
    // I2CA_WriteData -发送 I2CA 消息
    //
    UINT16 I2CA_WriteData (UINT16 SlaveAddress、UINT16地址、UINT16 *txbuffer、UINT16 NumOfBytes)
    //uint16 I2CA_WriteData (uint16_t SlaveAddress、uint16地址)

    uint16状态;

    uint16 numof十六 字节=(2+NumOfBytes)/I2C_FIFO_LEVEL;
    uint16余数字节=(2+NumOfBytes)% I2C_FIFO_LEVEL;

    status = checkBusStatus();
    if (状态)

    退货状态;

    //
    //设置从地址
    //
    I2caRegs.I2CSAR.All = SlaveAddress;


    txbuffer[0]=地址>> 8;
    txbuffer[1]=(地址)& 0xFF;

    I2caRegs.I2CCNT = 2+NumOfBytes;
    I2caRegs.I2CMDR.ALL = 0x6E20;
    F28x_usDelay (2000);

    if (I2cRegs.I2CSTR.bit.nack)

    //ESTOP0;
    返回 SLAVE_NOT _READY_ERROR;

    uint16 count、i;

    计数= 0;
    while (count < numof十六 字节)

    count++;

    对于(i=1;i<=I2C_FIFO_LEVEL;i++)

    I2caRegs.I2CDXR.all =*(txbuffer);
    txbuffer++;

              while (I2caRegs.I2CFFTX.bit.TXFFST);              //此处代码卡住  

    //I2caRegs.I2CCNT =余数字节;
    对于(i=0;i <余数字节;i++)

    I2caRegs.I2CDXR.all =*(txbuffer);
    txbuffer++;


    if (I2cRegs.I2CSTR.bit.nack)

    返回 SLAVE_NOT _READY_ERROR;

    //
    //将 START 作为主发送器发送
    //
    状态= I2C_Success;

    退货状态;

    //
    // I2CA_ReadData -读取 I2CA 消息
    //
    uint16 I2CA_ReadData (uint16_t SlaveAddress、uint16_t address、uint16_t * rxbuffer、uint16_t NumOfBytes)

    uint16状态;

    uint16 numof十六 字节= NumOfBytes / I2C_FIFO_LEVEL;
    //uint16余数字节= NumOfBytes % I2C_FIFO_LEVEL;

    status = checkBusStatus();
    if (状态)

    退货状态;

    //
    //设置要发送的字节数
    // MsgBuffer +地址
    //
    I2caRegs.I2CCNT = 2;//额外的2个字节用于发送 EEPROM 地址

    //
    //设置要发送的数据
    //
    I2caRegs.I2CDXR.all =地址>> 8;
    I2caRegs.I2CDXR.ALL =(地址)& 0xFF;

    I2caRegs.I2CFFTX.bit.TXFFINTCLR = 1;

    I2caRegs.I2CMDR.ALL = 0x6620;

    if (I2cRegs.I2CSTR.bit.nack)

    返回 SLAVE_NOT _READY_ERROR;

    while (I2caRegs.I2CFFTX.bit.TXFFST);

    I2caRegs.I2CCNT = NumOfBytes;//设置预期的字节数

    I2caRegs.I2CMDR.ALL = 0x6C20;//作为主接收器发送重启

    uint16 count、i;

    计数= 0;
    while (count < numof十六 字节)

    count++;
    while (!(I2caRegs.I2CFFRX.bit.RXFFST = 16));

    对于(i=0;i<=I2C_FIFO_LEVEL;i++)

    *rxbuffer = I2caRegs.I2CDRR.all;
    rxbuffer++;

    返回 I2C_Success;

    UINT16校验总线状态(空)

    if (I2caRegs.I2CMDR.bit.STP==1)

    //ESTOP0;
    返回 I2C_STP_NOT _READY_ERROR;

    if (I2cRegs.I2CSTR.bit.BB = 1)

    //ESTOP0;
    返回 I2C_BUS_BUS_BUSY_ERROR;

    if (I2cRegs.I2CSTR.bit.nack)

    //ESTOP0;
    返回 SLAVE_NOT _READY_ERROR;

    返回0;

    //
    // i2c_int1a_ISR - I2CA ISR
    //
    _interrupt void i2c_int1a_isr (void)

    // uint16 IntSource;

    //
    //读取__interrupt 源
    //
    // IntSource = I2caRegs.I2CISRC.ALL;

    //
    //启用未来的 I2C (PIE 组8)__interrupts
    //
    PieCtrlRegs.PIEACX.ALL = PIEACK_group8;

    //
    // pass -停止调试器并表示 pass
    //
    void pass (空传递)

    _asm (" ESTOP0");
    for (;;);

    //
    //失败-停止调试器并表示失败
    //
    void fail()(空失败())

    _asm (" ESTOP0");
    for (;;);

     

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

    Sam、

    我发送给您的代码在我的硬件设置中工作得非常好。 我看不到您看到的问题。  令人惊讶的是、您的系统中出现故障的零星性质。

    代码卡在 TXFFST 中的时间? I2C 总线的状态是什么? 您是否接收到从器件发出的 ACK 信号? 您是否仅在与特定从设备通信时才会看到此问题? 在极少数情况下、我们看到一些客户在 I2C 总线上添加了30pF 电容器、所有器件开始正常工作。

    此致、

    曼诺伊

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

    Manoj、  

    我在 I2C 总线上放置了33pf 电容器、但没有影响。

    如您所要求、 在   "I2CA_WriteData"函数中的" while (I2cRegs.I2CFFTX.bit.TXFFST)"代码 SACK。 我还会注释 "I2CA_WriteData"并 运行只读函数"I2CA_ReadData"、但随后从"checkBusStatus"函数获取"SLAVE_NOT READY_ERROR"。

    当代码停留在  "while (I2caRegs.I2CFFTX.bit.TXFFST)"时、我检查波形、SDA 和 SCL 为高电平。  

    我还尝试通过更改 I2CPSC 寄存器的值来更改预分频器设置、以减慢时钟速度、但没有效果。

    所以,请建议

    e2e.ti.com/.../test.c

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

    Sam、

    "SLAVE_NOT _READY_ERROR"错误消息表明您的从器件无法识别主器件发出的 I2C 命令、I2C 主器件未接收到来自 I2C 从器件的 ACK 信号。

    可能的原因:-

    1) 1) F28377S I2C 要求 I2C 模块时钟介于7MHz 至12MHz 之间。 这是一项要求。 如果不满足要求、则 I2C 模块将无法正常工作。

    I2C 模块时钟= SYSCLK /(I2CPSC + 1)。

    我在 SYSCLK = 100MHz 时运行示例代码、因为我在 F28075器件中运行此示例代码。 这就是我将 I2CPSC 设置为9的原因。

    因此、I2C 模块时钟= 100MHz/(9 + 1) = 10MHz。

    如果在 SYSCLK = 200MHz 的频率下运行代码、则需要将 I2CPSC 更改为19

    I2C 模块时钟= 200MHz /(19 + 1)= 10MHz。

    2) 2)检查 I2C 主设备是否正在发送正确的 I2C 从设备地址。 在本例中、我的 EEPROM 地址为0x50。 写入 EEPROM 函数时的波形片段下方

    3) 3)检查您的硬件设置是否正确? 上拉电阻器等

    4) 4)确保发送正确的从器件地址。

    正如我之前提到的、我发送给您的代码工作正常。 如果有任何内容、请检查您的硬件设置并逐步进行调试。 我真的没有其他任何调试建议。

    此致、

    曼诺伊

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

    我会多次测试您的代码。 您能否在结束时进行检查、只需连续读取 EEPROM 就可以了 while (1)。  

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

    Sam、

    我刚刚运行了我发送给您的示例代码、这里是使用 I2CA_ReadData 函数时的波形片段。

    此致、

    曼诺伊

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

    祝你好运?

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

    不、它仍然无法正常工作。 我正在测试它。  

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

    我可以关闭此主题吗? 此问题是否已解决?