打印
[ZLG-ARM]

hao to 调试CAN

[复制链接]
1266|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
六楼的窗户|  楼主 | 2010-7-11 17:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
bit6019| | 2010-7-11 17:58 | 只看该作者
mode复位模式下设置自检测。。。然后回到工作模式。写数据,CMR写0x10

使用特权

评论回复
板凳
想实习去| | 2010-7-11 17:58 | 只看该作者
写数据是写多少位的啊?还是可以随便写的?谢谢。

使用特权

评论回复
地板
年轻不在| | 2010-7-11 17:58 | 只看该作者
能给我一段具体点的么?第一次调试,谢谢了。

使用特权

评论回复
5
yoyowodeai| | 2010-7-11 17:59 | 只看该作者
#include <reg52.h>
#include <stdio.h>
#include <INTRINS.H>
#include <string.h>

#include <absacc.h>

#define uchar unsigned char
#define uint unsigned int

#define SJA_REG_BaseADD 0x7f00
#define REG_MODE XBYTE[SJA_REG_BaseADD + 0x00]
#define REG_CMD XBYTE[SJA_REG_BaseADD + 0x01]
#define REG_SR XBYTE[SJA_REG_BaseADD + 0x02]
#define REG_IR XBYTE[SJA_REG_BaseADD + 0x03]
#define REG_IR_ABLE XBYTE[SJA_REG_BaseADD + 0x04]
#define REG_BTR0 XBYTE[SJA_REG_BaseADD + 0x06]
#define REG_BTR1 XBYTE[SJA_REG_BaseADD + 0x07]
#define REG_OCR XBYTE[SJA_REG_BaseADD + 0x08]
#define REG_TEST XBYTE[SJA_REG_BaseADD + 0x09]
#define REG_ALC XBYTE[SJA_REG_BaseADD + 0x0b]

#define REG_ECC XBYTE[SJA_REG_BaseADD + 0x0c]
#define REG_EMLR XBYTE[SJA_REG_BaseADD + 0x0d]
#define REG_RXERR XBYTE[SJA_REG_BaseADD + 0x0e]
#define REG_TXERR XBYTE[SJA_REG_BaseADD + 0x0f]    
#define REG_ACR0 XBYTE[SJA_REG_BaseADD + 0x10]   

#define REG_ACR1 XBYTE[SJA_REG_BaseADD + 0x11]
#define REG_ACR2 XBYTE[SJA_REG_BaseADD + 0x12]
#define REG_ACR3 XBYTE[SJA_REG_BaseADD + 0x13]
#define REG_AMR0 XBYTE[SJA_REG_BaseADD + 0x14]
#define REG_AMR1 XBYTE[SJA_REG_BaseADD + 0x15]
#define REG_AMR2 XBYTE[SJA_REG_BaseADD + 0x16]
#define REG_AMR3 XBYTE[SJA_REG_BaseADD + 0x17]
#define REG_RxBuffer0 XBYTE[SJA_REG_BaseADD + 0x10]
#define REG_RxBuffer1 XBYTE[SJA_REG_BaseADD + 0x11]
#define REG_RxBuffer2 XBYTE[SJA_REG_BaseADD + 0x12]
#define REG_RxBuffer3 XBYTE[SJA_REG_BaseADD + 0x13]
#define REG_RxBuffer4 XBYTE[SJA_REG_BaseADD + 0x14]
#define REG_TxBuffer0 XBYTE[SJA_REG_BaseADD + 0x10]
#define REG_TxBuffer1 XBYTE[SJA_REG_BaseADD + 0x11]
#define REG_TxBuffer2 XBYTE[SJA_REG_BaseADD + 0x12]
#define REG_TxBuffer3 XBYTE[SJA_REG_BaseADD + 0x13]
#define REG_TxBuffer4 XBYTE[SJA_REG_BaseADD + 0x14]
#define REG_DataBuffer1 XBYTE[SJA_REG_BaseADD + 0x15]  

#define REG_DataBuffer2 XBYTE[SJA_REG_BaseADD + 0x16]
#define REG_DataBuffer3 XBYTE[SJA_REG_BaseADD + 0x17]
#define REG_DataBuffer4 XBYTE[SJA_REG_BaseADD + 0x18]
#define REG_DataBuffer5 XBYTE[SJA_REG_BaseADD + 0x19]
#define REG_DataBuffer6 XBYTE[SJA_REG_BaseADD + 0x1a]
#define REG_DataBuffer7 XBYTE[SJA_REG_BaseADD + 0x1b]
#define REG_DataBuffer8 XBYTE[SJA_REG_BaseADD + 0x1c]
#define REG_RBSA XBYTE[SJA_REG_BaseADD + 0x1e]
#define REG_CDR XBYTE[SJA_REG_BaseADD + 0x1f]
#define REG_Receive_Counter XBYTE[SJA_REG_BaseADD + 0x1d]

