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
大家好、
我正在尝试使用 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");//在此处停止
}
您好!
您为什么评论了 do while 循环?
此致、
Gautam
Gautham 您好!
我刚才评论了它以便进行调试、我也尝试使用 DO while 循环、但我遇到了相同的问题。