飞思卡尔单片机mc9s12xs128 CAN不能正常收发

seityoubenkyou 2012-08-25 05:19:11
帮我看看下面的程序,错在哪儿,谢谢
void CAN_filter(unsigned int ID,byte filter)//filter可取值为0、1、2、3
{
// 默认使用标准帧,非远程帧
ID<<=5;
switch(filter)
{
case 0: CAN0IDAR0=ID>>8; CAN0IDAR1=(byte)ID; break;
case 1: CAN0IDAR2=ID>>8; CAN0IDAR3=(byte)ID; break;
case 2: CAN0IDAR4=ID>>8; CAN0IDAR5=(byte)ID; break;
case 3: CAN0IDAR6=ID>>8; CAN0IDAR7=(byte)ID; break;
default:CAN0IDAR0=ID>>8; CAN0IDAR1=(byte)ID; break;
}
}

//CAN模块

void CAN_init(void)//晶振频率为4MHZ
{

//初始化模式下设置
CAN0CTL1=0x80;//进入了初始化模式
CAN0BTR0_SJW=0;//同步跳转宽度为1 Tq
CAN0BTR0_BRP=1;//F bus二分频
//CAN0BTR1_SAMP=0; //每位采样一次
CAN0BTR1_TSEG_20=2; //Tseg2=3Tq
CAN0BTR1_TSEG_10=3; //Tseg1=4Tq,波特率为500kbit/s,
//标示符设置 filter配置
CAN0IDAC_IDAM0=1;
CAN_filter(0x1FC,0);
// CAN_filter(0x1F6,1);
CAN_filter(0x4A0,1);
//进入正常模式
CAN0CTL0_INITRQ= 0;
while(CAN0CTL1_INITAK);//确认进入正常模式
//中断使能
//接收中断使能
CAN0RIER_RXFIE=1;
//发送中断使能
// CAN0TIER_TXEIE0=1;




}



//CAN 标准帧传输
byte CAN_TX(unsigned int ID,byte DLC,const byte*data)
{
byte * temp,i;
//选择传输buffer TX0
if(!CAN0TFLG_TXE0)
return 1;
CAN0TBSEL_TX0=1;//选择传输buffer0
//传输数据
ID<<=5;
CAN0TXIDR0=ID>>8;CAN0TXIDR1=(byte)ID;
CAN0TXDLR=DLC;
temp=&CAN0TXDSR0;
for(i=0;i<DLC;i++)
{
*(temp+i)=*(data+i);
}

//清除TXE标志
CAN0TFLG_TXE0=1;
return 0;
}
...全文
234 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