CAN通信求助!!!(发送不出去,接收不到:( )
- UID
- 137467
- 性别
- 男
|
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; //允许发送缓冲区空中断 } } |
|
|
|
|
|
- UID
- 137467
- 性别
- 男
|
这是接收板子上的接收程序:
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灯的亮灭失否一致。 |
|
|
|
|
|
- UID
- 134991
- 性别
- 男
|
Let\'s make things better! |
|
|
|
|
|
- UID
- 137467
- 性别
- 男
|
可以发送
就是没法接收...
不知道接收哪里出问题了?:(
那位大虾帮忙看一下阿! |
|
|
|
|
|
- UID
- 132749
- 性别
- 男
|
|
|
|
|
|
- UID
- 132749
- 性别
- 男
|
请问楼上的兄弟,你在没有接收到的情况下可以看到有数据发送出来了吗? 你的CAN收发器用的是什么?是MC33989吗?
[此贴子已经被作者于2006-5-22 11:38:47编辑过] |
|
|
|
|
|
- UID
- 137467
- 性别
- 男
|
我是用DSP56F708里的MSCAN模块...
可以通过查看CANTFLG来确定是否发送出去 |
|
|
|
|
|
- UID
- 137467
- 性别
- 男
|
|
|
|
|
|
- UID
- 132749
- 性别
- 男
|
我也是啊,也就是发送标志位置1了,表明发送缓冲清空,数据发送成功,是吧?
但是你用示波器测量MCU的CANTX有数据输出吗? |
|
|
|
|
|
- UID
- 137467
- 性别
- 男
|
|
|
|
|
|
- UID
- 132749
- 性别
- 男
|
也没有啊,我的CAN已经调试了好长时间了,到现在还没有通啊.我用的是MC68HC908AZ32A芯片,你用的是哪款啊? |
|
|
|
|
|
- UID
- 137467
- 性别
- 男
|
我是16位的DSP56F807芯片,和你那个8位的都差不多,反正是MOTO的MSCAN总线模块.
我也调好长时间了,查了发送的寄存器,说数据已经发出。可是这边接收缓冲区是空的!
郁闷得很哦!
|
|
|
|
|
|
- UID
- 137467
- 性别
- 男
|
|
|
|
|
|
- UID
- 132749
- 性别
- 男
|
我也觉得啊,还有我感觉的我在自发自收的情况下CAN通信是可以的,但是加上个MC33989后就很难在2块板子之间通信了.我觉得还是我这个收发器没有设置好,MC33989感觉比较难用,我怀疑它没有工作,但是看网上人都是那么用的. |
|
|
|
|
|
- UID
- 137467
- 性别
- 男
|
我昨天调好了:)
对!是设置的问题
一步一步地把它的初始化做好吧,基本上那个就没问题了. |
|
|
|
|
|