主题中讨论的其他器件:TMS320F28335
我正在尝试使用 CANalyzer 设置与 F28069M Launchpad 的 CAN 通信。 我希望电路板使用 PGN 0xFED9来发送和接收消息。 我已按如下方式配置 CAN 寄存器:
空 InitCAN (空)
{
/*为 CAN 控制寄存器创建影子寄存器结构。
这是必需的、因为只允许对这些寄存器进行32位访问。 16位访问
可能会损坏寄存器的内容。 这是
在16 - 31 */位之间写入位(或位组)时尤其如此
/*初始化 CAN 模块*/
InitECan();
InitECanGpio();
MessageReceivedCount = 0;
/*写入 MSGID 字段*/
EALLOW;
ECANaMboxs.MBOX0.MSGID.ALL = 0x18FED917;//从 IBIS SA 0x17全局发送0x00FED9 (AUXIO1)
ECANaMboxs.MBOX1.MSGID.ALL = 0x18FED927;//从机器 ECM SA 0x27全局接收0x00FED9 (AUXIO1)
// ECANaMboxs.MBOX2.MSGID.ALL = 0x80FDC527;//发送工作工具 ID (PGN 64965/SPN 2902)
EDIS;
/*为邮箱配置掩码*/
ECANaLAMRegs.LAM1.ALL = 0xBF000000;// MBOX1的 MSGID 屏蔽(RX 快速耦合器):b1011110000000000000000000000000000000000000000000000
/*为 eCANA*/配置位定时参数
ECANaShady.CANMC.ALL = ECANaRegs.CANMC.ALL;//保存(CANMC)主控制寄存器
ECanaShady.CANMC.bit.CCR = 1;//设置 CCR = 1
ECANaRegs.CANMC.ALL = ECANaShadure.CANMC.ALL;//设置(CANMC)主控制寄存器
//等待 CPU 被授予更改配置寄存器的权限
操作
{
ECanaShady.canes.all = ECanaRegs.canes.all;//设置(Canes)错误和状态寄存器
} while (ECanaShading.canes.bit.CCE!= 1);//等待 CCE 位被置位。
ECanaShady.CANBTC.ALL = 0;
/*以下块用于90MHz SYSCLKOUT。 (45MHz CAN 模块时钟位速率= 1Mbps
请参阅文件末尾的注释。 *
ECANaShady.CANBTC.bit.BRPREG = 11;// 2表示1Mbps、5表示500kbps、11表示250kbps、23表示125kbps、29表示100kbps
ECANaShady.CANBTC.bit.TSEG2REG = 3;//位时序配置寄存器的时间段2 (以 TQ 单位表示的相位长度) TSEG2 = TSEG2reg + 1
ECANaShady.CANBTC.bit.TSEG1REG = 9;//位时序配置寄存器的时间段1 (CAN 总线上某个位的长度) TSEG1 = TSEG1reg + 1
ECANaShady.CANBTC.bit.SAM = 1;// CAN 模块采样三次并做出多数决策。
ECANaRegs.CANBTC.ALL = ECANaShady.CANBTC.ALL;//设置(CANBTC)位时序配置寄存器
ECANaShady.CANMC.ALL = ECANaRegs.CANMC.ALL;//保存(CANMC)主控制寄存器
ECanaShady.CANMC.bit.CCR = 0;//清除 CCR = 0:CPU 请求正常操作。
ECanaShady.CANMC.bit.ABO = 1;//设置 ABO = 1:自动总线打开。
ECANaRegs.CANMC.ALL = ECANaShadure.CANMC.ALL;//设置(CANMC)主控制寄存器
//等待 CPU 不再具有更改配置寄存器的权限
操作
{
ECanaShady.canes.all = ECanaRegs.canes.all;//设置(Canes)错误和状态寄存器
} while (ECanaShading.canes.bit.CCE!= 0);//等待 CCE 位被清除。
/*将被测邮箱0配置为发送邮箱*/
ECANaShady.CANMD.all = ECANaRegs.CANMD.ALL;//保存(CANMD)消息数据寄存器
ECANaShady.CANMD.bit.md0 = 0;//将邮箱0设置为发送
ECANaRegs.CANMD.ALL = ECANaShadure.CANMD.ALL;//设置(CANMD)消息数据寄存器
/*启用受测邮箱0 */
ECANaShady.CANME.ALL = ECANaRegs.CANME.ALL;//保存(CANME)邮箱使能寄存器
ECANaShady.CANME.bit.ME0 = 1;//启用邮箱0
ECANaRegs.CANME.ALL = ECANaShadure.CANME.ALL;//设置(CANME)邮箱启用寄存器
/*将被测邮箱1配置为接收邮箱*/
ECANaMboxs.MBOX1.MSGID.bit.IDE = 1;//设置具有29位扩展 MSGID 的邮箱1
ECANaShady.CANMD.all = ECANaRegs.CANMD.ALL;//保存(CANMD)消息数据寄存器
ECanaShady.CANMD.bit.MD1 = 1;//将邮箱1设置为接收
ECANaRegs.CANMD.ALL = ECANaShadure.CANMD.ALL;//设置(CANMD)消息数据寄存器
/*启用受测邮箱1 */
ECANaShady.CANME.ALL = ECANaRegs.CANME.ALL;//保存(CANME)邮箱使能寄存器
ECanaShady.CANME.bit.ME1 = 1;//启用邮箱1
ECANaRegs.CANME.ALL = ECANaShadure.CANME.ALL;//设置(CANME)邮箱启用寄存器
///*将被测邮箱2配置为发送邮箱*/
// ECanaShady.CANMD.all = ECANaRegs.CANMD.all;//保存(CANMD)消息数据寄存器
// ECanaShady.CANMD.bit.MD2=0;//将邮箱2设置为发送
// ECANaRegs.CANMD.all = ECANaShady.CANMD.all;//设置(CANMD)消息数据寄存器
//
///*启用待测邮箱2 */
// ECanaShady.CANME.all = ECanaRegs.CANME.all;//设置(CANME)邮箱启用寄存器
// ECanaShady.CANME.bit.ME2 = 1;//启用邮箱2
// ECANaRegs.CANME.ALL = ECANaShady.CANME.ALL;//保存(CANME)邮箱使能寄存器
/*写入主控寄存器中的 DLC 字段*/
ECANaMboxs.MBOX0.MSGCTRL.bit.DLC = 8;//将邮箱0的 DLC 设置为8个字节
ECANaMboxs.MBOX1.MSGCTRL.bit.DLC = 8;//将邮箱1的 DLC 设置为8个字节
// ECANaMboxs.MBOX2.MSGCTRL.bit.DLC = 8;//将邮箱2的 DLC 设置为8个字节
EALLOW;
ECANaRegs.CANMIL-bit.MIL1=0;//清除邮箱中断级别位
ECANaRegs.CANGIM.bit.I0EN=1;//设置全局邮箱中断屏蔽位
ECANaRegs.CANMIM.ALL = 0x00000002;//设置邮箱1的邮箱中断屏蔽寄存器
EDIS;
}
但是、当我运行此代码时、在 将18fed927 00FF00FF00FF0000发送 到 launchpad 时、我会收到一个传输帧错误。 LaunchPad 的接收硬件中断如下所示。
void CAN_HWI (void)
{
// Semaphore_post (CANRXSem);//启用 CANRX_Task 以处理接收到的 CAN 消息
unsigned long long CAN_Data = 0;
操作
{
ECANaShady.CANRMP.ALL = ECANaRegs.CANRMP.ALL;//设置(CANRMP)接收消息挂起寄存器
}
while (ECANaShady.CANRMP.bit.RMP1!= 1);//如果邮箱1没有收到任何消息
ECanaShady.CANRMP.bit.RMP1 = 1;//将邮箱1设置为已收到消息
ECANaRegs.CANRMP.ALL = ECANaShady.CANRMP.ALL;
CAN_Data = ECANaMboxs.MBOX1.MDH.ALL +(ECANaMboxs.MBOX1.MDL.ALL * 4294967296L);//接收邮箱1中的消息
Mailbox_post (CANMbx、CAN_Data、BIOS_NO_WAIT);//等待您从 CANaylzer 接收到数据
PieCtrlRegs.PIEACK.bit.ACK9 = 1;
}
我出了什么问题?
