📄 can.s
字号:
.module CAN.c
.area data(ram, con, rel)
_sja_address::
.blkb 2
.area idata
.word 32512
.area data(ram, con, rel)
.dbfile E:\罗鹏\工作资料\工作记录\CAN\程序\完成版本\CAN.c
.dbsym e sja_address _sja_address pc
.area text(rom, con, rel)
.dbfile E:\罗鹏\工作资料\工作记录\CAN\程序\完成版本\CAN.c
.dbfunc e read_sja _read_sja fc
; addr -> R16
.even
_read_sja::
.dbline -1
.dbline 76
; /******************************************
; MCU:ATMEGA8515
; Frequence: 8M
; ******************************************/
; #include "iom8515v.h"
; #include "macros.h"
; #include "MAIN.h"
; #include "CAN.h"
; #define startadd 0x7f00 //SJA1000的首地址
; uchar CanMode[14];
; uchar TransBuffer[13];
; uchar RxBuffer[13];
; uchar RevFlag;
; #define FALSE 0
; #define TRUE 1
; #define MODE 0x00 //模式寄存器
; #define CMR 0x01 //命令寄存器
; #define SR 0x02 //状态寄存器
; #define IR 0x03 //中断寄存器
; #define IER 0x04 //中断使能寄存器
; #define BTR0 0x06 //总线时序寄存器0
; #define BTR1 0x07 //总线时序寄存器1
; #define OCR 0x08 //输出控制寄存器
; #define TEST 0x09
; #define ALC 0x0B //仲裁丢失捕捉寄存器
; #define ECC 0x0C //错误代码捕捉寄存器
; #define EWLR 0x0D //错误报警限额寄存器
; #define RXERR 0x0E //RX错误计数寄存器
; #define TXERR 0x0F //TX错误计数寄存器
; #define ACR0 0x10 //验收代码寄存器
; #define ACR1 0x11
; #define ACR2 0x12
; #define ACR3 0x13
; #define AMR0 0x14 //验收屏障寄存器
; #define AMR1 0x15
; #define AMR2 0x16
; #define AMR3 0x17
; ///////////////////////////
; #define TXEFF 0x10
; #define TXID0 0x11
; #define TXID1 0x12
; #define TXID2 0x13
; #define TXID3 0x14
;
; #define RXEFF 0x10
; #define RXID0 0x11
; #define RXID1 0x12
; #define RXID2 0x13
; #define RXID3 0x14
;
; #define TXDATA0 0x15
; #define TXDATA1 0x16
; #define TXDATA2 0x17
; #define TXDATA3 0x18
; #define TXDATA4 0x19
; #define TXDATA5 0x1A
; #define TXDATA6 0x1B
; #define TXDATA7 0x1C
;
; #define RXDATA0 0x15
; #define RXDATA1 0x16
; #define RXDATA2 0x17
; #define RXDATA3 0x18
; #define RXDATA4 0x19
; #define RXDATA5 0x1A
; #define RXDATA6 0x1B
; #define RXDATA7 0x1C
; //////////////////////////
; #define RMC 0x1D //RX报文计数器
; #define RBSA 0x1E //RX缓冲器起始地址寄存器
; #define CDR 0x1F //时钟分频寄存器
; //////////////////////////////////////////////////////////////////////
; uchar *sja_address=(uchar *)startadd;
;
; uchar read_sja(uchar addr) //读SJA1000状态寄存器子程序
; {
.dbline 77
; sja_address=(uchar *)startadd;
ldi R24,32512
ldi R25,127
sts _sja_address+1,R25
sts _sja_address,R24
.dbline 78
; sja_address=sja_address+addr;
mov R4,R16
clr R5
add R4,R24
adc R5,R25
sts _sja_address+1,R5
sts _sja_address,R4
.dbline 79
; return (*(sja_address));
movw R30,R4
ldd R16,z+0
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbsym r addr 16 c
.dbend
.dbfunc e write_sja _write_sja fV
; val -> R18
; addr -> R16
.even
_write_sja::
.dbline -1
.dbline 83
; }
;
; void write_sja(uchar addr,uchar val) //写SJA1000控制寄存器子程序
; {
.dbline 84
; sja_address=(uchar *)startadd;
ldi R24,32512
ldi R25,127
sts _sja_address+1,R25
sts _sja_address,R24
.dbline 85
; sja_address=sja_address+addr;
mov R4,R16
clr R5
add R4,R24
adc R5,R25
sts _sja_address+1,R5
sts _sja_address,R4
.dbline 86
; *(sja_address)=val;
movw R30,R4
std z+0,R18
.dbline -2
L2:
.dbline 0 ; func end
ret
.dbsym r val 18 c
.dbsym r addr 16 c
.dbend
.dbfunc e Init_CAN _Init_CAN fV
; temp -> <dead>
; k -> R20,R21
.even
_Init_CAN::
rcall push_gset1
.dbline -1
.dbline 93
; }
;
; /*************************************************
; 初始化SJA1000主控制器子函数
; *************************************************/
; void Init_CAN(void)
; {
.dbline 96
; uchar temp;
; uint k ;
; CLI();
cli
.dbline 97
; write_sja(MODE,0x09);
ldi R18,9
clr R16
rcall _write_sja
.dbline 98
; read_sja(IR); //读取CAN的中断标识
ldi R16,3
rcall _read_sja
rjmp L5
L4:
.dbline 100
.dbline 101
ldi R18,1
clr R16
rcall _write_sja
.dbline 102
L5:
.dbline 99
; while(!(read_sja(MODE)&0x01)) //检测SJA1000是否达到复位工作模式
clr R16
rcall _read_sja
sbrs R16,0
rjmp L4
.dbline 104
clr R20
clr R21
rjmp L10
L7:
.dbline 104
L8:
.dbline 104
subi R20,255 ; offset = 1
sbci R21,255
L10:
.dbline 104
; {
; write_sja(MODE,0x01); //进入复位工作模式
; }
;
; for(k=0;k<6;k++); //延时约5us
cpi R20,6
ldi R30,0
cpc R21,R30
brlo L7
.dbline 105
; write_sja(CDR,0xC8); //PeliCAN 模式,禁能CLOCKOUT引脚
ldi R18,200
ldi R16,31
rcall _write_sja
.dbline 106
clr R20
clr R21
rjmp L14
L11:
.dbline 106
L12:
.dbline 106
subi R20,255 ; offset = 1
sbci R21,255
L14:
.dbline 106
; for(k=0;k<6;k++); //延时约5us
cpi R20,6
ldi R30,0
cpc R21,R30
brlo L11
.dbline 107
; write_sja(BTR0,0x04); //设置时钟分频器,500k
ldi R18,4
ldi R16,6
rcall _write_sja
.dbline 108
; write_sja(BTR1,0x1c);
ldi R18,28
ldi R16,7
rcall _write_sja
.dbline 109
; write_sja(OCR,0x1a); //输出控制
ldi R18,26
ldi R16,8
rcall _write_sja
.dbline 110
; write_sja(RXERR,0x00);
clr R18
ldi R16,14
rcall _write_sja
.dbline 111
; write_sja(TXERR,0x00);
clr R18
ldi R16,15
rcall _write_sja
.dbline 112
; write_sja(ECC,0x00);
clr R18
ldi R16,12
rcall _write_sja
.dbline 113
; write_sja(RBSA,0x00); //缓存器起始地址寄存器设置为0
clr R18
ldi R16,30
rcall _write_sja
.dbline 115
;
; write_sja(ACR0,0x00); //acceptcode default ffffffff
clr R18
ldi R16,16
rcall _write_sja
.dbline 116
; write_sja(ACR1,0x00);
clr R18
ldi R16,17
rcall _write_sja
.dbline 117
; write_sja(ACR2,0x00);
clr R18
ldi R16,18
rcall _write_sja
.dbline 118
; write_sja(ACR3,0x00);
clr R18
ldi R16,19
rcall _write_sja
.dbline 120
;
; write_sja(AMR0,0xff); //acceptmask default ffffffff
ldi R18,255
ldi R16,20
rcall _write_sja
.dbline 121
; write_sja(AMR0,0xff);
ldi R18,255
ldi R16,20
rcall _write_sja
.dbline 122
; write_sja(AMR0,0xff);
ldi R18,255
ldi R16,20
rcall _write_sja
.dbline 123
; write_sja(AMR0,0xff);
ldi R18,255
ldi R16,20
rcall _write_sja
.dbline 125
;
; write_sja(IER,0x01); //开放接收中断
ldi R18,1
ldi R16,4
rcall _write_sja
.dbline 126
; write_sja(CMR,0x0c); //清除数据溢出和释放接收缓冲器;
ldi R18,12
ldi R16,1
rcall _write_sja
L15:
.dbline 128
; do
; {
.dbline 129
; write_sja(MODE,0x08); //设置SJA1000 工作模式,单滤波接收工作模式
ldi R18,8
clr R16
rcall _write_sja
.dbline 130
; }
L16:
.dbline 131
; while((read_sja(MODE)&0x01)); //确认复位标志是否被删除
clr R16
rcall _read_sja
sbrc R16,0
rjmp L15
.dbline 132
; SEI();
sei
.dbline -2
L3:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym l temp 1 c
.dbsym r k 20 i
.dbend
.dbfunc e CanTransmit _CanTransmit fV
; status -> <dead>
.even
_CanTransmit::
.dbline -1
.dbline 139
; }
;
; /*************************************************
; SJA1000发送子函数
; *************************************************/
; void CanTransmit(void)
; {
.dbline 141
; uchar status;
; CLI(); //关中断
cli
.dbline 142
; TransBuffer[0]=0x88;
ldi R24,136
sts _TransBuffer,R24
.dbline 143
; TransBuffer[1]=0x00;
clr R2
sts _TransBuffer+1,R2
.dbline 144
; TransBuffer[2]=0x00;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -