主题中讨论的其他器件: MSPM0G3507
工具与软件:
尊敬的专家:
我们使用 mspm0c1104尝试在从模式下使用 LIN 通信(uart0)、在主控制器模式下使用 I2C 通信。 如果我们同时使用这两个、其中一方将不会由于中断优先级而工作。 是否有办法同时使用这两者?
(我们使用带有示例代码的 Lin 和 I2C 来实现了每个设计、每个设计都可以单独正常工作。)
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.
工具与软件:
尊敬的专家:
我们使用 mspm0c1104尝试在从模式下使用 LIN 通信(uart0)、在主控制器模式下使用 I2C 通信。 如果我们同时使用这两个、其中一方将不会由于中断优先级而工作。 是否有办法同时使用这两者?
(我们使用带有示例代码的 Lin 和 I2C 来实现了每个设计、每个设计都可以单独正常工作。)
Zoey、您好!

目前、作为临时措施、我已设置 I2C 通信、其持续时间为 LIN 通信完全终止到下一个 LIN 通信的时段。
但是、由于通过 I2C 通信要发送和接收的数据长度预计会增加、因此如果 I2C 通信的长度超过 LIN 通信之间的周期、则无法使用此方法。
因此、必须可以同时进行通信。

现在、如果 我同时进行通信、它会在中间断开连接。

如您所说、我在项目中仅使用 ADC0、LIN 和 I2C 中断、因此 LIN 的优先级高于 I2C。

我不太了解 FIFO。 我希望得到更多的解释。
此致、
Donguk
什么是不起作用的? 从您所描述的内容来看、这似乎是一个策略/编码问题。 观察示波器跟踪可以发现、每个操作(I2C/LIN)似乎都要运行到完成、然后才允许另一个器件运行、这并非(通常)所必需的。
I2C FIFO 始终启用。 您可以存储多达4个字节(每个方向),例如 DL_I2C_fillControllerTXFIFO()。 对于许多 I2C 器件(用法)、这是整个事务、在这种情况下、仅在开始和结束时需要 CPU 干预、并且当您使用 LIN 时、事务可以在后台运行。 借助100kHz I2C、FIFO 在交互之间提供(4*9*10usec)=360usec 的 I2C 活动。
此外、I2C 单元具有流控制功能、因此、如果 FIFO 变为空(Tx)或满(Rx)、总线将暂停(时钟延展)、直到 CPU 可以为其提供服务。
我不太熟悉 LIN、但我知道 LIN 的实时性要求更严格。 即便如此、我认为这些数据是一个字节(9600bps 时为1ms)级别、而不是一个位级别。 凭借适当的中断优先级、只需允许中断为您"调度"、就可以使 CPU 与 I2C 的交互适应介于两者之间的情况。
Bruce、您好!
感谢您的回答。
不幸的是、我不太擅长沟通策略。
在我的示例中、我在 C:\ti\mspm0_sdk_2_04_00_06\examples\nortos\LP_MSPM0C1104\driverlib\i2c_controller_rw_multibyte_fifo_interrupts 中使用了 i2c、并在 C:\ti\mspm0_sdk_2_03_00_07\examples\nortos\LP_lnortos\lp_lw_multibyte_fifo_interrupts 中使用了 LIN。
路径略有不同、因为我在开发过程中更改了 MCU。
我对您的回答内容有疑问。
I2C:它正在以400kbit/s 的速度进行通信、对于 TX、1个数据包的大小为8个字节(其中包括第一个字节中的从器件地址)、对于 RX (不包括第一个字节)为8个字节。
我将 MCF8329用作 I2C 通信的从板、并遵循数据表中的 I2C 规则。
LIN:它以19200bps 的速度进行通信、并通信8个字节的数据(如果包含同步字节、ID 字节和校验和字节、则为11个字节)。
我不确定我的理解是否正确、但回答是否正确意味着 LIN 通信是基于字节的通信、因此如果在1个字节正在进行时中断不仅在字节的开头和结尾重叠、则可以同时通信。
在我使用的示例中、当我使用调试器进行检查时、我确认 LIN 通信发生了29个中断1次。
难以设想一种防止中断重叠的方法。 您还有其他示例代码吗?
此致、
Donguk
LIN 和 I2C 并不存在不能同时运行的原因;争用发生在中断时、因此您希望这些中断更少/更短(我想吗?) 您通常需要选择 LIN 中断。 [我怀疑这是你刚才说的、但我想确定。]
1) 1)您提到您已将 LIN 中断优先级设置为高于 I2C/ADC、但您的屏幕截图("中断配置")并没有实际显示出来。
在这些示例中、每个中断优先级都设置为" ",其中(大概)意味着=0 (最高);更重要的是,优先级都是相同的。 由于您无法将 LIN 设置为高于=0、因此可以设置 I2C (和 ADC?) 较低(=1或=2)。 I2C 同时具有 FIFO 和流控制、因此它可以处理延迟一段时间的问题。
以不同的优先级运行中断意味着 LIN 可以挤占 I2C 中断(代码)。 如果您小心地将两组数据分开(让 main ()作出决定),这可以很好地工作。
2) LIN 指挥官使用回调发送 Rx 数据包。 这是从 LIN 中断调用的;示例回调非常简单、但在放入过多内容时应小心。
3)也有一些设置可以改善 FIFO 的使用,但这些涉及稍多一些。 我想知道您从(1)本身获得了多少收益。