⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 用atmega128驱动sja1000,但有问题.txt

📁 我的程序是这样的
💻 TXT
字号:
其实我也是找原因很久了。一直没得到解决! 希望大家能够帮我参考下: 
1 我的程序是这样的,用ATmega128 驱动SJA1000 的时候 初始化SJA1000进不了复位模式来设置; 
2 有些时候可以进入复位模式,但是用BasicCAN 定时发送数据时,发送数据指令执行完后,SJA1000自动复位; 
PS: 之前都可以正常通信。 SJA1000 起始地址就是9000  现象很奇怪 
希望各位高手都来帮助下,实在是项目要的急啊!似乎该用的方法都用了的,同样一个程序有时候可以,有时候又行不通。 
下面附带主要代码: 

void port_init(void) 
{ 
 PORTA = 0xFF; 
 DDRA  = 0x00; 
 PORTB = 0x1F; 
 DDRB  = 0xE0; 
 PORTC = 0xFF;                //m103 output only 
 DDRC  = 0x00; 
 PORTD = 0xFF; 
 DDRD  = 0x00; 
 PORTE = 0xE0; 
 DDRE  = 0x1F; 
 PORTF = 0xFF; 
 DDRF  = 0x00; 
 PORTG = 0x1F; 
 DDRG  = 0x00; 
} 
//TIMER0 initialisation - prescale:1024 
// WGM: Normal 
// desired value: 10mSec 
// actual value:  9.984mSec (0.2%) 
void timer0_init(void) 
{ 
 TCCR0 = 0x00;                //stop 
 ASSR  = 0x00;                //set async mode 
 TCNT0 = 0x64;                //set count 
 OCR0  = 0x9C; 
 TCCR0 = 0x07;                //start timer 
} 

//call this routine to initialise all peripherals 
void init_devices(void) 
{ 
 //stop errant interrupts until set up 
 CLI();                       //disable all interrupts 
 XDIV  = 0x00;                //xtal divider 
 XMCRA = 0x00;                //external memory 
 port_init(); 
 timer0_init(); 
  
 MCUCR = 0x80; 
 EICRA = 0x00;                //extended ext ints 
 EICRB = 0x00;                //extended ext ints 
 EIMSK = 0x00; 
 TIMSK = 0x01;                //timer interrupt sources 
 ETIMSK = 0x00;               //extended timer interrupt sources 
 SEI();                       //re-enable interrupts 
 //all peripherals are now initialised 
} 
/********************************************* 
*   SJA1000 init 
*********************************************/ 
void Initialize_SJA1000(void) 
{ 
  ControlReg0 = 0x01;          // 置位复位模式/请求位,CAN所有中断禁能,注:上电后SJA1000 处于BasicCAN 模式 
  if((ControlReg0&0x01)!=0x01) 
      ControlReg0 = 0x01; 
  CDR0=0x48;                 // 设定时钟分频寄存器:BasicCAN模式;         
  ACR0= 0xff; AMR0 = 0xff;   // 定义验收代码寄存器和屏蔽码寄存器,   
  BusTimer00 = 0x00; 
  BusTimer01 = 0x58;         // 配置总线定时,参考《SJA1000位定时.pdf》,设置传输率为500k 
   
  OutControl0 = 0x1a;        // 配置CAN 输出 TX1悬空, TX0推挽, 正常输出模式; 
   
  ControlReg0 = 0x00;          // 复位复位模式/请求位,转向正常操作模式,接收、发送,错误中断使能; 
  if((ControlReg0&0x01)==0x01)   
       ControlReg0 = 0x00; 
} 
/**************************************** 
*  从sja1000_0发送数据到Can总线上 
*****************************************/ 
void TX_sub(void)   
{     
   do 
   { 
    delay_short(); 
   }   
   while((Status0&TBS_bit)!=TBS_bit);   // 判断是否发送缓冲区已释放; 
   TX_Identifier01 = 0x01;  
   TX_Identifier02 = 0x08; 
   TXBuffer01 = 0x01; 
   TXBuffer02 = 0x02; 
   TXBuffer03 = 0x03; 
   TXBuffer04 = 0x04; 
   TXBuffer05 = 0x05; 
   TXBuffer06 = 0x06; 
   TXBuffer07 = 0x07; 
   TXBuffer08 = 0x08; 
     
   Command0 = 0x01;             // 发送数据; 
   delay_short(); 
   Command0 = 0x02;             // 终止发送; 
   do 
   { 
    delay_short(); 
   }                   
   while((Status0&TBS_bit)!=TBS_bit); 
   //b = Interrupt0;                   // 读中断寄存器清发送中断;   
   PORTE=~(1<<PE2);                    // 点灯; 
   Command0 = 0x00;                    // 清除命令;    
} 
//************************************************** 
//               定时器0中断: 
//功能:通过sja1000发送数据到Can总线上 
/**************************************************/ 
#pragma interrupt_handler timer0_ovf_isr:17 
void timer0_ovf_isr(void) 
{ 
  PORTE=~(1<<PE0); 
  SREG=0x80;                          // 发送前先关闭所有外部中断; 
  TX_sub(); 
  SREG=0x00;                          // 打开所有外部中断; 
  TCNT0 = 0x64;                       // reload counter value 
   
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -