主题中讨论的其他器件:SN65HVD257EVM、 C2000WARE
工具/软件:Code Composer Studio
尊敬的所有人:
我在 进行 CAN 协议测试时遇到两个 F28379X 控制卡之间的互连问题。 我已经 通过 CAN 接口点( 即 VH 和 VL 引脚)的 DB9连接器连接了两个 MCU 板。 我在两个 MCU 中都转储了"CAN 环回"的源代码。 那么、有人能告诉我检查输出以测试 CAN 通信的过程吗?
提前感谢。
Sumanta
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.
工具/软件:Code Composer Studio
尊敬的所有人:
我在 进行 CAN 协议测试时遇到两个 F28379X 控制卡之间的互连问题。 我已经 通过 CAN 接口点( 即 VH 和 VL 引脚)的 DB9连接器连接了两个 MCU 板。 我在两个 MCU 中都转储了"CAN 环回"的源代码。 那么、有人能告诉我检查输出以测试 CAN 通信的过程吗?
提前感谢。
Sumanta
您好、Sumanta、
如果您尝试通过 CAN 总线通过 DB9连接器在2个 MCU 板之间建立通信、则 CAN 回路代码将不起作用。 CAN 回路仅用于调试测试、您可以在该测试中监视或观察 CAN_TX 引脚上传输的数据、这些数据在内部反馈到一个 MCU 板中 CAN 模块上的 RX 端口。
为了使2个 MCU 板进行通信、您需要将 MCU 板的 CAN_TX 和 CAN_RX 引脚上的每个 CAN 连接到收发器(例如 SN65HVD234D)。 收发器将通过 CANH 和 CANL 引脚将 CAN_TX 和 CAN_RX 信号转换为差分信号。 CANH 和 CANL 引脚与 GND 一起连接到 DB9连接器。 CANH 和 CANL 线是 CAN 总线的定义。 然后、您需要 一个具有2 个节点(其中1 个节点是1个 MCU 板+ A CAN 收发 器)的 CAN 网络、这些节点通过 CAN 总线进行链接。 一旦建立了必要的连接、就可以使用来自 CAN 外部传输的示例代码。 您可以将一个 MCU 板配置为传输数据、而另一个 MCU 板将接收数据。
希望这能让您快速入门。 如果您有其他问题、请告诉我。
此致、
Joseph
您好、Sumanta、
好的、在这种情况下、如果您只想查看发送和接收数据及其增量、那么最好使用 CAN 环回代码。 您实际上不需要将 MCU 连接到 CAN 收发器。
在 C2000Ware 中使用 CAN 环回代码时、请在 for (;)循环内设置断点、然后在 CCS 的 Variables 窗口或 Expressions 窗口中、您可以监控/添加 sTXCANMessage 和 sRXCANMessage。 每次您按下"Play"按钮时、代码都会在断点处暂停、然后在"Variables"或"Expressions"窗口中可以看到 sTXCANMessage 和 sRXCANMessage 的值。
请告诉我、这是否对您无效。
此致、
Joseph
您好、Joseph、
我已经完成了 CAN_Loopback 测试的编程、在该测试中我检查了以下波形:
1) 1)在 RX 和 TX 端子上相对于 GND 获得零电压。
2) 2) CAN 总线电压以 GND 为基准、其中 VH = 4.8伏、VL = 1.25伏、这些都是直流电压。
我在源代码中将输入数据指定为[ucTXMsgData[4]={'a'、'b'、'c'、'd'}和 ucRXMsgData[4]={'0'、'0'、'0'、'0'}。 因此、请建议对源代码或测试设置进行必要的修改、以便获得[@Kash]发布的波形。
提前感谢。
此致
Sumanta
您好、Sumanta、
根据您的描述、您似乎限制了4个值的传输、这4个值是十六进制的 ucTCMsgData[0]='A' ASCII 或0x61、ucTCMsgData[1]='b'或0x62、ucTCMsgData[2]='c'或0x63和 ucTCMsgData[3]='d'或0x64。 不确定在循环中将 ucRXMsgData 的值设置为{'0'、'0'、'0'、'0'}[通过此处的'0'表示十六进制的0x30 ]、但如果在调用 CANMessageGet 后设置 ucRXMsgData[4]={'0'、'0'、'0'、'0'、'0'}}、 然后循环将停止、因为根据您所执行的初始化、ucTXMsgData 永远不会等于 ucRXMsgData: [ucTXMsgData[4]={'a'、'b'、'c'、'd'}和 RXucMsgData[4]={'0'、'0'、'0'、'0'}。 这可能是您的案例中发生的情况。 传输可能会停止、因为传输的数据不等于接收的数据。
我建议按原样运行 CAN 回送代码、无需任何修改。 在将 ucTXMsgData[0]优先于值0x01、ASCII SOH 和值0x02、ASCII STX 的 ucTXMsgData[1]时、测试将无限循环。 然后、每次可以完成发送/接收事务时、这些值都会递增1、一旦发送数据达到0xFF (这是 ASCII 的最大值)、值就会重新返回到0。 CAN 环回测试、如果运行正确、将发送/接收0至255范围内的所有可能的 ASCII 代码、并无限期重复、直到程序停止。 这将包含 所有 ASCII 字符、包括符号、数字以及字母中大写和小写字母。 这将是监控 CAN_TX 和 RX 引脚中信号的最佳机会。
此致、
Joseph
您好!
我已经使用 CAN_Loopback 源代码测试了2个单独的 MCU、在这些源代码中、我通过示波器观察了 CAN 总线上的差分信号。 目前、我正在修改一个 MCU 的 CAN_External 发送源代码以用作发送器、另一个 MCU 用作接收器。 发送器 MCU 能够发送消息(以脉动信号的形式)、但接收器 MCU 无法接收相同的消息(在 CAN 总线输出端观察到的情况)。 请建议如何修改源代码、以便 MCU 能够接收信号。
提前感谢。
此致
Sumanta
您好、Sumanta、
很高兴知道您现在可以在 CAN 总线上看到活动。 我想首先详细了解您的设置、特别是您如何连接这2个 MCU。 您是否对两个 MCU 使用了 Launchpad 中相同的 CAN 收发器? 如果是、请注意 CAN_RX 和 CAN_TX 引脚连接到特定的 GPIO 引脚、CAN 外部发送代码示例使用一组不同的用于 CAN_RX 和 CAN_TX 的 GPIO 通道。 请确保已相应匹配 GPIO 通道分配 、以匹配 CAN 引脚功能。 如果您使用了不同的收发器、请注意 F28379X CAN 引脚为3.3V 类型的 I/O、因此您还需要使用具有3.3V I/O 的收发器 为收发器使用不同的 I/O 类型通常是一个常见错误、误导他人不建立 CAN 通信。
至于您的代码、如果您使用了 CAN 外部传输示例、则可以对发送器执行以下步骤(建议仅对 RX 和 TX 使用 CANA 模块):
相应地设置 CAN_TX/RX 引脚
初始化 CAN - CANInit();
选择时钟源- CANClkSourceSelect();
设置比特率- CANBIT RateSet();// TX 和 RX 应该匹配
初始化发送报文(如 sTXCANMessage 结构体的外部发送示例所示-此处需要定义报文长度)
启用 CAN - CANEnable();
根据要传输的数据长度修改 txMsgData 数组,以设置要传输的数据
将数据发送到 CAN 引脚- CANMessageSet();
您可以通过在上述伪代码中的最后两行循环来传输多个帧、但需要在 CANMessageSet 调用后添加一些延迟、以确保数据将被传输- 使用 与示例代码中相同的延迟函数。
对于接收器 MCU、 您希望代码如下所示:
相应地设置 CAN_TX/RX 引脚
初始化 CAN - CANInit();
选择时钟源- CANClkSourceSelect();
设置比特率- CANBIT RateSet();// TX 和 RX 应该匹配
初始化 接收报文结构 sRXCANMessage (与示例中相同)
启用 CAN - CANEnable();
从 CAN 总线接收数据- CANMessageGet ();
接收到的消息将在 rxMsgData 数组中可用、并且您还可以在 CANL 和 CANH 线路上观察差分信号、或在物理引脚 CAN_RX 和 GND 或 CAN_TX 和 GND 上监控它们。
希望这对您有所帮助。
此致、
Joseph
您好、Joseph、
感谢您的回答。 我已经连接了2个 MCU、并根据您在上一篇文章中提到的更改在发送器和接收器 MCU 中构建代码。 我已将数据分配给 ucTXMsg 和 ucRXMSG 变量、如下所示:
"unsigned char ucTXMsgData[4]={'a'、'b'、'c'、'd'}、ucRXMsgData[4]={'0'、'0'、'0'、'0'};"
在 CAN 总线(脉动方波)和 CCS 窗口中的数据处观察到波形。 但在对接收器 MCU RX 端子进行编程时、中的相同波形不可见、并且在 CCS 窗口中 RX 寄存器中也没有数据。 请提出建议。
提前感谢。
此致
Sumanta
您好、Joseph、
我已经通过将 CAN 环回源代码调试为第一个 MCU 中的发送器和第二个 MCU 中的接收器来检查它。 我能够观察数据
接收器 MCU CAN 接收器端子上的示波器脉冲。 但是、正如我在上述帖子中提到的、如果传输数据定义为:
[ucTXMsgData[4]={'a'、'b'、'c'、'd'}、ucRXMsgData[4]={'0'、'0'、'0'、'0'、'0'}]、然后我在'd'中得到 ucRXMsgData[4]={'h'、'0'、'c'、'd'、而不是'd'、'd'
窗口。
如果有人遇到类似问题、请提出建议。
提前感谢。
此致
Sumanta
您好、Sumanta、
调试上述 CAN 测试时:
1) 您是否监控了 CAN_ES (错误和状态寄存器)? 是否标记了任何错误?
2) 您用于将 CAN_TX/RX 引脚连接到 CAN 总线的收发器的器件型号是多少? 只是希望确保收发器电平与28379D 电平兼容。
3) 两个 MCU 上使用的时钟源是什么-板载晶体、振荡器 、或者您是否独立于外部源提供时钟?
根据您的描述、当接收到可能会提示 计时问题的数据时、似乎有丢失的位/移位的数据。 这就是提出上述问题的原因。
谢谢、
Joseph
您好、Joseph、
如需了解相关信息、请访问:
1) 1)目前、我正在运行 CAN_Loopback 源代码、该源代码不包含 CAN_ES 变量、以显示您指出的错误标志信号。
但在 CAN_External 传输源代码中分配了相同的变量、而我当前未对其进行调试。
2)收发器[SN65HVD251D]正与28379D 控制器配合使用。
3) 3)除了控制器的内部时钟外、没有使用外部时钟。
请说明为什么发送器变量中分配的相同数据未在接收器变量中传输。
提前感谢。
此致
Sumanta
您好、Joseph、
我没有通知您有关隔离器 IC (I/P - 3.3V 和 O/P - 5V)的信息、该 IC 位于控制器(28379D)和收发器 IC 之间、因此控制器的 TX 和 RX 端子都保持在3.3V、而 CAN 总线 O/P 保持在5V。 希望它能消除您对使用(SN65HVD251D)收发器与(28379D)不兼容的困惑。 请建议是否需要对硬件电路进行任何其他更改或对源代码进行修改以解决该问题。
提前感谢。
此致
Sumanta
Sumanta、
首先、也是最重要的、请发布您所使用的电路的原理图。 您不必布置整个电路、只需布置 CAN 部分就足够了。 我想看到电路从发送节点的 CANTX 和 CANRX 引脚开始、经过隔离器 IC、收发器、最后是接收节点的 CANTX 和 CANRX 引脚。 清楚地指示端接电阻器。 请同时发布一张或两张您的设置照片。
CAN 通信是"二进制"。 它可以工作、也可以不工作。 如果存在任何损坏(或移位位)、则会触发错误帧并丢弃帧。 将再次尝试数据传输。
此主题上的帖子太多了。 让我们使用此策略来解决您的问题: