Board logo

标题: CAN通信求助!!!(发送不出去,接收不到:( ) [打印本页]

作者: ayumilp    时间: 2006-5-19 15:20     标题: 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;  //允许发送缓冲区空中断 
 }
 
}


作者: ayumilp    时间: 2006-5-19 15:23

这是接收板子上的接收程序:
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灯的亮灭失否一致。
作者: peter.zhang    时间: 2006-5-21 02:46

不会周围环境的影响吧
作者: ayumilp    时间: 2006-5-22 11:32

可以发送
就是没法接收...
不知道接收哪里出问题了?:(
那位大虾帮忙看一下阿!
作者: lingxiang    时间: 2006-5-22 11:37

我的也出现类似的情况,始终看不到信号,急死我了.
作者: lingxiang    时间: 2006-5-22 11:38

请问楼上的兄弟,你在没有接收到的情况下可以看到有数据发送出来了吗? 你的CAN收发器用的是什么?是MC33989吗?

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


作者: ayumilp    时间: 2006-5-22 12:19

我是用DSP56F708里的MSCAN模块...
可以通过查看CANTFLG来确定是否发送出去
作者: ayumilp    时间: 2006-5-22 12:23

我是用PCA82C250T
作者: lingxiang    时间: 2006-5-22 13:04

我也是啊,也就是发送标志位置1了,表明发送缓冲清空,数据发送成功,是吧?
但是你用示波器测量MCU的CANTX有数据输出吗?
作者: ayumilp    时间: 2006-5-22 16:57

好像没有:(
你的呢?
作者: lingxiang    时间: 2006-5-22 17:08

也没有啊,我的CAN已经调试了好长时间了,到现在还没有通啊.我用的是MC68HC908AZ32A芯片,你用的是哪款啊?
作者: ayumilp    时间: 2006-5-23 10:52

我是16位的DSP56F807芯片,和你那个8位的都差不多,反正是MOTO的MSCAN总线模块.


我也调好长时间了,查了发送的寄存器,说数据已经发出。可是这边接收缓冲区是空的!
郁闷得很哦!

作者: ayumilp    时间: 2006-5-23 14:00

应该是发送有问题....
作者: lingxiang    时间: 2006-5-23 14:21

我也觉得啊,还有我感觉的我在自发自收的情况下CAN通信是可以的,但是加上个MC33989后就很难在2块板子之间通信了.我觉得还是我这个收发器没有设置好,MC33989感觉比较难用,我怀疑它没有工作,但是看网上人都是那么用的.
作者: ayumilp    时间: 2006-5-24 11:35

我昨天调好了:)
对!是设置的问题
一步一步地把它的初始化做好吧,基本上那个就没问题了.
作者: ayumilp    时间: 2006-5-24 11:56

还有要注意置位发送请求位的操作,我这个写入1才是清除(虽然写入是1,但被清零了)
我就是被这个给弄了好长时间!

菜鸟所见哈,如果不是,别见笑哈〉。。。。:)
作者: lingxiang    时间: 2006-5-24 13:55

这我都考虑到了,我可能是因为板子的问题吧.那你现在看到什么现象啊?
作者: lingxiang    时间: 2006-5-24 13:56

如果你早点把程序给我看,你上面的问题你会早点解决的.
作者: ayumilp    时间: 2006-5-24 14:19

我发送板子reset重新发送数据时,接受板子的led会被点亮(我设置好的led)
我用示波器也能观察到MSCAN_TX有波形...
作者: lingxiang    时间: 2006-5-24 15:48

是在2块板子之间通信的吗?只有发送方也是可以的吗?
作者: ayumilp    时间: 2006-5-25 14:30


是两块板子之间的通信
只有发送的话,也可以看到波形变化的阿
作者: ayumilp    时间: 2006-5-25 16:34

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

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

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


作者: jiangnanyige    时间: 2006-6-8 10:48

我用的是GZ16

#include
#include "main.h"

#define BAUDRATE_125k 0x0000
#define BAUDRATE_250k 0x0001
#define BAUDRATE_500k 0x0002

#define COMMSTATUS_INIT 0x0000
#define COMMSTSTUS_RCVOPEN 0x1111
#define COMMSTATUS_RCVEND 0x2222
#define COMMSTSTUS_SNDOPEN 0x3333
#define COMMSTSTUS_SNDEND 0x4444

static unsigned short s_wCANCommBuffer[100];
static unsigned short s_wCANCountSend;
static unsigned short s_wCANCommStatus;
static unsigned short s_wCANCountTimeout;
static unsigned short* s_pCANRcvPointer;
static unsigned short* s_pCANRcvEndPointer;
static unsigned short* s_pCANSndPointer;
static unsigned short* s_pCANSndEndPointer;

