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:在 TMS320F28069上读取 EEPROM 时、I2C ISR 不更新值出现问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1368626/tms320f28069-issue-with-i2c-isr-not-updating-value-when-reading-eeprom-on-tms320f28069

器件型号:TMS320F28069

工具与软件:

您好!

我正在使用 TI C2000 TMS320F28069微控制器、并使用 I2C 从 EEPROM 中读取数据。 如果在 Timer0 ISR 中启动读取操作、则在从 EEPROM 读取时、I2C 中断服务例程(ISR)似乎不会更新该值、我会遇到这个问题。 不过、当我在主循环中执行读取操作时、它可以正常工作。

下面是我的 timero IRQ:

中断失效 TIM0_IRQn (void)

  EALLOW;
  AT24C02_READ (0x10);
  val1 = InData[0];
  AT24C02_READ (0x11);
  val2 = InData[0];
  PieCtrlRegs.PIEACK.bit.ACK1 = 1;
  EDIS;
}

AT24C02_READ ()只是用于与 EEPROM 通信的函数。 运行上面的代码、它看起来 val1等于 val2、并且确实正确地从地址0x10中的 EEPROM 读取了值、但无法读取第二个地址0x11。

在主循环中执行读取操作时:

void main()

// Initialization code...

while(1)
    {
        DELAY_US(500);
        AT24C02_Read(0x10);
        val1 = InData[0];
        AT24C02_Read(0x11);
        val2 = InData[0]; }
}

在主循环中、正确读取了电压1和电压2。

这是我的 IIC 配置:

空 I2CA_Init (void)

  //初始化 I2C
   I2caRegs.I2CSR = 0x0050;      //从器件地址。
   I2caRegs.I2COAR = 0x002D;      // Address as Master。
   I2caRegs.I2CPS.all = 6;       //预分频器-需要在模块时钟上为7-12MHz
   I2caRegs.I2CCLKL = 10;         //注意:必须为非零
   I2caRegs.I2CCLKH = 5;          //注意:必须为非零
   I2caRegs.I2CIR.all = 0x2C;    //启用 SCD 和 ARDY 中断

   I2caRegs.I2CMDR.bit.IRS = 1;   //使 I2C 退出复位
                                   //挂起时停止 I2C

   I2caRegs.I2CFFTX.ALL = 0x6000; // Enable FIFO mode and TXFIFO (启用 FIFO 模式和 TXFIFO)
//   I2caRegs.I2CFFRX.ALL = 0x2040;   // Enable RXFIFO、Clear RXFFINT、
   返回;
}

空 I2CA_Write (UINT16地址、UINT16数据)

   I2caRegs.I2CCNT = 2;           //首选另外3个字节。
   I2caRegs.I2CDXR = Addr;        //发送要更新的寄存器。
//   I2caRegs.I2CDXR = high_byte (data);
   I2caRegs.I2CDXR = low_byte (data);
//   I2caRegs.I2CDXR = 0x10;

   I2caRegs.I2CMDR.all = 0x6E20;  //设置控制寄存器
}

空 I2CA_READ (uint16地址)

   I2cIndex = 0;
   I2caRegs.I2CCNT = 1;           //首选1个额外字节。
   I2caRegs.I2CDXR = Addr;    //发送要更新的寄存器。
   I2caRegs.I2CMDR.all = 0x6620;  //设置控制寄存器:

   DELAY_US (50);                  //延迟50us

   I2caRegs.I2CCNT = 1;           //设置接收2个字节。
   I2caRegs.I2CMDR.all = 0x6C20;  //从读取开始发送"重复"(TRX 关闭)
                                       //和停止。
}

空 I2CA_WAIT (void)

  //等待直到 STP 位从任何之前的主通信中清除。
  //模块清除此位的操作被延迟到 SCD 位之后
  //设置。 如果在启动新消息之前未检查该位、则为
  // I2C 可能会感到困惑。

   while (I2caRegs.I2CMDR.bit.stp = 1);//等待停止条件位为零。

   while (I2caRegs.I2CSTR.bit.BB = 1); //等待总线忙位为0。

}

IIC ISR 是:

中断失效 i2c_int1a_isr (void)    // I2C-A

   uint16 IntSource;

  //读取中断源
   IntSource = I2caRegs.I2CIRC.bit.intCODE & 0x7;

   交换机(IntSource)
   {
       情况 I2C_NO_ISRC:  //=0
           休息;

       Case I2C_ARB_ISRC: //=1
           休息;

       情况 I2C_NACK_ISRC://=2
           休息;

       情况 I2C_ARDY_ISRC://=3
           休息;

       情况 I2C_RX_ISRC:  //=4
           InData[I2cIndex]= I2caRegs.I2CDRR;
           休息;

       情况 I2C_TX_ISRC:  //=5
           休息;

       情况 I2C_SCD_ISRC: //=6
           休息;

       情况 I2C_AAS_ISRC: //=7
           休息;

       默认值:
           asm ("  ESTOP0");//在无效数字上停止。
   }

  //启用将来的 I2C (PIE 组8)中断
   PieCtrlRegs.PIEACK.all = PIEACK_group8;
}

我怀疑 Timer0 ISR 和 I2C ISR 之间可能存在冲突或时序问题、但我不确定如何解决这个问题。 非常感谢您提供有关如何解决此问题的任何建议。

谢谢!

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

    尊敬的 Xinghang:

    假设 I2C 配置为控制器 接收器、其结果是 ARDY 和 RX 以及 RX 和 SCD 事件(取决于 I2C ISR 的触发方式)发生的时间非常相似、如果不是同时发生的话。  您可以尝试修改计时器周期(如果可以这样做)、并在 ISR 内的读取之间添加延迟、因为读取例程中的延迟可能不够。 请注意、平均 EEPROM 最长需要5ms 来执行读取或写入操作。

    此致、

    Aishwarya.

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

    星航

    您是否能够解决此问题? 如果没有其他问题了、我将继续并关闭该主题。  

    此致、

    Aishwarya.