主题中讨论的其他部件:BQ40Z60
我使用28.0775万的I2C连接TI BQ40z60芯片(SMB)。 我使用的是TI-RTOS,其中的中断(使用HWI_构造 初始化)是为FIFO完全以及nack,ARDY和SCD的常规中断生成的。 如果我在常规中断的开始处放置一个断点,并在每次中断被触发时按“继续”,一切都很正常。 如果我不这样做,我会得到各种nacks,并在合理的时间内停止不发生的事情。 我感到困惑的是,遇到断点会导致接口正常工作。 以下是一些相关代码剪切:
作废I2CB_Init(void)
{
I2cbRegs.I2CMDR.All &=~0x0020; //将I2C置于复位状态
I2cbRegs.I2CSAL.ALL = 0x006a; //从属地址
// PLL时钟/CPU时钟为120 MHz
I2cbRegs.I2CPsc.all = 9; //预分频器-需要7-12 MHz的模块clk。 9 => 120/(9+1)= 12 MHz
// SMBus在10k - 100kHz之间工作。 时钟除以200 (I2CCLKL + I2CCLKLH + 10)可提供60 kHz的频率
// 10是基于I2CPSC的调整系数
I2cbRegs.I2CCLKL = 150;//200 //注意:必须为非零
I2cbRegs.I2CCLKH = 150; //200 //注意:必须为非零
I2cbRegs.I2CIER = 0x26; //启用SCD & ARDY & nack__interrupts
I2cbRegs.I2CFFTX.ALL = 0;
I2cbRegs.I2CFFTX.ALL = 0x6000;//使用FIFO
I2cbRegs.I2CFFRX.ALL = 0;
I2cbRegs.I2CFFRX.ALL = 0x202A;//重置+启用Rx中断+中断级别
I2cbRegs.I2CMDR.ALL = 0x0020; //从重置中取出I2C
//暂停时停止I2C
返回;
}
void i2cBIsr (UArg参数)
{
UINT16 IntSource = I2cbRegs.I2CISRC.ALL;
//中断源=检测到停止条件
IF (IntSource == I2C_SCD_ISRC)
{
bqLog[LogEntry +]= 15 |(dataIndex << 4)+(I2cbRegs.I2CFFRX.Bit.RXFFST << 8);
LogEntry %= log_length;
//如果FIFO中仍有数据,请获取
如果(I2cbRegs.I2CFFRX.bit.RXFFST != 0)
{
bqLog[LogEntry +]= 8 |(dataIndex << 4)+(I2cbRegs.I2CFFRX.Bit.RXFFST << 8);
LogEntry %= log_length;
i2cB_FIFO ISR (0);
}
I2cbRegs.I2CSTR.Bit.SCD = 1;//清除SCD
如果(BQ_MsgStatus == ADDR_MSG_Sent)&&(dataQueries[dataIndex].type44Msg)
{
I2cbRegs.I2CCNT = 1;
I2cbRegs.I2CDXR/all = 0x44;
I2cbRegs.I2CMDR.All = 0x2e20;// 0x6e20;// 0x2620;//发送数据
Bq_MsgStatus = type_44_sent;
bqLog[LogEntry +]=6|(dataIndex << 4);
LogEntry %= log_length;
}
否则,如果(BQ_MsgStatus == type_44_sended)
{
I2cbRegs.I2CCNT = dataQueries[dataIndex].respLen; //设置预期的字节数
I2cbRegs.I2CMDR.All = 0x2C20; //作为主接收器发送重启
Bq_MsgStatus =读取数据;
bqLog[LogEntry +]=7|(dataIndex << 4);
LogEntry %= log_length;
}
否则,如果(reading_data == BQ_MsgStatus)
{
Bq_MsgStatus = COMM_IDLE;
bqLog[LogEntry +]=9|(dataIndex << 4);
LogEntry %= log_length;
}
}
//
//中断源=寄存器访问就绪
//此__interrupt用于确定EEPROM地址设置的时间
//部分读取数据通信已完成。 因为没有停止位
//命令,此标志告诉我们消息已发送,而不是
// SCD标志。 如果收到nack,请清除nack位并命令a
//停止。 否则,请转到通信的读取数据部分。
//
否则IF (IntSource == I2C_ARDY_ISRC)
{
如果(BQ_MsgStatus == ADDR_MSG_Sent)&&(!dataQueries[dataIndex].type44Msg)
{
//对于非类型44s,我们发送重启,而不是先停止,然后再发送新的启动
I2cbRegs.I2CCNT = dataQueries[dataIndex].respLen; //设置预期的字节数
I2cbRegs.I2CMDR.All = 0x2C20; //作为主接收器发送重启
Bq_MsgStatus =读取数据;
bqLog[LogEntry +]=10|(dataIndex << 4);
LogEntry %= log_length;
}
否则
{
I2cbRegs.I2CSTR.bit.ARDY = 1;
bqLog[LogEntry +]= 13|(dataIndex << 4);
LogEntry %= log_length;
}
}
否则,如果(IntSource == I2C_Nack_ISRC)
{
I2cbRegs.I2CSTR.bit.nack = 1;
Bq_MsgStatus = COMM_IDLE;
bqLog[LogEntry +]= 11|(dataIndex << 4);
LogEntry %= log_length;
}
否则
{
//
//由于__interrupt源无效而产生一些错误
//
ASM (" ESTOP0");
}
}