目前正在调试2812的eCAN,查阅和参考了很多资料,还是不知道为什么无法实现数据的发送和接收.下面以CAN发送为例,给出详细的程序,请有经验的同仁们给指点一二~~~ECAN邮箱自发自收没有问题; 但示波器测量CAN发送的输出脚没有预设的数据,电平始终为1V.
#include "DSP28_Device.h"
#define TXCOUNT 1000 //设定CAN发送次数
int TXcounter ; //发送次数
unsigned long int i;
struct ECAN_REGS ECanaShadow; //影子寄存器
void InitSysCtrl(void);
void IOinit(void);
void InitECan(void); //CAN初始化
main()
{
InitSysCtrl(); //初始化DSP
DINT; //关闭总中断
IER = 0x0000; //关闭外设中断
IFR = 0x0000; //清中断标志
TXcounter=0;
IOinit(); //配置GPIO
InitECan(); //初始化CAN模块
//-----------------------------配置CAN邮箱----------------------------
//配置发送邮箱MBOX0的信息标识符寄存器(MSGID,11位标识符)
ECanaMboxes.MBOX0.MSGID.all = 0x5C600000; //0号邮箱标识符
//配置邮箱0为发送
ECanaShadow.CANMD.all = ECanaRegs.CANMD.all;
ECanaShadow.CANMD.bit.MD0 = 0; //邮箱0为发送
ECanaRegs.CANMD.all = ECanaShadow.CANMD.all;
//配置发送邮箱0的数据长度为8个字节
ECanaMboxes.MBOX0.MCF.bit.DLC = 8;
//将待发送的数据写入发送邮箱MBOX0 的RAM//
ECanaMboxes.MBOX0.MDRL.all = 0x9555AAA0;
ECanaMboxes.MBOX0.MDRH.all = 0x89ABCDEF;
//使能邮箱0
ECanaShadow.CANME.all = ECanaRegs.CANME.all;
ECanaShadow.CANME.bit.ME0 = 1;
ECanaRegs.CANME.all = ECanaShadow.CANME.all;
while(1)
{
/* CAN 发送程序: 邮箱MBOX0发送8字节的数据 */
for (i=0;i<TXCOUNT;i++)
{
ECanaShadow.CANTRS.all = 0;
ECanaShadow.CANTRS.bit.TRS0 = 1; //CPU对CANTRS[0]置位开始邮箱0的发送
ECanaRegs.CANTRS.all = ECanaShadow.CANTRS.all;
while(ECanaRegs.CANTA.bit.TA0 == 0){} //等待TA0置位.置位表示发送成功
ECanaShadow.CANTA.all=0;
ECanaShadow.CANTA.bit.TA0=1; //清除TA0
ECanaRegs.CANTA.all = ECanaShadow.CANTA.all;
TXcounter++; //发送次数
}
TXcounter=0;
i=0;
}
} |