📄 can.lis
字号:
.module CAN.c
.area data(ram, con, rel)
0000 _sja_address::
0000 .blkb 2
.area idata
0000 007F .word 32512
.area data(ram, con, rel)
0002 .dbfile E:\罗鹏\工作资料\工作记录\CAN\程序\完成版本\CAN.c
0002 .dbsym e sja_address _sja_address pc
.area text(rom, con, rel)
0000 .dbfile E:\罗鹏\工作资料\工作记录\CAN\程序\完成版本\CAN.c
0000 .dbfunc e read_sja _read_sja fc
0000 ; addr -> R16
.even
0000 _read_sja::
0000 .dbline -1
0000 .dbline 76
0000 ; /******************************************
0000 ; MCU:ATMEGA8515
0000 ; Frequence: 8M
0000 ; ******************************************/
0000 ; #include "iom8515v.h"
0000 ; #include "macros.h"
0000 ; #include "MAIN.h"
0000 ; #include "CAN.h"
0000 ; #define startadd 0x7f00 //SJA1000的首地址
0000 ; uchar CanMode[14];
0000 ; uchar TransBuffer[13];
0000 ; uchar RxBuffer[13];
0000 ; uchar RevFlag;
0000 ; #define FALSE 0
0000 ; #define TRUE 1
0000 ; #define MODE 0x00 //模式寄存器
0000 ; #define CMR 0x01 //命令寄存器
0000 ; #define SR 0x02 //状态寄存器
0000 ; #define IR 0x03 //中断寄存器
0000 ; #define IER 0x04 //中断使能寄存器
0000 ; #define BTR0 0x06 //总线时序寄存器0
0000 ; #define BTR1 0x07 //总线时序寄存器1
0000 ; #define OCR 0x08 //输出控制寄存器
0000 ; #define TEST 0x09
0000 ; #define ALC 0x0B //仲裁丢失捕捉寄存器
0000 ; #define ECC 0x0C //错误代码捕捉寄存器
0000 ; #define EWLR 0x0D //错误报警限额寄存器
0000 ; #define RXERR 0x0E //RX错误计数寄存器
0000 ; #define TXERR 0x0F //TX错误计数寄存器
0000 ; #define ACR0 0x10 //验收代码寄存器
0000 ; #define ACR1 0x11
0000 ; #define ACR2 0x12
0000 ; #define ACR3 0x13
0000 ; #define AMR0 0x14 //验收屏障寄存器
0000 ; #define AMR1 0x15
0000 ; #define AMR2 0x16
0000 ; #define AMR3 0x17
0000 ; ///////////////////////////
0000 ; #define TXEFF 0x10
0000 ; #define TXID0 0x11
0000 ; #define TXID1 0x12
0000 ; #define TXID2 0x13
0000 ; #define TXID3 0x14
0000 ;
0000 ; #define RXEFF 0x10
0000 ; #define RXID0 0x11
0000 ; #define RXID1 0x12
0000 ; #define RXID2 0x13
0000 ; #define RXID3 0x14
0000 ;
0000 ; #define TXDATA0 0x15
0000 ; #define TXDATA1 0x16
0000 ; #define TXDATA2 0x17
0000 ; #define TXDATA3 0x18
0000 ; #define TXDATA4 0x19
0000 ; #define TXDATA5 0x1A
0000 ; #define TXDATA6 0x1B
0000 ; #define TXDATA7 0x1C
0000 ;
0000 ; #define RXDATA0 0x15
0000 ; #define RXDATA1 0x16
0000 ; #define RXDATA2 0x17
0000 ; #define RXDATA3 0x18
0000 ; #define RXDATA4 0x19
0000 ; #define RXDATA5 0x1A
0000 ; #define RXDATA6 0x1B
0000 ; #define RXDATA7 0x1C
0000 ; //////////////////////////
0000 ; #define RMC 0x1D //RX报文计数器
0000 ; #define RBSA 0x1E //RX缓冲器起始地址寄存器
0000 ; #define CDR 0x1F //时钟分频寄存器
0000 ; //////////////////////////////////////////////////////////////////////
0000 ; uchar *sja_address=(uchar *)startadd;
0000 ;
0000 ; uchar read_sja(uchar addr) //读SJA1000状态寄存器子程序
0000 ; {
0000 .dbline 77
0000 ; sja_address=(uchar *)startadd;
0000 80E0 ldi R24,32512
0002 9FE7 ldi R25,127
0004 90930100 sts _sja_address+1,R25
0008 80930000 sts _sja_address,R24
000C .dbline 78
000C ; sja_address=sja_address+addr;
000C 402E mov R4,R16
000E 5524 clr R5
0010 480E add R4,R24
0012 591E adc R5,R25
0014 50920100 sts _sja_address+1,R5
0018 40920000 sts _sja_address,R4
001C .dbline 79
001C ; return (*(sja_address));
001C F201 movw R30,R4
001E 0081 ldd R16,z+0
0020 .dbline -2
0020 L1:
0020 .dbline 0 ; func end
0020 0895 ret
0022 .dbsym r addr 16 c
0022 .dbend
0022 .dbfunc e write_sja _write_sja fV
0022 ; val -> R18
0022 ; addr -> R16
.even
0022 _write_sja::
0022 .dbline -1
0022 .dbline 83
0022 ; }
0022 ;
0022 ; void write_sja(uchar addr,uchar val) //写SJA1000控制寄存器子程序
0022 ; {
0022 .dbline 84
0022 ; sja_address=(uchar *)startadd;
0022 80E0 ldi R24,32512
0024 9FE7 ldi R25,127
0026 90930100 sts _sja_address+1,R25
002A 80930000 sts _sja_address,R24
002E .dbline 85
002E ; sja_address=sja_address+addr;
002E 402E mov R4,R16
0030 5524 clr R5
0032 480E add R4,R24
0034 591E adc R5,R25
0036 50920100 sts _sja_address+1,R5
003A 40920000 sts _sja_address,R4
003E .dbline 86
003E ; *(sja_address)=val;
003E F201 movw R30,R4
0040 2083 std z+0,R18
0042 .dbline -2
0042 L2:
0042 .dbline 0 ; func end
0042 0895 ret
0044 .dbsym r val 18 c
0044 .dbsym r addr 16 c
0044 .dbend
0044 .dbfunc e Init_CAN _Init_CAN fV
0044 ; temp -> <dead>
0044 ; k -> R20,R21
.even
0044 _Init_CAN::
0044 00D0 rcall push_gset1
0046 .dbline -1
0046 .dbline 93
0046 ; }
0046 ;
0046 ; /*************************************************
0046 ; 初始化SJA1000主控制器子函数
0046 ; *************************************************/
0046 ; void Init_CAN(void)
0046 ; {
0046 .dbline 96
0046 ; uchar temp;
0046 ; uint k ;
0046 ; CLI();
0046 F894 cli
0048 .dbline 97
0048 ; write_sja(MODE,0x09);
0048 29E0 ldi R18,9
004A 0027 clr R16
004C EADF rcall _write_sja
004E .dbline 98
004E ; read_sja(IR); //读取CAN的中断标识
004E 03E0 ldi R16,3
0050 D7DF rcall _read_sja
0052 03C0 rjmp L5
0054 L4:
0054 .dbline 100
0054 .dbline 101
0054 21E0 ldi R18,1
0056 0027 clr R16
0058 E4DF rcall _write_sja
005A .dbline 102
005A L5:
005A .dbline 99
005A ; while(!(read_sja(MODE)&0x01)) //检测SJA1000是否达到复位工作模式
005A 0027 clr R16
005C D1DF rcall _read_sja
005E 00FF sbrs R16,0
0060 F9CF rjmp L4
0062 .dbline 104
0062 4427 clr R20
0064 5527 clr R21
0066 02C0 rjmp L10
0068 L7:
0068 .dbline 104
0068 L8:
0068 .dbline 104
0068 4F5F subi R20,255 ; offset = 1
006A 5F4F sbci R21,255
006C L10:
006C .dbline 104
006C ; {
006C ; write_sja(MODE,0x01); //进入复位工作模式
006C ; }
006C ;
006C ; for(k=0;k<6;k++); //延时约5us
006C 4630 cpi R20,6
006E E0E0 ldi R30,0
0070 5E07 cpc R21,R30
0072 D0F3 brlo L7
0074 .dbline 105
0074 ; write_sja(CDR,0xC8); //PeliCAN 模式,禁能CLOCKOUT引脚
0074 28EC ldi R18,200
0076 0FE1 ldi R16,31
0078 D4DF rcall _write_sja
007A .dbline 106
007A 4427 clr R20
007C 5527 clr R21
007E 02C0 rjmp L14
0080 L11:
0080 .dbline 106
0080 L12:
0080 .dbline 106
0080 4F5F subi R20,255 ; offset = 1
0082 5F4F sbci R21,255
0084 L14:
0084 .dbline 106
0084 ; for(k=0;k<6;k++); //延时约5us
0084 4630 cpi R20,6
0086 E0E0 ldi R30,0
0088 5E07 cpc R21,R30
008A D0F3 brlo L11
008C .dbline 107
008C ; write_sja(BTR0,0x04); //设置时钟分频器,500k
008C 24E0 ldi R18,4
008E 06E0 ldi R16,6
0090 C8DF rcall _write_sja
0092 .dbline 108
0092 ; write_sja(BTR1,0x1c);
0092 2CE1 ldi R18,28
0094 07E0 ldi R16,7
0096 C5DF rcall _write_sja
0098 .dbline 109
0098 ; write_sja(OCR,0x1a); //输出控制
0098 2AE1 ldi R18,26
009A 08E0 ldi R16,8
009C C2DF rcall _write_sja
009E .dbline 110
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -