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.

[参考译文] LAUNCHXL-F280049C:CAN 总线外部发送、节点未被识别

Guru**** 2582405 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/978244/launchxl-f280049c-can-bus-external-transmit-node-not-recognized

器件型号:LAUNCHXL-F280049C
主题中讨论的其他器件:C2000WARE

大家好、

首先、我是一名学生工程师、与经验丰富的工程师相反、因此请原谅我明显的愚蠢行为。

现在、我使用的是 C2000示例项目"CAN_ex3_external_transmit "、我已将接收模块从 CAN-B 更改为 CAN-A、并删除了与 CAN-B 相关的每个命令

我设置了一个收发器、它在4V 高电平下工作、这不应该是问题(?)

我将一个示波器连接到 Rx 引脚 GPIO30、我看到消息以50kbps 的速率发送。

现在、从不会触发任何中断、因此没有 ACK、这是我的 CAN 总线分析器在"error passive" TX ERR 上的结果:128...

我不确定下一步该做什么、希望得到帮助。

提前感谢

Chris

在这里、我的代码:


//$
//########################################################################################################################

//
//包含的文件
//
#include "driverlib.h"
#include "device.h"

//
//定义
//
#define TXCOUNT 100
#define MSG_DATA_LENGTH 4.
#define TX_MSG_OBJ_ID 1.
#define RX_MSG_OBJ_ID 1.

//
//全局
//
volatile unsigned long i;
volatile uint32_t txMsgCount = 0;
volatile uint32_t rxMsgCount = 0;
volatile uint32_t errorFlag = 0;
uint16_t txMsgData[4];
uint16_t rxMsgData[4];

//
//函数原型
//
_interrupt void canaISR (void);

//
//主函
//
void main (void)

//
//初始化设备时钟和外设
//
device_init();

//
//初始化 GPIO 并为 CANTX/CANRX 配置 GPIO 引脚
//在模块 A 和 B 上
//
DEVICE_initGPIO();
GPIO_setPinConfig (DEVICE_GPIO_CFG_CANRXA);
GPIO_setPinConfig (DEVICE_GPIO_CFG_CANTXA);

//
//初始化 CAN 控制器
//
CAN_initModule (CANA_base);

//
//为每个模块将 CAN 总线位速率设置为500kHz
//有关如何设置的信息,请参阅驱动程序库用户指南
//更严格的计时控制。 此外、请参阅器件数据表
//了解有关 CAN 模块计时的更多信息。
//
CAN_setBitRate (CANA_base、DEVICE_SYSCLK_FREQ、50000、20);

//
//在 CAN B 外设上启用中断。
//
CAN_enableInterrupt (CANA_base、CAN_INT_IE0 | CAN_INT_ERROR |
CAN_INT_STATUS);

//
//初始化 PIE 并清除 PIE 寄存器。 禁用 CPU 中断。
//
interrupt_initModule();

//
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//
interrupt_initVectorTable();

//
//启用全局中断(INTM)和实时中断(DBGM)
//
EINT;
ERTM;

//
//此示例中使用的中断被重新映射到
//此文件中的 ISR 函数。
//这在 PIE 矢量表中注册中断处理程序。
//
INTERRUPT_REGTER (INT_CANA0、&CANaISR);

//
//启用 CAN-B 中断信号
//
INTERRUPT_ENABLE (INT_CANA0);
CAN_enableGlobalInterrupt (CANA_base、CAN_GLOBAL_INT_CANINT0);


//初始化用于接收 CAN 消息的接收消息对象。
//消息对象参数:
// CAN 模块:b.
//消息对象 ID 号:1.
//消息标识符:0x95555555
//消息帧:扩展
//消息类型:接收
//消息 ID 掩码:0x0
//消息对象标志:接收中断
//消息数据长度:4字节
//
CAN_setupMessageObject (CANA_base、RX_MSG_OBJ_ID、0x001、
CAN_MSG_FRAME_STD、CAN_MSG_OBJ_TYPE_RX、0、
CAN_MSG_OBJ_RX_INT_ENABLE、MSG_DATA_LENGTH);

//
//启动 CAN 模块 A 和 B 操作
//
CAN_startModule (CANA_base);

//
//将消息从 CAN-A 发送到 CAN-B
//
对于(I = 0;I < TXCOUNT;I++)

//
//检查错误标志以查看是否发生错误
//
if (错误标志)

asm (" ESTOP0");


for (;;)
{IDLE;}
//
//停止应用程序
//
asm (" ESTOP0");

//
// CAN B ISR -当 CAN 中断为时调用的中断服务例程
//在 CAN 模块 B 上触发
//
_interrupt void
CANAISR (空)

//
//获取收到的消息
//
CAN_readMessage (CANA_base、RX_MSG_obj_ID、rxMsgData);

