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.

[参考译文] MSPM0G3507:MSPM0G3507_I2C_Interrupt

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1582525/mspm0g3507-mspm0g3507_i2c_interrupt

器件型号:MSPM0G3507


问题 1: 我对 TX FIFO 触发器的理解是否正确?

TXFIFOTRG 在 TXFIFO 为空时发生、因为它满足条件“发送 FIFO 包含<=定义的字节“、我认为。

 

问题 2: 我发现执行以下函数后、RIS 寄存器中发生了 TXFIFOTRG(偏移= 1030h)。 这是期望的行为吗?

(1) DL_I2C_enableTarget

(2) NVIC_EnableIRQ

(3) DL_I2C_flushTargetTXFIFO

 

与 I2C 外设相关的条件如下所示。

频率= 100kHz、TX FIFO 触发电平= 1 个字节、 未屏蔽中断状态。

 

(1) 和 (2):I2C 函数初始化时、不存在 I2C 通信、或 TXFIFO 为空。

(3):刷新 TX FIFO 后、TXFIFO 为空。

 

问题 3 我是否应该屏蔽中断状态以不控制 TX FIFO 触发信号?

 

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

    作为目标(I2C 从设备)、我怀疑您想要 TXEMPTY_ON_TREQ 功能 (DL_I2C_enableTargetTXEmptyOnTXRequest ())[Ref TRM (SLAU846C) 第 24.2.3.12.1]节。 使用该设置、您将只在事务期间获得 STXEMPTY、而不是空闲时获得 STXEMPTY。

    未经请求:您也可能需要 TXWAIT_STALE_TXFIFO (DL_I2C_enableTargetTXWaitWhenTXFIFOStale ())[参考同一 TRM 部分]。 如果您在上一个事务期间过量填充了 Tx FIFO、则有机会刷新该 FIFO。

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

    您好 Bruster-san、

    感谢您发送编修。

    您的建议可能对我的发展富有成效。

    但是、您能否回答我的 3 个问题、因为我想先澄清一下?

    感谢您的支持。

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

    Q1:是的,一般。 发生中断条件 (RIS):

    a) 正常运行时:当 Tx FIFO 级别超过 TXTRIG(向下计数)时。 清除空 FIFO 不会触发中断。

    b) 启用目标 (SCTR:ACTIVE := 1) 且 TxFIFO 级别低于 TXTRIG

    这种情况与是否存在正在进行的交易无关。

    问题 2:是的、这是预期行为。 我的观察是,触发中断条件的是 enableTarget()。 刷新非空 FIFO(高于 TXTRIG)也会触发它、但我认为您所描述的情况并非如此。

    Q3:一般情况下,我会说是的,当没有活动的事务时,你应该禁用触发器。 我之所以这样说、只是因为一般来说、目标不会提前知道控制器会要求哪些数据。 [这就是 TXEMPTY_ON_TREQ 的用武之地。] 我想、在某些应用程序中 、目标器件可能会提前知道这一点、在这种情况下、您可以使用触发器来预加载 FIFO。  

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

    您好 Bruster-san、

    我的理解如下。 如果有错误的观点,请告诉我。

    a)  DL_I2C_enableTarget、 NVIC_EnableIRQ 和清除 TxFIFO 会触发中断 TXFIFOTRG。

    b) Flushing TxFIFO 因以下条件而异。  

      b-1) TxFIFO =空-->无中断

      B-2) TxFIFO <>空-->触发中断

    c) 在所需的 I2C 事务之前、我应屏蔽中断状态。

    我想知道如何处理 FIFO TRG 电平。

    例如、当我想将 I2C 数据仅处理为 1 个字节、或不处理 TX/RX FIFO 中的多个字节时、我选择以下设置、没错吗?

    Rx 触发级别: Rx FIFO 包含>= 1 个字节

    TX 触发电平: TX FIFO 包含<= 0 字节

    感谢您的支持。

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

    a)  DL_I2C_enableTarget 和 清空 TxFIFO 都可以触发 TXFIFOTRG [分别基于 Q1:(b)/(a)]。  NVIC_EnableIRQ 不会(本身)触发 TXFIFOTRG;它仅允许该条件传播到 CPU (ISR)。

    B) 是的。

    C) 是的。 对于小型交易、低触发级别将使您的目标更具响应性。 I2C 具有流控制(时钟延展)、因此不会丢失数据。 如果您(将来)要处理更大的传输、加载 FIFO 可以加快处理速度。

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

    您好 Bruster-san、

    感谢您的解释。

    我想在 I2C 外设初始化时或在所需事务之前使用屏蔽中断状态。

    我还会引用 STALE_TXFIFO 标志以适当的时序使用冲洗 TXFIFO。