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.
工具与软件:
您好!
我正在使用 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.