主题中讨论的其他器件:TMS320F28335
您好!
我在 eCAN 的实施中遇到了一个问题、它不发送数据和接收数据。 代码中没有显示错误。
在代码下方:
#include "F2806x_Device.h"
#include "DSP28x_Project.h"
#define RX_BUFFER_SIZE 16
UINT32 RxBuffer[RX_BUFFER_SIZE];
UINT32 RxBufferIndex = 0;
void InitECAN (void);
void CAN_TransmitMessage (void);
void CAN_ReceiveMessage (void);
__interrupt void CanIsr (void);
UINT32 TxMsgCount = 0;
UINT32 RxMsgCount = 0;
UINT8 eCAN_Rx_BYTE = 0;
uint8 eCAN_Rx_buff [64];
空 main (void)
{
//系统初始化
InitSysCtrl();
//禁用所有中断
Dint;
//初始化所有中断线路的 pie 矢量
InitPieCtrl();
//禁用所有 CPU 中断
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;
PieVectTable.ECAN0INTA =&CANIsr;
EDIS;
////启用全局中断和更高优先级的实时调试
PieCtrlRegs.PIEIER1.bit.INTx1 =1;//在 PIE 中启用 INT 1.1
IER |=M_INT1;//启用 CPU 中断
EINT;//启用全局中断
ERTM;//启用全局中断实时调试
InitECAN();
用于(;;)
{
DELAY_US (1000);
CAN_TransmitMessage();
CAN_ReceiveMessage();
}//用于结束
}//main end
空 InitECAN (空)
{
EALLOW;
//启用 ECAN 模块时钟
SysCtrlRegs.PCLKCR0.bit.ECANAENCLK = 1;
//为 ECAN-A 配置 GPIO 引脚
GpioCtrlRegs.GPAPUD.bit.GPIO30 = 0;//启用 GPIO30的上拉电阻(CANRXA)
GpioCtrlRegs.GPAPUD.bit.GPIO31 = 0;//启用 GPIO31的上拉电阻(CANTXA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO30 = 3;//异步输入 GPIO30 (CANRXA)
GpioCtrlRegs.GPAMUX2.bit.GPIO30 = 1;//将 GPIO30配置为 CANRXA
GpioCtrlRegs.GPAMUX2.bit.GPIO31 = 1;//将 GPIO31配置为 CANTXA
//配置 CAN 控制器
ECanaRegs.CANGAM.bit.AMI = 1;//全局接受屏蔽模式
ECanaRegs.CANMIM.all = 0;//清除所有邮箱以接收任何消息
ECanaRegs.CANGIF1.all = 0x01FF;//清除所有中断标志
ECanaRegs.CANMIL.all = 0;//清除所有邮箱中断级别
ECanaRegs.CANMIM.bit.MIM0 = 1;//启用邮箱0中断
ECanaRegs.CANMIL.bit.MIL0 = 1;//设置邮箱0中断级别
//配置邮箱0以进行接收
ECanaMBboxes.MBOX0.MSGCTRL.bit.DLC = 8;//数据长度代码
ECanaMbags.MBOX0.MSGID.bit.ide = 0;//标准标识符
ECanaMbags.MBOX0.MSGID.all = 0x201;//消息 ID (11位)
ECanaMBboxs.MBOX0.MSGID.bit.AME = 0;//接受屏蔽被禁用
ECanaMbags.MBOX0.MSGID.bit.AAM = 0;//接受屏蔽无关
ECanaRegs.CANMD.all = 0;//清除邮箱方向位
ECanaRegs.CANMD.bit.md0 = 1;//邮箱0是接收邮箱
//配置邮箱1以进行传输
ECanaMBboxes.MBOX1.MSGCTRL.bit.DLC = 8;//数据长度代码
ECanaMboxes.MBOX1.MSGID.bit.ide = 0;//标准标识符
ECanaMbags.MBOX1.MSGID.all = 0x200;//消息 ID (11位)
ECanaMboxes.MBOx1.MSGID.bit.AME = 0;//接受屏蔽被禁用
ECanaMbags.MBOX1.MSGID.bit.AAM = 0;//接受屏蔽无关
ECanaRegs.CANMD.bit.MD1 = 0;//邮箱1是发送邮箱
//启用 ECAN 中断
ECanaRegs.CANMIM.bit.MIM0 = 1;//启用邮箱0中断
//在 CAN 控制寄存器中启用全局中断(GINT)
ECanaRegs.CANGIF1.all = 0xFFFFFFFF;//清除所有中断标志
ECanaRegs.CANGIM.bit.gil = 1;//启用全局中断线路 l`
//在 PIE 中启用 CAN 中断
PieCtrlRegs.PIEIER9.bit.INTx5 = 1;//在 PIE 中启用 ECAN-A0中断
IER |= M_INT9;//启用组9中断
EINT;//启用全局中断
ERTM;//启用全局实时中断
//启动 CAN 模块
// ECanaRegs.CANGAM.bit.ami = 1;
ECanaRegs.CANMC.bit.CCR = 1;//设置 CCR 以配置 CAN 控制器
while (ECanaRegs.canes.bit.CCE!= 0);//等待 CCE 被清零
{
}
//将 eCAN 配置为自检模式
ECanaRegs.CANMC.bit.STM = 0;
EDIS;
}
void CAN_TransmitMessage (void)
{
//检查邮箱1的发送请求(TXRQST)是否设置
如果(ECanaRegs.CANA.bit.TA1 = 1)
{
//将 TXRQST 位清零以确认请求
ECanaRegs.CANA.bit.TA1 = 1;
//递增发送消息计数
TxMsgCount++;
ECanaMboxes.MBOX1.MDL.all = 0x01001010;
ECanaMboxes.MBOX1.MDH.all = 0x10101010;
ECanaRegs.CANTRS.all =(1 << 0);
}
}
void CAN_ReceiveMessage (void)
{
//检查邮箱0是否设置了新数据标志
如果(ECanaRegs.CANRMP.bit.RMP0 = 1)
{
//从邮箱0复制接收到的数据
RxBuffer[RxBufferIndex]= ECanaMBboxes.MBOX0.MDL.all;
RxBuffer[RxBufferIndex + 1]= ECanaMBags.MBOX0.MDH.all;
//以循环方式递增缓冲区索引
RxBufferIndex =(RxBufferIndex + 2)% RX_BUFFER_SIZE;
//清除新数据标志
ECanaRegs.CANRMP.bit.RMP0 = 1;
//递增接收消息计数
RxMsgCount++;
}
}
__中断无效
CanIsr (空)
{
//确认中断
ECanaRegs.CANGIF0.bit.MIV0 = 0;
//
//要从该 PIE 组接收更多的中断,请确认该中断
PieCtrlRegs.PIEACK.all = PIEACK_group9;
}
谢谢。此致、
S·库马尔