工具/软件:Code Composer Studio
我将 TMS320F28020用作从器件地址0x24的从器件发送器。 上面的波形显示器件寻址正确、发送地址数据= 0x0000、然后重复启动并寻址为从器件、R/W=1、则 SCL 线路似乎处于争用状态。 我没有得到 AAS 中断、不确定原因。 下面是初始化和中断代码。
初始化代码:
空 I2Cinit (空)
{
EALLOW;
SysCtrlRegs.PCLKCR0.bit.I2CAENCLK = 1;//启动 I2C 时钟
EDIS;
I2caRegs.I2CMDR.bit.IRS = CLR;//保持在复位状态以允许对寄存器进行更改
// 7位地址主控/受控、单主控、主控模式、I2C 模式、异步模式
I2caRegs.I2CMDR.bit.MST = CLR;//设置从机模式
I2caRegs.I2CMDR.bit.TRX = CLR;//清除 TX 模式、设置 RX 模式
// SMCLK、正常 ACK
I2caRegs.I2CPSC.bit.IPSC = 0x3;//将 I2C 时钟分频以生成频率= 40MHz/(1+3)= 10MHz
I2caRegs.I2CCLKL = 100;
I2caRegs.I2CCLKH = 100;//主时钟= 10MHz/[(100+5)+(100+5)]= 47619Hz
//预分频器高字节、预分频器=(UC0BR0 + UC0BR1 x 256)
//串行 I2C 地址
I2caRegs.I2COAR = I2C_serial_DSP_ADDR;//加载 DSP 地址
I2caRegs.I2CMDR.bit.IRS =置位;//释放表单复位
iicRxpacketptr = iicRxDat;//设置指向数组开头的指针。
iicTxpacketptr = iicTxDat;//设置指向数组开头的指针。
I2caRegs.I2CSTR.bit.RRDY = 1;//通过写入1来清除 Rx rdy 中断标志
I2caRegs.I2CSTR.bit.XRDY = 1;//通过写入1来清除 TX 空中断标志
I2caRegs.I2CSTR.bit.AAS = 1;//通过写入1将 addr 清除为从器件中断标志
I2caRegs.I2CIER.bit.RRDY = SET;//设置接收器数据就绪中断使能
I2caRegs.I2CIER.bit.SCD =置位;//置位停止接收中断使能
I2caRegs.I2CIER.bit.AAS =置位;//将寻址设置为从机中断使能
}
中断代码:
#pragma CODE_SECTION (_IICIsr、"ramfuncs");
#define NOINT 0x00 //无
#define ALINT 0x01 //仲裁丢失
#define NACKINT 0x02 //检测到 NACK
#define ARDYINT 0x03 //寄存器准备好访问
#define RRDYINT 0x04 //接收器数据就绪
#define XRDYINT 0x05 //发送数据准备就绪
#define SCDINT 0x06 //检测到停止条件
#define AASINT 0x07 //寻址为从器件
_interrupt void _IICIsr (void)
{
uint16_t intsrc;
intsrc = I2caRegs.I2CISRC.ALL & 0x0007;//读取中断源
switch (intsrc)
{
案例 RRDYINT:// RRDYINT 接收数据就绪中断
I2caRegs.I2CSTR.bit.RRDY = 1;//通过写入1来清除 Rx rdy 中断标志
if (iicRxpacketptr - iicRxDat < MAX_IIC_DATA_buff)//不要溢出缓冲区
*iicRxpacketptr++=(uint8_t) I2caRegs.I2CDRR;//读取 D0...DN-1
其他
iicRxpacketptr = iicRxDat;//设置指向数组开头的指针。
中断;
案例 SCDINT://检测到 SCDINT 停止条件
I2caRegs.I2CSTR.bit.SCD = 1;//通过写入1来清除停止条件中断标志
iicRxpacketptr = iicRxDat;//设置指向数组开头的指针。
中断;
情况 XRDYINT:// XRDYINT 发送数据就绪中断
I2caRegs.I2CSTR.bit.XRDY = 1;//通过写入1来清除 TX 延迟中断标志
if (iicTxpacketptR-iicTxDat < MAX_IIC_DATA_buff)//不要溢出缓冲区
I2caRegs.I2CDXR =* iicTxpacketptr++;//
其他
iicTxpacketptr = iicTxDat;//设置指向数组开头的指针。
中断;
案例 AASINT:
I2caRegs.I2CSTR.bit.AAS = 1;//通过写入1将 addr 清除为从器件中断标志
I2caRegs.I2CSTR.bit.RRDY = 1;//通过写入1来清除 Rx rdy 中断标志
I2caRegs.I2CSTR.bit.XRDY = 1;//通过写入1来清除 TX 延迟中断标志
if (I2caRegs.I2CDRR & 1)//从 main 中读取 cmd
{
I2caRegs.I2CMDR.bit.TRX =置位;//设置 TX 模式、CLR RX 模式
I2caRegs.I2CIER.bit.RRDY = CLR;// CLR 接收器数据就绪中断使能
I2caRegs.I2CIER.bit.XRDY =置位;//置位 TX 数据就绪中断使能
I2caRegs.I2CDXR =* iicTxpacketptr++;//发送第一个字节
}
其他
{
I2caRegs.I2CSTR.bit.SDIR = 1;//从器件方向、清零位来指示从器件接收器
I2caRegs.I2CMDR.bit.TRX = CLR;// CLR TX 模式、设置 RX 模式
I2caRegs.I2CIER.bit.RRDY = SET;//设置接收器数据就绪中断使能
I2caRegs.I2CIER.bit.XRDY = CLR;// CLR TX 数据就绪中断使能
}
中断;
默认值:
中断;
}
I2caRegs.I2CSTR.bit.RRDY = 1;//通过写入1来清除 Rx rdy 中断标志
I2caRegs.I2CSTR.bit.XRDY = 1;//通过写入1来清除 TX 空中断标志
I2caRegs.I2CSTR.bit.AAS = 1;//通过写入1将 addr 清除为从器件中断标志
PieCtrlRegs.PIEACX.ALL |= PIEACK_group8;
// PieCtrlRegs.PIEACK.all = PIEACK_group8;
}