//
//到达这一点意味着 RX 中断发生在上
//报文对象1、报文 RX 完成。 清除
//消息目标中断。
//
CAN_clearInterruptStatus (CANA_base、RX_MSG_OBJ_ID);

//
//递增计数器以跟踪已有多少消息
//已收到。 在实际应用中、这可用于将标志设置为
//指示何时接收到消息。
//
rxMsgCount++;


//
//清除 CAN 中断线的全局中断标志
//
CAN_clearGlobalInterruptStatus (CANA_base、CAN_GLOBAL_INT_CANINT0);

//
//确认位于组9中的此中断
//
INTERRUPT_clearACKGROUP (INTERRUPT_ACK_group9);

//
//文件结束
//

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

    您是否了解过我的 app.report SPRACE5中的调试提示?

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

    是的、我每个人都这样做了、没有任何运气。

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

    如果您没有在自检模式下运行、则需要个外部节点来确认传输。 我已在 SPRACE5中对此进行了明确说明。 Launchpad 只有一个具有收发器的有效 CAN 节点。 第2个 CAN 节点在哪里?

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

    感谢您的回答、

    我应该更清楚地说明一下、我使用的是一个微芯片 CAN 总线分析仪、它充当第二个节点、通过 ID = 0进行广播。

    由于它看不到 ACK、因此它会持续发送并提供"无错误"、TEC =128...

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

    总线分析仪是发送器、280049是接收器?  

    [引用]从不会触发任何中断、因此没有 ACK、这是我的 CAN 总线分析器在"error passive" TX ERR:128...[/引用]上的结果

    ACK 的传输是自动的。 我在 SPRACE5中对此进行了说明:

    每当 CAN 节点成功接收到消息时、它将自动发送 ACK、除非该功能已关闭"静默模式"、其中节点接收帧、但不提供 ACK;DCAN 模块具有此功能)。 提供 ACK 的节点不需要成为帧的预期接收者、尽管它很可能。 (总线上的所有活动节点都将提供 ACK、无论它们是否是该帧的目标收件人)。  

    您应该首先确保两个节点之间的 H/W 路径正确。 首先测试传输、然后测试接收更容易。 将280049配置为发送器、将分析仪配置为接收器。 尝试从 C:\ti\c2000Ware_3_03_00_00\driverlib\f2837xd\examples\cpu1\can 中获取 cAN_ex4_simple_transmit。 您应该能够轻松地将其移植到280049。 只有当该示例有效时、您才能确保 H/W 路径良好。 确认后、您可以尝试使用280049进行接收。 同样、您可以尝试 CAN_Ex5_simple_Receive 示例。 所有这些都是经过测试的示例。  

    为您提供的有用资源:

    应用报告 http://www.ti.com/lit/spracq3 描述了很多易于理解的波形、并且还提供了一个在所选位位置引入误差的工具。  

    TRM 章节介绍了 MCU 中的 CAN 协议实现。 即、它解释了寄存器/位的功能。 但是、它并未解释协议本身。 有关协议信息、请参阅以下精彩视频:

    https://training.ti.com/ti-precision-labs-canlinsbc-can-and-can-fd-protocol?context=1139747-1138099-1139707-1138111

    https://training.ti.com/ti-precision-labs-canlinsbc-can-and-can-fd-overview?context=1139747-1138099-1139707-1138109

    https://training.ti.com/ti-precision-labs-canlinsbc-can-physical-layer?context=1139747-1138099-1139707-1138110    

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

    感谢你能抽出时间。

    现在、我已经完全按照您的建议使用 simple_transmit 示例项目。

    当程序运行时(在 while (1)循环中)、CAN-Tx 引脚被拉高。

    这种情况发生在 CAN-A 和 CAN-B 上、这使我认为这可能是软件错误?

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

    此外、回送传输正在工作、状态如下:

    //! 此示例将 CAN 控制器设置为外部环回测试模式。
    //! 发送的数据在 CANTXA/CANATX 引脚上可见、并且在内部接收
    //! 返回 CAN 内核。

    我正在查看带有示波器的 CANTXA 引脚、没有发生传输。

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

    这些是经过测试的示例。 GPIO 选择可能不正确。 即、在代码中为 CAN 功能选择的 GPIO 引脚 不是用于 Launchpad 中 CAN 的引脚。 SPRACE5清楚地说明了如何解决此问题。 另一个要查看的区域是时钟频率。 但是、即使时钟频率不正确、如果收发器连接到 CAN 引脚、在探测 CANTX 引脚时也应该看到一些东西。 CAN 收发器仅连接到 GPIO32和 GPIO33引脚。 这意味着只能将这些引脚用于 CAN 功能、并且只能用作 CAN-A 如上所述、CANB 不能在 Launchpad 中使用。 仅 CANA 可用、仅在 GPIO32和 GPIO33上可用。

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

    感谢你能抽出时间