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/TMS320F28020:I2C 从发送器-无 AAS 中断

Guru**** 2605765 points
Other Parts Discussed in Thread: TMS320F28020

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/680643/ccs-tms320f28020-i2c-slave-transmitter---no-aas-interrupt

器件型号:TMS320F28020

工具/软件: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;

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

    我写信告诉您、已指派一名 C2000团队成员回答此帖子。

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

    我不确定您为什么会看到争用、除非您的主 I2C 器件不遵循开漏总线配置。 似乎有人试图将时钟线保持在低电平并控制总线、但驱动该时钟的主器件并未释放总线。

    您是否仅在此过程中看到此争用?
    I2C 总线上还有哪些其他器件? 是否可以在争用结束前逐一将其删除?
    F28020是否曾经进入 I2C 中断并做出正确响应?

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

    总线上的主器件是 MSP430F66xx。 总线上没有其他器件。

    当我使系统成为 MSP430主发送器、向 TMS320从接收器写入8个数据字节时、一切都正常。 请参阅下面的示波器图。

    只有当我使 MSP430成为主接收器并且 TMS320成为从发送器时、我才会发现 SCL 上的争用。  

    问题:

    当主器件发送从器件地址/数据地址/ R/WWWL=1时、将从器件从接收器切换到发送器的最佳方法是什么?

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

    您好、Steve、

    [引用用户="Steven Leen">1. 当主器件发送从器件地址/数据地址/且 R/WB=1时、将从器件从接收器切换到发送器的最佳方法是什么?[/引用]

    当器件处于受控模式而不是自由数据格式模式时、TRX 无关紧要、外设将根据主控的 R/W 位在接收器和发送器之间切换。 I2C 模块参考指南的表7中对此进行了概述:

    问题

    1.您能否确认在从发送器接收数据时输入 ISR 的'Case RRDYINT:// RRDYINT Receive Data Ready Interrupt'部分(第一个帖子图像中的"Addr 0x00")?

    2.我的理解和 Mark 可能会在后面出现以进行澄清/更正、是从器件将使用 I2CDXR 寄存器中放置的数据响应主器件读取请求、而无需任何进一步的配置。 在提供的代码中、I2CDXR 被写入的唯一时间是'Case XRDYINT:// XRDYINT Transmit Data Ready Interrupt'内、此中断在初始化代码内未被启用。 争用可能来自等待 I2CDXR 写入有效数据以准备好响应主系统读取请求。 您能否尝试将以下内容添加到初始化代码中并确保 I2CDXR 已加载数据?

    I2caRegs.I2CIER.bit.XRDY =置位;//置位发送器数据就绪中断使能 

    注释

    我不清楚为什么不触发 AASINT、 但需要注意的一点是、I2CSTR 寄存器中的 AAS 位会被重复起始条件或停止条件清零、因此在被 ISR 捕获之前、重复起始条件可能会将该位清零。

    此致、

    标记-

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

    非常好!

    感谢您的支持。  如您所述、从器件将在 R/WB=1时自动进入 TX 模式。  然后、如果 TX RDY 中断被启用、它将被触发。

    我真的不需要 AAS 中断、我认为我需要它来切换到 TX 模式。