static void InitCAN(void)
{
CMCR0 = 0x01; //softset状态
CMCR1 = 0x01; //时钟bus
CIDAR0 = 0xff; //标准数据桢
CIDAR1 = 0xe0;
CIDAR2 = 0x00;
CIDAR3 = 0x00;
CIDMR0 = 0xff; //取消屏蔽码
CIDMR1 = 0xff;
CIDMR2 = 0xff;
CIDMR3 = 0xff;
CIDAC = 0x00; //32BIT接受
switch(GetBautRate()) //波特率
{
case BAUDRATE_125k: CBTR0 = 0x49; CBTR1 = 0x00; break;
case BAUDRATE_250k: CBTR0 = 0x49; CBTR1 = 0x00; break;
case BAUDRATE_500k: CBTR0 = 0x49; CBTR1 = 0x00; break;
default:break;
}
CRIER = 0x00;//接收中断不使能
CTCR = 0x00; //发送中断优先级不使能
CMCR0 = 0x00; //正常模式
}

static void InitCommStatus(void)
{
s_wCANCountTimeout = 50000;//超时益处时间设定
s_wCANCountSend = 14;
s_wCANCommStatus = COMMSTATUS_INIT;
}
void OnInitCAN(void)
{
InitCAN();
InitCommStatus();
}
static void CANSendPackage(void)//CAN发送数据包
{
wCountSend = 0x08;
if(CTFLG_TXE0) //判断是否为空
{
IDR00 = 0xff; //标准数据桢
IDR10 = 0xe0;
IDR20 = 0x00;
IDR30 = 0x00;

DLR0 = wCountSend&0x0f; //长度

DSR00 = s_pCANSndPointer[0]&0xff;//发送的数据
DSR10 = s_pCANSndPointer[1]&0xff;
DSR20 = s_pCANSndPointer[2]&0xff;
DSR30 = s_pCANSndPointer[3]&0xff;
DSR40 = s_pCANSndPointer[4]&0xff;
DSR50 = s_pCANSndPointer[5]&0xff;
DSR60 = s_pCANSndPointer[6]&0xff;
DSR70 = s_pCANSndPointer[7]&0xff;
TBPR0 = 0x01; //优先级
CTFLG_TXE0 = 1; //启动发送
s_pCANSndPointer += wCountSend; //指针后移
}
}
void OnPollingCAN(void) //此函数每1ms调用一次
{
unsigned short wSndCount;
unsigned short wAddress;
if(s_wCANCountTimeout>0)
{
s_wCANCountTimeout--;
if(s_wCANCountTimeout==0)
{
InitCAN();
InitCommStatus();
}
}
switch(s_wCANCommStatus)
{
case COMMSTATUS_INIT:
s_wCANCountTimeout = 2000;
s_wCANCommStatus = COMMSTSTUS_SNDOPEN;
s_pCANSndPointer = s_wCANCommBuffer; //发送指针初始地址
s_pCANSndEndPointer = s_wCANCommBuffer+8; //发送指针结束地址
break;
case COMMSTSTUS_RCVOPEN:
break;
case COMMSTATUS_RCVEND:
s_wCANCountTimeout = 5000;
s_wCANCommStatus = COMMSTSTUS_SNDOPEN;
break;
case COMMSTSTUS_SNDOPEN:
if(s_pCANSndPointer!=s_wCANCommBuffer) //等待发送结束
{
if(s_wCANCountSend)
{
s_wCANCountSend--;
break;
}
}
s_wCANCountSend = 14;
s_wCANCountTimeout = 5000;
CANSendPackage(); //发送
if(s_pCANSndPointer>=s_pCANSndEndPointer) //发送完成
{
PTE_PTE0 = 1;
s_wCANCommStatus = COMMSTATUS_INIT; 重新开始发送
}
break;
case COMMSTSTUS_SNDEND:
break;
default:
OnInitCAN();
break;
}
}

在配置寄存器中已经对CAN模块使能:
CONFIG2 = 0x09;
硬件采用的是VP251,TI公司的,不需要使能。
发送一点信号都没有,不知道是什么原因,是不是初始化的时候有问题,请斑竹给予帮助!!在线等待中!!!!着急啊。。。。。555555555555555555555

作者: chenliang_hit    时间: 2006-11-24 16:21

GZ16好像是CTFLAG_TXE0=0;是启动发送啊[em22][em22]




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0