工具/软件:TI C/C++编译器
我正在尝试使用 TMS320F 28335测试 CAN Tx 和 Rx 消息。
我面临以下代码的问题、并附上我的 main.c
为什么始终在以下模式中控制器
操作
{
ECanaShady.canes.all = ECanaRegs.canes.all;
} while (ECanaShading.canes.bit.CCE!= 1); //等待 CCE 位被置位。
我签入了 CANES 寄存器值
/*============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
头文件
==================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== *
#include
#include "IQmathLib.h" /* IQmath 库的 include 标头*
//#include "DSP2833x_Device.h" // DSP2833x 头文件包含文件
//#include "DSP2833x_Device.h" // DSP2833x 头文件包含文件
//#include "DSP2833x_examples.h"
#include "DSP2833x_Device.h" // DSP2833x 头文件包含文件
#include "DSP2833x_examples.h"
//#include "pmci.h"
//#include "parameter.h"
//#include "build.h"
//#include "DSP2833x_GlobalPrototypes.h"//用于设置 SCI、SPI 和 XF
void mailbox_check (int32 T1、int32 T2、int32 T3);
void mailbox_read (int16 i);
//此示例的全局变量
uint32 错误计数;
uint32 MessageReceivedCount;
UINT32 TestMbox1 = 0;
UINT32 TestMbox2 = 0;
uint32 TestMbox3 = 0;
/*int main (空)
{
//InitECana();
Hwi_CAN_init();
// CANtransmit ();
//CAN_receive();
返回0;
}
*
void main (void)
{
uint16 i、j;
// eCAN 控制寄存器要求使用32位进行读/写访问。 因此、我们
//将为此示例创建一组影子寄存器。 阴影
//将使用寄存器来确保访问是32位而不是16位。
struct eCAN-regs ECanaShadow;
//步骤1. 初始化系统控制:
// PLL、安全装置、启用外设时钟
//此示例函数位于 DSP281x_SYSCTRL.c 文件中。
InitSysCtrl();
//步骤2. 初始化 GPIO:
//此示例函数位于 DSP281x_GPIO.c 文件和中
//说明了如何将 GPIO 设置为其默认状态。
//InitGpio(); //针对此示例跳过
//步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
Dint;
//将 PIE 控制寄存器初始化为默认状态。
//默认状态为禁用所有 PIE 中断和标志
//被清除。
//此函数位于 DSP281x_PIECTRL.c 文件中。
// InitPieCtrl();//已跳过此示例
//禁用 CPU 中断并清除所有 CPU 中断标志:
IER = 0x0000;
IFR = 0x0000;
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表,即使是中断也是如此
//在本例中未使用。 这对于调试很有用。
//可以在 DSP281x_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 DSP281x_PieVect.c 中找到
// InitPieVectTable(); //针对此示例跳过
//步骤4. 初始化所有器件外设:
//此函数位于 DSP281x_InitPeripherals.c 中
// InitPeripherals ();//此示例不需要
//步骤5. 特定于用户的代码
MessageReceivedCount = 0;
错误计数= 0;
EALLOW;
SysCtrlRegs.PCLKCR0.bit.ECANAENCLK= 1; // 启用系统时钟到 eCAN-A
GpioCtrlRegs.GPAPUD.ALL = 0x0000; //上拉使能 GPIO0-GPIO31
InitECan(); //初始化 eCAN 模块
//邮件可以一次写入16位或32位
//写入发送邮箱 MBOX0 - 15的 MSGID 字段
ECANaMboxs.MBOX0.MSGID.ALL = 0x9555AAA0;
ECANaMboxs.MBOX1.MSGID.ALL = 0x9555AAA1;
ECANaMboxs.MBOX2.MSGID.ALL = 0x9555AAA2;
ECANaMboxs.MBOX3.MSGID.ALL = 0x9555AAA3;
ECANaMboxs.MBOX4.MSGID.ALL = 0x9555AAA4;
ECANaMboxs.MBOX5.MSGID.ALL = 0x9555AAA5;
ECANaMboxs.MBOX6.MSGID.ALL = 0x9555AAA6;
ECANaMboxs.MBOX7.MSGID.ALL = 0x9555AAA7;
ECANaMboxs.MBOX8.MSGID.ALL = 0x9555AAA8;
ECANaMboxs.MBOX9.MSGID.ALL = 0x9555AAA9;
ECANaMboxs.MBOX10.MSGID.ALL = 0x9555AAAA;
ECANaMboxs.MBOX11.MSGID.ALL = 0x9555AAAB;
ECANaMboxs.MBOX12.MSGID.ALL = 0x9555AAAC;
ECANaMboxs.MBOX13.MSGID.ALL = 0x9555AAAD;
ECANaMboxs.MBOX14.MSGID.ALL = 0x9555AAAE;
ECANaMboxs.MBOX15.MSGID.ALL = 0x9555AAAF;
//写入接收邮箱 MBOX16 - 31的 MSGID 字段
ECANaMboxs.MBOX16.MSGID.ALL = 0x9555BBB0;
ECANaMboxs.MBOX17.MSGID.ALL = 0x9555BBB1;
ECANaMboxs.MBOX18.MSGID.ALL = 0x9555BBB2;
ECANaMboxs.MBOX19.MSGID.ALL = 0x9555BBB3;
ECANaMboxs.MBOX20.MSGID.ALL = 0x9555BBB4;
ECANaMboxs.MBOX21.MSGID.ALL = 0x9555AAA5;
ECANaMboxs.MBOX22.MSGID.ALL = 0x9555AAA6;
ECANaMboxs.MBOX23.MSGID.ALL = 0x9555AAA7;
ECANaMboxs.MBOX24.MSGID.ALL = 0x9555AAA8;
ECANaMboxs.MBOX25.MSGID.ALL = 0x9555AAA9;
ECANaMboxs.MBOX26.MSGID.ALL = 0x9555AAAA;
ECANaMboxs.MBOX27.MSGID.ALL = 0x9555AAAB;
ECANaMboxs.MBOX28.MSGID.ALL = 0x9555AAAC;
ECANaMboxs.MBOX29.MSGID.ALL = 0x9555AAAD;
ECANaMboxs.MBOX30.MSGID.ALL = 0x9555AAAE;
ECANaMboxs.MBOX31.MSGID.ALL = 0x9555AAAF;
//将邮箱0-15配置为 Tx,将16-31配置为 Rx
//因为该写入是对整个寄存器(而不是位)的
//字段)不需要影子寄存器。
ECANaRegs.CANMD.ALL = 0xFFFFFF0000;
//启用所有邮箱*/
//因为该写入是对整个寄存器(而不是位)的
//字段)不需要影子寄存器。
ECANaRegs.CANME.ALL = 0xFFFFFFFF;
//ECanaRegs.CANME.ALL = 0x00010001;
//指定将发送8位
ECANaMboxs.MBOX0.MSGCTRL.bit.DLC = 8;
ECANaMboxs.MBOX1.MSGCTRL.bit.DLC = 8;
ECANaMboxs.MBOX2.MSGCTRL.bit.DLC = 8;
ECANaMboxs.MBOX3.MSGCTRL.bit.DLC = 8;
ECANaMboxs.MBOX4.MSGCTRL.bit.DLC = 8;
ECANaMboxs.MBOX5.MSGCTRL.bit.DLC = 8;
ECANaMboxs.MBOX6.MSGCTRL.bit.DLC = 8;
ECANaMboxs.MBOX7.MSGCTRL.bit.DLC = 8;
ECANaMboxs.MBOX8.MSGCTRL.bit.DLC = 8;
ECANaMboxs.MBOX9.MSGCTRL.bit.DLC = 8;
ECANaMboxs.MBOX10.MSGCTRL.bit.DLC = 8;
ECANaMboxs.MBOX11.MSGCTRL.bit.DLC = 8;
ECANaMboxs.MBOX12.MSGCTRL.bit.DLC = 8;
ECANaMboxs.MBOX13.MSGCTRL.bit.DLC = 8;
ECANaMboxs.MBOX14.MSGCTRL.bit.DLC = 8;
ECANaMboxs.MBOX15.MSGCTRL.bit.DLC = 8;
//写入 MBOX0 - 15的邮箱 RAM 字段
//ECanaMboxs.MBOX0.MDL.all = 0x9555AAA0;
//ECANaMboxs.MBOX0.MDH.ALL = 0x89ABCDEF;
ECANaMboxs.MBOX0.MDL.ALL = 0x11223344;
ECANaMboxs.MBOX0.MDH.ALL = 0x55667788;
ECANaMboxs.MBOX1.MDL.ALL = 0x9555AAA1;
ECANaMboxs.MBOX1.MDH.ALL = 0x89ABCDEF;
ECANaMboxs.MBOX2.MDL.ALL = 0x9555AAA2;
ECANaMboxs.MBOX2.MDH.ALL = 0x89ABCDEF;
ECANaMboxs.MBOX3.MDL.ALL = 0x9555AAA3;
ECANaMboxs.MBOX3.MDH.ALL = 0x89ABCDEF;
ECANaMboxs.MBOX4.MDL.ALL = 0x9555AAA4;
ECANaMboxs.MBOX4.MDH.ALL = 0x89ABCDEF;
ECANaMboxs.MBOX5.MDL.ALL = 0x9555AAA5;
ECANaMboxs.MBOX5.MDH.ALL = 0x89ABCDEF;
ECANaMboxs.MBOX6.MDL.ALL = 0x9555AAA6;
ECANaMboxs.MBOX6.MDH.ALL = 0x89ABCDEF;
ECANaMboxs.MBOX7.MDL.ALL = 0x9555AAA7;
ECANaMboxs.MBOX7.MDH.ALL = 0x89ABCDEF;
ECANaMboxs.MBOX8.MDL.ALL = 0x9555AAA8;
ECANaMboxs.MBOX8.MDH.ALL = 0x89ABCDEF;
ECANaMboxs.MBOX9.MDL.ALL = 0x9555AAA9;
ECANaMboxs.MBOX9.MDH.ALL = 0x89ABCDEF;
ECANaMboxs.MBOX10.MDL.ALL = 0x9555AAAA;
ECANaMboxs.MBOX10.MDH.ALL = 0x89ABCDEF;
ECANaMboxs.MBOX11.MDL.ALL = 0x9555AAAB;
ECANaMboxs.MBOX11.MDH.ALL = 0x89ABCDEF;
ECANaMboxs.MBOX12.MDL.ALL = 0x9555AAAC;
ECANaMboxs.MBOX12.MDH.ALL = 0x89ABCDEF;
ECANaMboxs.MBOX13.MDL.ALL = 0x9555AAAD;
ECANaMboxs.MBOX13.MDH.ALL = 0x89ABCDEF;
ECANaMboxs.MBOX14.MDL.ALL = 0x9555AAAE;
ECANaMboxs.MBOX14.MDH.ALL = 0x89ABCDEF;
ECANaMboxs.MBOX15.MDL.ALL = 0x9555AAAF;
ECANaMboxs.MBOX15.MDH.ALL = 0x89ABCDEF;
//将 eCAN 配置为自检模式
//启用 eCAN 的增强功能。
ECanaShady.CANMC.ALL = ECanaRegs.CANMC.ALL;
ECANaShady.CANMC.bit.STM = 1; //将 CAN 配置为自检模式
ECanaRegs.CANMC.ALL = ECanaShadure.CANMC.ALL;
/*为 eCANA BaudRates 配置位时序参数*/
ECanaShady.CANMC.ALL = ECanaRegs.CANMC.ALL;
ECanaShady.CANMC.bit.CCR = 1; //设置 CCR = 1
ECanaRegs.CANMC.ALL = ECanaShadure.CANMC.ALL;
ECanaShady.canes.all = ECanaRegs.canes.all;
操作
{
ECanaShady.canes.all = ECanaRegs.canes.all;
} while (ECanaShading.canes.bit.CCE!= 1); //等待 CCE 位被置位。
ECanaShady.CANBTC.ALL = 0;
DSP2833x_Examples.h 中定义了#IF (CPU_FRQ_150MHz)// CPU_FRQ_150MHz
/*针对所有150MHz SYSCLKOUT (75MHz CAN 时钟)的以下模块-缺省值。 比特率= 1Mbps
请参阅文件末尾的注释*/
ECANaShady.CANBTC.bit.BRPREG = 9;//对于1Mbps 为4;对于500Kbps 为9;对于250kbps 为19;对于125Kbps 为39;对于100Kbps 为49
ECANaShady.CANBTC.bit.TSEG2REG = 2;
ECANaShady.CANBTC.bit.TSEG1REG = 10;
#endif
DSP2833x_Examples.h 中定义了#IF (CPU_FRQ_100MHz)// CPU_FRQ_100MHz
/*以下块仅用于100MHz SYSCLKOUT (50MHz CAN 时钟)。 比特率= 1Mbps
请参阅文件末尾的注释*/
ECANaShady.CANBTC.bit.BRPREG = 4;//对于1Mbps 为4;对于500Kbps 为9;对于250kbps 为19;对于125Kbps 为39;对于100Kbps 为49
ECANaShady.CANBTC.bit.TSEG2REG = 1;
ECANaShady.CANBTC.bit.TSEG1REG = 6;
#endif
ECanaShading.CANBTC.bit.SAM = 1;
ECANaRegs.CANBTC.ALL = ECANaShady.CANBTC.ALL;
ECanaShady.CANMC.ALL = ECanaRegs.CANMC.ALL;
ECanaShady.CANMC.bit.CCR = 0; //设置 CCR = 0
ECanaRegs.CANMC.ALL = ECanaShadure.CANMC.ALL;
ECanaShady.canes.all = ECanaRegs.canes.all;
操作
{
ECanaShady.canes.all = ECanaRegs.canes.all;
} while (ECanaShading.canes.bit.CCE!= 0); //等待 CCE 位 被清除。
//
如果(1){//表示 CAN A
//GpioCtrlRegs.GPADIR.bit.GPIO30 = 0; //0=输入、 1=输出
//GpioCtrlRegs.GPADIR.bit.GPIO31 = 1; //0=输入、 1=输出
//GpioCtrlRegs.GPAQSEL2.ALL = 0x0000; // GPIO16-GPIO31同步到 SYSCLKOUT
//GpioCtrlRegs.GPAQSEL1.ALL = 0x05000000L; //所有组 A GPIO 0-15均无资格认证
//GpioCtrlRegs.GPAQSEL2.ALL = 0x00000000L; //所有组 A GPIO 16-31均无限定条件
GpioCtrlRegs.GPAPUD.bit.GPIO30 = 0; //启用 GPIO30上的上拉
GpioCtrlRegs.GPAPUD.bit.GPIO31 = 0; //启用 GPIO31上的上拉
GpioCtrlRegs.GPAQSEL2.bit.GPIO31 = 3;//异步输入
GpioCtrlRegs.GPAMUX2.bit.GPIO30 = 1;//GPIO30:0=GPIO、1=CANRXA 2=rsvd 3=rsvd
GpioCtrlRegs.GPAMUX2.bit.GPIO31 = 1;//GPIO31:0=GPIO、1=CANTXA 2=rsvd 3=rsvd
// GpioCtrlRegs.GPACTRL.ALL = 0x00003200L; //对于所有组 A GPIO,QUALPRD = SYSCLKOUT
}
else{//用于 General Pugose IO
GpioCtrlRegs.GPAMUX2.bit.GPIO30 = 0;//GPIO30:0=GPIO、1=CANRXA 2=rsvd 3=rsvd
GpioCtrlRegs.GPAMUX2.bit.GPIO31 = 0;//GPIO31:0=GPIO、1=CANTXA 2=rsvd 3=rsvd
GpioCtrlRegs.GPADIR.bit.GPIO30 = 0; //0 =输入、 1 =输出
GpioCtrlRegs.GPADIR.bit.GPIO31 = 0; //0 =输入、 1 =输出
GpioCtrlRegs.GPAQSEL2.ALL = 0x0000; // GPIO16-GPIO31同步到 SYSCLKOUT
};
//GpioDataRegs.GPADD.bit.GPIO31 = 1;
//GpioDataRegs.GPASET.bit.GPIO31 =1;
// for (i=0;i<1000;i++){//delay
// GpioDataRegs.GPADAT.bit.GPIO31 = 0;
//GpioDataRegs.GPACLEAR.bit.GPIO30 = 1;
// 8.
EDIS;
//开始传输
while (1)
{
//********
// GpioDataRegs.GPADAT.bit.GPIO31 = 1;
//GpioDataRegs.GPASET.bit.GPIO31 =1;
// for (i=0;i<1000;i++){//delay
// GpioDataRegs.GPADAT.bit.GPIO31 = 0;
//GpioDataRegs.GPACLEAR.bit.GPIO30 = 1;
//*********
ECANaRegs.CANTRS.ALL = 0x0000FFFC; //为所有发送邮箱设置 TRS
while (ECanaRegs.Canta.all!= 0x0000FFFC){} //等待所有 Tan 位被置位。
ECanaRegs.Canta.all = 0x0000FFFC; //清除所有 Tan
MessageReceivedCount++;
//从接收邮箱读取并开始检查数据*/
对于(j=16;j<31;j++) //读取并检查16个邮箱
{
mailbox_read (j); //此 func 读取指定的邮箱数据
Mailbox_check (TestMbox1、TestMbox2、TestMbox3);//检查接收到的数据
}
}
}
//此函数读取所示内容
//按邮箱号(MBXnbr)。
void mailbox_read (int16 MBXnbr)
{
volatile struct MBOX *邮箱;
邮箱=&ECanaMbboxs.MBOX0 + MBXnbr;
TestMbox1 =邮箱->MDL.all;//= 0x9555AAAn (n 是 MBX 编号)
TestMbox2 =邮箱->MDH.all;//= 0x89ABCDEF (常量)
TestMbox3 =邮箱->MSGID.ALL;//= 0x9555BBBn (n 是 MBX 编号)
}//将 rcv MBX 的 MSGID 作为 MDL 数据进行传输。
void mailbox_check (int32 T1、int32 T2、int32 T3)
{
if ((T1!= T3)||(T2!= 0x89ABCDEF))
{
错误计数++;
}
}
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
//不再需要。
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
/*注意:
如281x 器件勘误表(SPRZ193)中所示、双读/双写应该是
用于访问邮箱 RAM 和 LAM/MOTO/MOTS 区域。 但请注意、是的
只有在访问邮箱 RAM 和 LAM/MOTO/MOTS 区域时、勘误表才适用
相同的时间。 头文件示例在自检模式下运行、不可能
一个争用。 因此、未实现该变通办法。 与之通信时的电压
另一个节点处于非自检模式)、必须包含该变通办法。
*
在这里、我要附加 CANES 寄存器的屏幕截图以及值
