首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

CAN通信求助!!!(发送不出去,接收不到:( )

CAN通信求助!!!(发送不出去,接收不到:( )

各位大虾好


    小弟现在在编一个CAN总线的收发通信程序(两个DSP56F807评估板之间的数据传输,是在codeWarrior IDE环境下编译的),遇到了很问题,还请各位帮忙看一眼,谢谢了先!


             我是用一个板子发送,一个板子接受。


其中发送的板子发送程序如下:


void main(void)
{
  /*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/
  PE_low_level_init();
  /*** End of Processor Expert internal initialization.                    ***/
   /* Write your code here */
  
 CAN1_Init(); //初始化MSCAN模块(我这是直接调用的CODE warrior里的模块初始化函数)
 IPR=(word)0xfe12; //允许全部中断          
 
 CAN_TB0_IDR0=0x33; //设置发送缓冲的接受符ID,使用标准模式
 CAN_TB0_IDR1=0; 
 CAN_TB1_IDR0=0x44;
 CAN_TB1_IDR1=0;
 CAN_TB2_IDR0=0x55;
 CAN_TB2_IDR1=0;
 
 CAN_TB0_DLR=0x0008; //设置发送缓冲区的数据长度
 CAN_TB1_DLR=0x0008;
 CAN_TB2_DLR=0x0008;


 CAN_TB0_TBPR=0x10; //设置发送缓冲区的优先级
 CAN_TB1_TBPR=0x20;
 CAN_TB2_TBPR=0x30;


 GPR3=0x7500; //设置中断级别
 CANRIER=0x0001; //允许MSCAN接收中断
 
 while(1)  //主程序循环
 {  
 if(CANTFLG&0x0001==1)//数据填充在空闲的数据缓冲区
 {
  CAN_TB0_DSR0=0; //填充发送数据
  CAN_TB0_DSR1=1;
  CAN_TB0_DSR2=1;
  CAN_TB0_DSR3=0;
  CAN_TB0_DSR4=1;
  CAN_TB0_DSR5=1;
  CAN_TB0_DSR6=0;
  CAN_TB0_DSR7=1;
 }
 if(CANTFLG&0x0002==1)
 {
  CAN_TB1_DSR0=0; //填充发送数据
  CAN_TB1_DSR1=1;
  CAN_TB1_DSR2=1;
  CAN_TB1_DSR3=0;
  CAN_TB1_DSR4=1;
  CAN_TB1_DSR5=0;
  CAN_TB1_DSR6=1;
  CAN_TB1_DSR7=1;
 }
 if(CANTFLG&0x0004==1)
 {
  CAN_TB2_DSR0=0; //填充发送数据
  CAN_TB2_DSR1=1;
  CAN_TB2_DSR2=1;
  CAN_TB2_DSR3=0;
  CAN_TB2_DSR4=1;
  CAN_TB2_DSR5=0;
  CAN_TB2_DSR6=1;
  CAN_TB2_DSR7=1;
 }
  Bit1_PutVal(CAN_TB0_DSR5);//将需要发送能够的数据(高3位)显示出来
  Bit2_PutVal(CAN_TB0_DSR6);//表示发送区有数据
  Bit3_PutVal(CAN_TB0_DSR7);
//  Bit1_PutVal(CANTCR_TXEIE0_MASK);
//  Bit2_PutVal(CANTCR_TXEIE1_MASK);
//  Bit3_PutVal(CANTCR_TXEIE2_MASK);
  
  CANTCR=0x0001;  //允许发送缓冲区空中断 
 }
 
}

fly in the sky
这是接收板子上的接收程序:
void main(void)
{
/*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/
PE_low_level_init();
/*** End of Processor Expert internal initialization. ***/
/* Write your code here */


IPR=(word)0xfe12; //允许全部中断

CAN1_Init(); //初始化MSCAN模块

(CANRIER)|=0x0001; //允许(CAN接收)中断

while(1) //主程序循环等待接受数据
{
if(flag==1) //等待标志位
{
flag=0; //清除标志位

Bit1_PutVal(CAN_RB_DSR5); //接收显示,也可以由其它
Bit2_PutVal(CAN_RB_DSR6); //程序处理数据
Bit3_PutVal(CAN_RB_DSR7);

CAN_RB_DSR0=0; //接收缓冲区清零
CAN_RB_DSR1=0;
CAN_RB_DSR2=0;
CAN_RB_DSR3=0;
CAN_RB_DSR4=0;
CAN_RB_DSR5=0;
CAN_RB_DSR6=0;
CAN_RB_DSR7=0;

CANRFLG=0x0000;//清除缓冲区满标志位

}

}
}

其结果我是想用led灯显示表示是否通信正确。对比两个板子相同编号的led灯的亮灭失否一致。
fly in the sky
不会周围环境的影响吧

 Let\'s make things better!
可以发送
就是没法接收...
不知道接收哪里出问题了?:(
那位大虾帮忙看一下阿!
fly in the sky
我的也出现类似的情况,始终看不到信号,急死我了.
请问楼上的兄弟,你在没有接收到的情况下可以看到有数据发送出来了吗? 你的CAN收发器用的是什么?是MC33989吗?

[此贴子已经被作者于2006-5-22 11:38:47编辑过]

我是用DSP56F708里的MSCAN模块...
可以通过查看CANTFLG来确定是否发送出去
fly in the sky
我是用PCA82C250T
fly in the sky
我也是啊,也就是发送标志位置1了,表明发送缓冲清空,数据发送成功,是吧?
但是你用示波器测量MCU的CANTX有数据输出吗?
好像没有:(
你的呢?
fly in the sky
也没有啊,我的CAN已经调试了好长时间了,到现在还没有通啊.我用的是MC68HC908AZ32A芯片,你用的是哪款啊?
我是16位的DSP56F807芯片,和你那个8位的都差不多,反正是MOTO的MSCAN总线模块.


我也调好长时间了,查了发送的寄存器,说数据已经发出。可是这边接收缓冲区是空的!
郁闷得很哦!
fly in the sky
应该是发送有问题....
fly in the sky
我也觉得啊,还有我感觉的我在自发自收的情况下CAN通信是可以的,但是加上个MC33989后就很难在2块板子之间通信了.我觉得还是我这个收发器没有设置好,MC33989感觉比较难用,我怀疑它没有工作,但是看网上人都是那么用的.
我昨天调好了:)
对!是设置的问题
一步一步地把它的初始化做好吧,基本上那个就没问题了.
fly in the sky
返回列表