首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | 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
可以发送
就是没法接收...
不知道接收哪里出问题了?:(
那位大虾帮忙看一下阿!
fly in the sky
我是用DSP56F708里的MSCAN模块...
可以通过查看CANTFLG来确定是否发送出去
fly in the sky
我是用PCA82C250T
fly in the sky
好像没有:(
你的呢?
fly in the sky
我是16位的DSP56F807芯片,和你那个8位的都差不多,反正是MOTO的MSCAN总线模块.


我也调好长时间了,查了发送的寄存器,说数据已经发出。可是这边接收缓冲区是空的!
郁闷得很哦!
fly in the sky
应该是发送有问题....
fly in the sky
我昨天调好了:)
对!是设置的问题
一步一步地把它的初始化做好吧,基本上那个就没问题了.
fly in the sky
还有要注意置位发送请求位的操作,我这个写入1才是清除(虽然写入是1,但被清零了)
我就是被这个给弄了好长时间!

菜鸟所见哈,如果不是,别见笑哈〉。。。。:)
fly in the sky
我发送板子reset重新发送数据时,接受板子的led会被点亮(我设置好的led)
我用示波器也能观察到MSCAN_TX有波形...
fly in the sky

是两块板子之间的通信
只有发送的话,也可以看到波形变化的阿
fly in the sky

不知道为什么,我发送的数据和接受到的不一致.:(
各位大虾帮帮忙阿 ,拜托了

可是,接受缓冲区满标志位被置起了阿,不过我设置的接收符ID过滤屏蔽码寄存器都是1,也就是全部接收,这应该不是问题吧?,因为就两个板子之间的通信,没有其他CAN节点.

[此贴子已经被作者于2006-5-25 16:34:23编辑过]

fly in the sky
返回列表