您好!
我正在使用 FSI 在具有 F280041C DSP (使用 LaunchPad)的应用中同时执行两项操作:
-同步两个 F280041C 微控制器的 ePWM
-在 微控制器之间发送数据
我执行此操作的方式(在握手过程之后)如下:
-在"主"设备中,我将一个 EPWM 设置为外部触发源,以特定频率触发 ping 帧传输。 "Slave" DSP 将使用此 ping 来同步 PWM。 当应用程序想要向"保存"发送数据时、禁用外部 Ping 传输、然后启用软件传输。 Buffer 和 USER_DATA 填充自定义数据、然后开始传输。 传输完成后、再次启用外部 Ping 传输。
在"从"设备中,我将 CLB 模块设置为在收到 ping 帧时自动发回该帧(正如关于 PWM 同步的 TI 示例所解释的那样)。 与我在"主"器件中执行的操作类似、如果应用程序想要发送数据、则会禁用外部 Ping 传输、然后启用软件传输。 当软件传输完成时、外部传输再次使能。
要解释自定义 接收数据帧(在主器件或从器件中)、我要做的是检查 USER_DATA 值、然后根据此值调用不同的函数。
现在我解释一下我所面临的问题。 通常、握手过程会顺利进行、两个电路板能够同步其 PWM。 我还能够 在它们之间成功发送数据、但是 其他方面 中,user_data 内容和缓冲区内容与我的预期不匹配。 让我举一个例子:
当 USER_DATA 为0时、我希望缓冲区内容全部为0x0000;当 USER_DATA 为1时、我希望缓冲区内容全部为0xAAAA。 但是、有时我会收到 值为1的 USER_DATA、而缓冲区内容全部为零、反之亦然。 基本上、似乎 RX 子模块正在读取 USER_DATA 或缓冲寄存器的旧信息。 但我知道(根据我的应用程序代码)不可能为这些寄存器提供错误的值。 那么、我认为这与 FSI 的 TX/RX 模块的仲裁有关。
下面是我在"编写"函数中执行的操作的代码片段:
下面是我在 "读取"函数中执行的操作的代码片段
有什么可能是我做错的事情吗? 我认为某处可能存在某种竞争条件、因为我正在外部触发器与软件触发器或类似的东西之间切换...
此代码不会在任何中断内运行、仅供参考。
如果您需要对我的问题进行更好的解释、我们将非常感谢您提供任何帮助、并告诉我。
此致。