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 传输 F28335实验套件

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/624040/ccs-tms320f28335-continuous-can-transmission-f28335-experimenter-kit

器件型号:TMS320F28335
主题中讨论的其他器件:C2000WARE

工具/软件:Code Composer Studio

大家好、  

我正在尝试使用 F28335实验套件的 CAN 模块。 问题是我无法连续通信(无限循环)。

数据只传输一次、然后停止传输。 变速器 LED 将亮起1秒钟并停止。 我在此附上正在使用的代码。

我试了1) for (;)

     2) while (1)  

如果要对代码进行任何更改、请建议我。

// TI 文件$Revision:/main/2 $
//签入$Date:2009年7月30日18:44:22 $
//################################################################################################
//文件名:Example_28xECAN_A_TO_B_Xmit.c
//
说明:eCAN-A 至 eCAN-B TXLOOP -发送循环
//
假设:
//
//此程序需要 DSP2833x 头文件。
//
/// 2833x DSP 的两个 CAN 端口需要相互连接
//(通过 CAN 收发器)
//
eCANA 位于 GPIO31 (CANTXA)和
// GPIO30 (CANRXA)
//
// eCANB 位于 GPIO8 (CANTXB)和
// GPIO10 (CANRXB)
//
//根据提供的信息,此项目被配置为“引导至 SARAM”
//操作。 2833x 引导模式表如下所示。
//有关配置 eZdsp 引导模式的信息,
//请参阅 eZdsp 附带的文档,
//
$Boot_Table:
//
// GPIO87 GPIO86 GPIO85 GPIO84
// XA15 XA14. XA13. XA12
// PU PU PU PU
// ================================================================================
// 1 1 1 1跳转至闪存
// 1 1 1 0 SCI-A 引导
// 1 1 0 1个 SPI-A 引导
// 1 1 0 0 I2C-A 引导
// 1 0 1 1 eCAN-A 引导
// 1 0 1 0 McBSP-A 引导
// 1 0 0 1跳转至 XINTF x16
// 1 0 0 0跳转至 XINTF x32
// 0 1 1 1跳转至 OTP
// 0 1 1 0并行 GPIO I/O 引导
// 0 1 0 1个并行 XINTF 引导
// 0 1 0 0跳转至 SARAM<-"boot to SARAM"
// 0 0 1 1分支以检查引导模式
// 0 0 1 0引导至闪存、旁路 ADC 校准
// 0 0 0 1引导至 SARAM、旁路 ADC 校准
// 0 0 0 0引导至 SCI-A、旁路 ADC 校准
// BOOT_Table_END$
//
说明:
//
//此示例使用 MAILBOX5将数据传输到另一个 CAN 模块
//此程序可以永久循环或传输"n"次数,
//其中"n"为 TXCOUNT 值。
//
//此示例可用于检查 CAN-A 和 CAN-B 由于 CAN-B 在
DSP2833x_eCAN-c 中被//初始化、它将确认
运行此代码的节点发送的所有帧//。
// 2833x DSP 的两个 CAN 端口需要相互连接(通过 CAN 收发器)
//
//##################################################################################
//原始作者:HJ
//
//$TI 发行版:2833x/2823x 头文件 v1.32 $
//$发行 日期:2010年6月28日$
//##################################################################

#include "DSP28x_Project.h" //设备头文件和示例包括文件

#define TXCOUNT 100 //传输将发生(TXCOUNT)次。

//
此示例 long 的 Globals I;
长循环计数= 0;


void main()
{

//为 CAN 控制寄存器创建影子寄存器结构。
这是必需的、因为只允许对这些寄存器进行32位访问。 对
这些寄存器的16位访问可能会破坏寄存器内容。
当写入位16 - 31 */

struct ECAN_REGS 的位(或位组)时尤其如此;

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

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

//针对此示例只初始化 eCAN 引脚
//此函数位于 DSP2833x_eCAN-c
InitECANGpio ();

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

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

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

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

//此示例中使用的中断被重新映射到
这个文件中的// ISR 函数。

//此示例中未使用中断。

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

//在本例中仅初始化 eCAN-A 和 eCAN-B
//此函数位于 DSP2833x_eCAN-c
InitECan ()中;

//步骤5。 用户特定代码:

//写入 MSGID 字段*/

ECANaMboxs.MBOX25.MSGID.ALL = 0x95555555;//扩展标识

符//将





邮箱配置为发送邮箱*/ ECANaMD. CANMD.ALL = ECANaRegs.CANMD.ALL;ECANaME CANMME.bit.ECANA

Shadow = ECANAN.0*= ECANA CANCANA REGN.CAN.CAN.CAN.CANA REGL.ALL;ECANCAN.CANA CAN.CAN.CANA CAN.CAN.CAN.CANA CAN.CAN.CAN.CAN.CANA CAN.CAN.CAN.CAN.CAN.CAN.CAN.REGANGL.ALL = En = ECANA CAN.CAN.CAN.CAN.CAN.CAN.CAN.CAN.CAN.CAN.CAN.CANA CAN.CAN.CAN.CAN.CAN



/*写入主控寄存器中的 DLC 字段*/

ECANaMboxs.MBOX25.MSGCTRL.bit.DLC = 8;

//写入邮箱 RAM 字段*/

ECANaMboxs.MBOX25.MDL.all = 0x55555555;
ECANaMboxs.MBOX25.MDH.ALL = 0x555555

;



//开始传输时*
ECanaShady.CANTRS.ALL = 0;
ECanaShady.CANTRS.bit.TRS25 = 1; //为待测试的邮箱设置 TRS
ECANaRegs.CANTRS.ALL = ECANaShady.CANTRS.ALL;

/*执行
{
ECanaShady.Canta.all = ECanaRegs.Canta.all;
} while (ECANaShady.CANTa.bit.TA25 =0);*///等待 TA5位被置位。


ECanaShading.Canta.all = 0;
ECanaShading.Canta.bit.TA25 = 1;//清除 TA5
ECanaRegs.Canta.all = ECanaShady.Canta.all;

循环计数++;
}
asm (" ESTOP0");//在此处停止
}


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我写信告诉您、C2000团队成员已被分配到此帖子、应该很快回答。

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

    您好!

    您为什么评论了 do while 循环?

    此致、

    Gautam

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

    有关最新示例、请参阅 C2000Ware 中的 F2833x 部分。

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

    Gautham 您好!

    我刚才评论了它以便进行调试、我也尝试使用 DO while 循环、但我遇到了相同的问题。