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

📄 main.lis

📁 本软件实现了232到CAN的具体转换的代码,对232和CAN都进行了很好的说明,编程环境是IAR
💻 LIS
📖 第 1 页 / 共 4 页
字号:
 0094           L25:
 0094                   .dbline 84
 0094           ;  while(!(SPSR&0x80));  //等待SPIF置位,等数据发送完毕
 0094 779B              sbis 0xe,7
 0096 FECF              rjmp L24
 0098                   .dbline 85
 0098           ;  clear=SPSR;
 0098 6EB1              in R22,0xe
 009A                   .dbline 86
 009A           ;  clear=SPDR;             //通过先读SPSR,紧接着访问SPDR来对SPIF清零
 009A 6FB1              in R22,0xf
 009C                   .dbline 88
 009C           ;  
 009C           ;  SPDR=Address;                                //送地址
 009C AFB8              out 0xf,R10
 009E           L27:
 009E                   .dbline 89
 009E           L28:
 009E                   .dbline 89
 009E           ;  while(!(SPSR&0x80));
 009E 779B              sbis 0xe,7
 00A0 FECF              rjmp L27
 00A2                   .dbline 90
 00A2           ;  clear=SPSR;
 00A2 6EB1              in R22,0xe
 00A4                   .dbline 91
 00A4           ;  clear=SPDR;
 00A4 6FB1              in R22,0xf
 00A6                   .dbline 93
 00A6           ;  
 00A6           ;  SPDR=0x00;                //发空数据,启动数据发送以接收数据
 00A6 2224              clr R2
 00A8 2FB8              out 0xf,R2
 00AA           L30:
 00AA                   .dbline 94
 00AA           L31:
 00AA                   .dbline 94
 00AA           ;  while(!(SPSR&0x80));
 00AA 779B              sbis 0xe,7
 00AC FECF              rjmp L30
 00AE                   .dbline 95
 00AE           ;  clear=SPSR;
 00AE 6EB1              in R22,0xe
 00B0                   .dbline 96
 00B0           ;  clear=SPDR;
 00B0 6FB1              in R22,0xf
 00B2                   .dbline 98
 00B2           ;  
 00B2           ;  date=SPDR;              //接收数据
 00B2 4FB1              in R20,0xf
 00B4                   .dbline 99
 00B4           ;  Set_CS(1);              //关SPI器件DS1722
 00B4 01E0              ldi R16,1
 00B6 BADF              xcall _Set_CS
 00B8                   .dbline 100
 00B8           ;  return date;
 00B8 042F              mov R16,R20
 00BA                   .dbline -2
 00BA           L23:
 00BA 0E940000          xcall pop_gset3
 00BE                   .dbline 0 ; func end
 00BE 0895              ret
 00C0                   .dbsym r date 20 c
 00C0                   .dbsym r clear 22 c
 00C0                   .dbsym r Address 10 c
 00C0                   .dbend
 00C0                   .dbfunc e Write_Byte _Write_Byte fV
 00C0           ;          clear -> R20
 00C0           ;           Data -> R22
 00C0           ;        Address -> R10
                        .even
 00C0           _Write_Byte::
 00C0 0E940000          xcall push_gset3
 00C4 622F              mov R22,R18
 00C6 A02E              mov R10,R16
 00C8                   .dbline -1
 00C8                   .dbline 104
 00C8           ; }
 00C8           ; //**向2515指定地址Address写一个字节数据Data**//
 00C8           ; void Write_Byte(uchar Address,uchar Data)
 00C8           ; {uchar clear;
 00C8                   .dbline 105
 00C8           ;  Set_CS(0);          //使能SPI器件2515
 00C8 0027              clr R16
 00CA B0DF              xcall _Set_CS
 00CC                   .dbline 107
 00CC           ;  
 00CC           ;  SPDR=0x02;                //送2515写命令为0x02
 00CC 82E0              ldi R24,2
 00CE 8FB9              out 0xf,R24
 00D0           L34:
 00D0                   .dbline 108
 00D0           L35:
 00D0                   .dbline 108
 00D0           ;  while(!(SPSR&0x80));//等待SPIF置位,等数据发送完毕
 00D0 779B              sbis 0xe,7
 00D2 FECF              rjmp L34
 00D4                   .dbline 109
 00D4           ;  clear=SPSR;
 00D4 4EB1              in R20,0xe
 00D6                   .dbline 110
 00D6           ;  clear=SPDR;  
 00D6 4FB1              in R20,0xf
 00D8                   .dbline 112
 00D8           ;  
 00D8           ;  SPDR=Address;                 //送地址,启动SPI时钟
 00D8 AFB8              out 0xf,R10
 00DA           L37:
 00DA                   .dbline 113
 00DA           L38:
 00DA                   .dbline 113
 00DA           ;  while(!(SPSR&0x80));//等待SPIF置位,等数据发送完毕
 00DA 779B              sbis 0xe,7
 00DC FECF              rjmp L37
 00DE                   .dbline 114
 00DE           ;  clear=SPSR;
 00DE 4EB1              in R20,0xe
 00E0                   .dbline 115
 00E0           ;  clear=SPDR;           //通过先读SPSR,紧接着访问SPDR来对SPIF清零
 00E0 4FB1              in R20,0xf
 00E2                   .dbline 117
 00E2           ;  
 00E2           ;  SPDR=Data;
 00E2 6FB9              out 0xf,R22
 00E4           L40:
 00E4                   .dbline 118
 00E4           L41:
 00E4                   .dbline 118
 00E4           ;  while(!(SPSR&0x80));
 00E4 779B              sbis 0xe,7
 00E6 FECF              rjmp L40
 00E8                   .dbline 119
 00E8           ;  clear=SPSR;
 00E8 4EB1              in R20,0xe
 00EA                   .dbline 120
 00EA           ;  clear=SPDR;
 00EA 4FB1              in R20,0xf
 00EC                   .dbline 121
 00EC           ;  Set_CS(1);         //关SPI器件
 00EC 01E0              ldi R16,1
 00EE 9EDF              xcall _Set_CS
 00F0                   .dbline -2
 00F0           L33:
 00F0 0E940000          xcall pop_gset3
 00F4                   .dbline 0 ; func end
 00F4 0895              ret
 00F6                   .dbsym r clear 20 c
 00F6                   .dbsym r Data 22 c
 00F6                   .dbsym r Address 10 c
 00F6                   .dbend
 00F6                   .dbfunc e load_Standard_ID_dates _load_Standard_ID_dates fV
 00F6           ;           TIDL -> R12
 00F6           ;           TIDH -> R14
 00F6           ;              j -> R20
 00F6           ;             T0 -> R22
 00F6           ;              i -> R10
 00F6           ;            num -> y+10
                        .even
 00F6           _load_Standard_ID_dates::
 00F6 1A93              st -y,r17
 00F8 0A93              st -y,r16
 00FA 0E940000          xcall push_gset5
 00FE                   .dbline -1
 00FE                   .dbline 128
 00FE           ; }
 00FE           ; //****************************************************************************//
 00FE           ; //###########################对CAN的一些操作####################################
 00FE           ; //***************************要发送的数据包***********************************//
 00FE           ; void load_Standard_ID_dates(uchar num)//给标准帧装载ID和数据
 00FE           ; //选用发送缓冲器0,num:要发送的个数(最大8个)
 00FE           ; {
 00FE                   .dbline 129
 00FE           ;  uchar i,j,T0=0x36;
 00FE 66E3              ldi R22,54
 0100                   .dbline 131
 0100           ;  uchar TIDH,TIDL;
 0100           ;  i=TID[1]>>3;j=TID[0]<<5;j=j+i;i=TID[1]<<5;
 0100 A0900F00          lds R10,_TID+1
 0104 A694              lsr R10
 0106 A694              lsr R10
 0108 A694              lsr R10
 010A                   .dbline 131
 010A 40910E00          lds R20,_TID
 010E 440F              lsl R20
 0110 440F              lsl R20
 0112 440F              lsl R20
 0114 440F              lsl R20
 0116 440F              lsl R20
 0118                   .dbline 131
 0118 4A0D              add R20,R10
 011A                   .dbline 131
 011A A0900F00          lds R10,_TID+1
 011E AA0C              lsl R10
 0120 AA0C              lsl R10
 0122 AA0C              lsl R10
 0124 AA0C              lsl R10
 0126 AA0C              lsl R10
 0128                   .dbline 132
 0128           ;  TIDL=i;TIDH=j;//将数组TID中的值转化为TIDH,TIDL以便给TXB0SIDH,TXB0SIDL附值
 0128 CA2C              mov R12,R10
 012A                   .dbline 132
 012A E42E              mov R14,R20
 012C                   .dbline 133
 012C           ;  Write_Byte(CANCTRL,0x80);//CAN工作在配置模式
 012C 20E8              ldi R18,128
 012E 0FE0              ldi R16,15
 0130 C7DF              xcall _Write_Byte
 0132                   .dbline 134
 0132           ;  Write_Byte(CNF1,can_boud);
 0132 20910000          lds R18,_can_boud
 0136 0AE2              ldi R16,42
 0138 C3DF              xcall _Write_Byte
 013A                   .dbline 135
 013A           ;  Write_Byte(TXB0SIDH,TIDH);
 013A 2E2D              mov R18,R14
 013C 01E3              ldi R16,49
 013E C0DF              xcall _Write_Byte
 0140                   .dbline 136
 0140           ;  Write_Byte(TXB0SIDL,TIDL);
 0140 2C2D              mov R18,R12
 0142 02E3              ldi R16,50
 0144 BDDF              xcall _Write_Byte
 0146                   .dbline 137
 0146           ;  Write_Byte(TXB0DLC,num);// 
 0146 2A85              ldd R18,y+10
 0148 05E3              ldi R16,53
 014A BADF              xcall _Write_Byte
 014C                   .dbline 138
 014C 82E0              ldi R24,2
 014E A82E              mov R10,R24
 0150 0BC0              xjmp L49
 0152           L46:
 0152                   .dbline 138
 0152 80E0              ldi R24,<_Tdate
 0154 90E0              ldi R25,>_Tdate
 0156 EA2D              mov R30,R10
 0158 FF27              clr R31
 015A E80F              add R30,R24
 015C F91F              adc R31,R25
 015E 2081              ldd R18,z+0
 0160 062F              mov R16,R22
 0162 AEDF              xcall _Write_Byte
 0164           L47:
 0164                   .dbline 138
 0164 A394              inc R10
 0166 6395              inc R22
 0168           L49:
 0168                   .dbline 138
 0168           ;  for(i=2;i<num+2;i++,T0++)Write_Byte(T0,Tdate[i]);
 0168 8A85              ldd R24,y+10
 016A 8E5F              subi R24,254    ; addi 2
 016C A816              cp R10,R24
 016E 88F3              brlo L46
 0170                   .dbline -2
 0170           L43:
 0170 0E940000          xcall pop_gset5
 0174 2296              adiw R28,2
 0176                   .dbline 0 ; func end
 0176 0895              ret
 0178                   .dbsym r TIDL 12 c
 0178                   .dbsym r TIDH 14 c
 0178                   .dbsym r j 20 c
 0178                   .dbsym r T0 22 c
 0178                   .dbsym r i 10 c
 0178                   .dbsym l num 10 c
 0178                   .dbend
 0178                   .dbfunc e Receive_all_ID_process _Receive_all_ID_process fV
 0178           ;              k -> R16
                        .even
 0178           _Receive_all_ID_process::
 0178                   .dbline -1
 0178                   .dbline 142
 0178           ;  }
 0178           ; //##############################################################################
 0178           ; void Receive_all_ID_process(void)//结合MCP2515数据手册来看
 0178           ; {uchar k;
 0178                   .dbline 143
 0178           ;  k=RESID[1];//先判断接收到的是不是标准帧,因为标准帧和扩展帧的ID处理不一样
 0178 00910300          lds R16,_RESID+1
 017C                   .dbline 144
 017C           ;  if((k&0x08)==0)
 017C 03FD              sbrc R16,3
 017E 1BC0              rjmp L52
 0180                   .dbline 145
 0180           ;    {//如果是标准处理方法
 0180                   .dbline 146
 0180           ;     RESID[1]=RESID[1]>>5;
 0180 202E              mov R2,R16
 0182 2694              lsr R2
 0184 2694              lsr R2
 0186 2694              lsr R2
 0188 2694              lsr R2
 018A 2694              lsr R2
 018C 20920300          sts _RESID+1,R2
 0190                   .dbline 147
 0190           ;     k=RESID[0]&0x1f;//借用k
 0190 00910200          lds R16,_RESID
 0194 0F71              andi R16,31
 0196                   .dbline 148
 0196           ;       k=k<<3;
 0196 000F              lsl R16
 0198 000F              lsl R16
 019A 000F              lsl R16
 019C                   .dbline 149
 019C           ;       RESID[1]=RESID[1]+k;
 019C 200E              add R2,R16
 019E 20920300          sts _RESID+1,R2
 01A2                   .dbline 150
 01A2           ;       RESID[0]=RESID[0]>>5;
 01A2 20900200          lds R2,_RESID
 01A6 2694              lsr R2
 01A8 2694              lsr R2
 01AA 2694              lsr R2
 01AC 2694              lsr R2
 01AE 2694              lsr R2
 01B0 20920200          sts _RESID,R2
 01B4                   .dbline 151
 01B4           ;       }
 01B4 21C0              xjmp L53
 01B6           L52:
 01B6                   .dbline 153
 01B6                   .dbline 154
 01B6 0695              lsr R16
 01B8 0695              lsr R16
 01BA 0695              lsr R16
 01BC 0695              lsr R16
 01BE 0695              lsr R16
 01C0                   .dbline 155
 01C0 000F              lsl R16
 01C2 000F              lsl R16
 01C4                   .dbline 156
 01C4 80910300          lds R24,_RESID+1
 01C8 8370              andi R24,3

⌨️ 快捷键说明

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