📄 用atmega128驱动sja1000,但有问题.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 + -