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

📄 can.lis

📁 MCU:ATMEGA8515 Frequence: 16M 描述:利用已有CAN TEST V1.0电路板进行调试, 可靠性测试已通过
💻 LIS
📖 第 1 页 / 共 3 页
字号:
                        .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 + -