sbit SJARst = P3 ^ 4; //复位控制
sbit LED = P3 ^ 5;

uchar temp_data1;

void MCU_Init(void);
void SJA_Init(void);
void SJA_Init_Reset(void);
void Light(void);
void Delay(uint n);
void Send(unsigned char S_Data);

void MCU_Init(void){
       SJARst = 0;
       LED = 1;
       TMOD|=0x20;             //定时器1设为方式2
       TL1=0xFD;              //定时器初值,9600
TH1=0xFD;
SCON=0x50;             //串口设为方式1,REN=1允许接收
PX0=1;         //设置外部中断0优先
IT0=0;                 //设置INT0为下降沿中断//0为电平触发,1为边沿触发
EX0=1;                 //使能INT0中断
//ES=1;                  //使能串口中断
RI = 0;
TI = 0;
PCON |= 0x00;
EA  = 1;
TR1 = 1;
}

void SJA_Init_Reset(void)             //复位可靠
{
unsigned char i;
for(i = 0;i < 125;i++);
SJARst = 1;
for(i = 0;i < 125;i++);
SJARst = 0;
for(i = 0;i < 125;i++);
}

void SJA_Init(void){

     REG_MODE = 0x01;                           //进入复位模式
     temp_data1 = REG_MODE;
     temp_data1 = temp_data1 & 0x01;
     if(temp_data1 == 0x01) //在复位模式中

     REG_CDR = 0x88;                            //配置时钟分频寄存器,选择PeliCAN模式
     REG_MODE  = 0x0d ;   //配置模式寄存器,选择单滤波(双滤波器设置0x05)、自检模式
     REG_ACR0 = 0x00;
     REG_ACR1 = 0x00;
     REG_ACR2 = 0x00;
     REG_ACR3 = 0x00;
     REG_AMR0 = 0xff;
     REG_AMR1 = 0xff;
     REG_AMR2 = 0xff;
     REG_AMR3 = 0xff;

     REG_BTR0 = 0x00;   //配置总线定时器0
     REG_BTR1 = 0x16;   //配置总线定时器1
     REG_RBSA = 0x00;              //缓存器起始地址寄存器设置为0
     REG_CMD = 0x0c;               //设置命令寄存器,清除数据溢出和释放接收缓冲器

     REG_IR_ABLE = 0xff;  //使能SJA1000接收/发送/错误中断功能

     REG_OCR = 0x1a;   //配置输出管脚
     temp_data1 = REG_MODE;
     temp_data1 = temp_data1 & 0x08;
     if(temp_data1 == 0x08)
     REG_MODE = 0x0c;    //退出复位模式,进入工作模式
     //REG_IR_ABLE = 0x03;  //使能SJA1000接收/发送/错误中断功能
}

//*****************延时程序***************************//
void Delay(uint n)
{
unsigned int i;
while(n--)
  for(i=125; i!=0; i--);
}
//**************************************************//
//*****************LED灯闪烁***************************//
void Light(void)
{
LED=1;
Delay(1000);
LED=0;
        Delay(1000);
}
//**************************************************//
void Send(unsigned char S_Data){
      SBUF=S_Data;
      while(TI==0);
      TI=0;
}

void ex0_int(void) interrupt 0 using 1
{
        EA=0;
        temp_data1 = REG_IR;
        Send(temp_data1);
        REG_CMD = 0x0c;               //设置命令寄存器,清除数据溢出和释放接收缓冲器
EA=1;
}
main(){
        SJA_Init_Reset();
        MCU_Init();

       Delay(100);
       SJA_Init();
       while(1){

                REG_RxBuffer0= 0x08;//标准帧,八位数据
                REG_RxBuffer1= 0x13;
                REG_RxBuffer2= 0x00;
                REG_RxBuffer3= 0x00;//数据第一位
                REG_RxBuffer4= 0x01;
                REG_DataBuffer1 = 0x02;
                REG_DataBuffer2 = 0x03;
                REG_DataBuffer3 = 0x04;
                REG_DataBuffer4 = 0x05;
                REG_DataBuffer5 = 0x06;
                REG_DataBuffer6 = 0x07;

                temp_data1 = REG_IR;
                Send(temp_data1);
                REG_CMD = 0x10;


     }
}







已调试通过的程序,你可以通过查看寄存器(SR或IR)的值判断是否自检测成功

我也是参考了别人的。你上网搜下,类似列子很多的。

使用特权

评论回复
6
huzixian| | 2010-7-11 18:01 | 只看该作者
有人在atmel 上做过can总线的项目吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

102

主题

497

帖子

0

粉丝