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.

[参考译文] CCS/TMS320F28335:用于 CAN 总线上连续按摩传输/接收的程序

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/593126/ccs-tms320f28335-program-for-continuous-massage-transmission-receive-on-can-bus

器件型号:TMS320F28335

工具/软件:Code Composer Studio

您好!

我想将 F28335的控制套件 eCAN 示例更改为通过 CAN 总线连续发送消息。 我已按照以下所述修改了该程序。 但我看不到 CAN 引脚上有任何变化(即 eCANA 31和30)。

基本上、我想要一个程序、通过 CAN 发送按摩、并接受一些相同的按摩。

如果我们现在没有使用任何 CAN 收发器与控制器一起使用、还有一个问题是可以通过示波器查看控制器 CAN 引脚的信号变化。(在传输模式下)

此致、

Vishal

脚本如下所示:


#include "DSP28x_Project.h"//器件头文件和示例 include 文件


uint32传递计数=0;


void main (void)


// eCAN 控制寄存器要求使用32位进行读/写访问。 因此、我们
//将为此示例创建一组影子寄存器。 阴影
//将使用寄存器来确保访问是32位而不是16位。
struct eCAN-regs ECanaShadow;

//步骤1. 初始化系统控制:
// PLL、安全装置、启用外设时钟
//此示例函数位于 DSP2833x_SYSCTRL.c 文件中。
InitSysCtrl();

//步骤2. 初始化 GPIO:
//此示例函数位于 DSP2833x_GPIO.c 文件和中
//说明了如何将 GPIO 设置为其默认状态。
// InitGpio();//针对此示例跳过

//对于此示例、使用此处的 GPIO 寄存器配置 CAN 引脚
//此函数位于 DSP2833x_eCAN-c 中
InitECanGpio();

//步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
Dint;

//将 PIE 控制寄存器初始化为默认状态。
//默认状态为禁用所有 PIE 中断和标志
//被清除。
//此函数位于 DSP2833x_PIECTRL.c 文件中。
InitPieCtrl();

//禁用 CPU 中断并清除所有 CPU 中断标志:
IER = 0x0000;
IFR = 0x0000;

//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表,即使是中断也是如此
//在本例中未使用。 这对于调试很有用。
//可以在 DSP2833x_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 DSP2833x_PieVect.c 中找到
InitPieVectTable();

//步骤4. 初始化所有器件外设:
//此函数位于 DSP2833x_InitPeripherals.c 中
// InitPeripherals ();//此示例不需要

//步骤5. 特定于用户的代码、启用中断:


InitECANa();//初始化 eCAN-A 模块

//邮箱一次可以写入16位或32位
//写入发送邮箱 MBOX0 - 15的 MSGID 字段
ECANaMboxs.MBOX0.MSGID.ALL = 0x9555AAA0;

//写入接收邮箱 MBOX16 - 31的 MSGID 字段


//将邮箱0-15配置为 Tx,将16-31配置为 Rx
//因为该写入是对整个寄存器(而不是位)的
//字段)不需要影子寄存器。
ECANaRegs.CANMD.ALL = 0xFFFFFF0000;

//启用所有邮箱*/
//因为该写入是对整个寄存器(而不是位)的
//字段)不需要影子寄存器。
ECANaRegs.CANME.ALL = 0xFFFFFFFF;

//指定将发送/接收8位
ECANaMboxs.MBOX0.MSGCTRL.bit.DLC = 8;

//写入 MBOX0 - 15的邮箱 RAM 字段
ECANaMboxs.MBOX0.MDL.ALL = 0x9555AAA0;
ECANaMboxs.MBOX0.MDH.ALL = 0x89ABCDEF;

//因为该写入是对整个寄存器(而不是位)的
//字段)不需要影子寄存器。
EALLOW;
ECANaRegs.CANMIM.ALL = 0xFFFFFFFF;

//将 eCAN 配置为自检模式
//启用 eCAN 的增强功能。
EALLOW;
ECanaShady.CANMC.ALL = ECanaRegs.CANMC.ALL;
ECANaShady.CANMC.bit.STM = 0;//将 CAN 配置为自检模式
ECanaRegs.CANMC.ALL = ECanaShadure.CANMC.ALL;
EDIS;

//开始传输
for (;;)

PassCount++;
ECANaRegs.CANTRS.ALL = 0x00000001;//为所有发送邮箱设置 TRS
while (ECanaRegs.Canta.all!= 0x00000001){}//等待所有 Tan 位被置位。

ECanaRegs.Canta.all = 0x00000001;//清除所有 Tan


//从接收邮箱读取并开始检查数据*/


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

    您甚至需要一个连接到 CANTX 引脚的收发器来查看波形。 如果您没有连接第二个节点、帧将被永久重新传输。 您可以在示波器中看到这一点。

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

    为什么需要至少多一个节点:

     

    当一个节点在 CAN 总线上传输帧时、它需要至少一个网络上的其他节点发送一个 ACKnowledgement。 提供 ACK 的接收节点不需要成为帧的目标接收节点、尽管它很可能是帧的目标接收节点。 当发送节点没有收到 ACK 时、它会导致确认错误、并且会一直重复传输帧。 在这种情况下、发送邮箱的 TA 位根本没有被设置、代码将永远循环在那里。 也不会生成中断。 如果无法连接另一个节点、请在自检模式下运行此代码。 为了正常运行、所有 CAN 节点的 CAN_H 引脚必须连接在一起、CAN_L 引脚也必须连接在一起。 总线还应在两端(仅限)正确端接。

     

    为什么需要收发器:

     

    您不能将节点 A 的 CANTX 直接连接到节点 B 的 CANRX、反之亦然、并期望 CAN 通信成功。 在这种情况下、CAN 与其他串行接口不同、例如 SCI、SPI 或 McBSP。 例如、SCI 可与 RS232收发器配合使用或通过直接连接。 然而、CAN 总线需要一个 CAN 收发器。 为什么需要收发器? 除了转换单端 CAN 信号以进行差分传输、收发器还将 CANTX 回路到节点的 CANRX 引脚。 这是因为 CAN 节点需要能够监控其自身的传输。 为什么? 这与 CAN 协议规定的 ACK 要求有关。 当一个节点在 CAN 总线上传输帧时、它需要至少一个网络上的其他节点发送一个 ACKnowledgement。 提供 ACK 的接收节点不必是帧的预期接收节点、尽管它可能很好。 当发送节点没有收到 ACK 时、它会导致确认错误、并且会一直重复传输帧。 在这种情况下、发送邮箱的 TA 位根本没有被设置、代码将永远循环在那里。 也不会生成中断。 对于 ACK 阶段、发送器输出1并期望读回0。

     

    如果您不熟悉 CAN、我强烈建议您从 TI 网站下载 SLOA101A 并阅读封面到封面。

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

    另一个非常适合了解物理层的 app.note 是 SLYT529 e2e.ti.com/.../Debugging_5F00_CAN_2D00_PHY_2D00_SLYT529.pdf