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

📄 can.lis

📁 MCU:ATMEGA8515 Frequence: 16M 描述:利用已有CAN TEST V1.0电路板进行调试, 可靠性测试已通过
💻 LIS
📖 第 1 页 / 共 3 页
字号:
 01CE           ;       SEI();                                            //开中断
 01CE 7894              sei
 01D0                   .dbline -2
 01D0           L18:
 01D0                   .dbline 0 ; func end
 01D0 0895              ret
 01D2                   .dbsym l status 1 c
 01D2                   .dbend
 01D2                   .dbfunc e Receive _Receive fc
 01D2           ;         RxData -> y+0
 01D2           ;            sff -> R12
 01D2           ;         number -> R20
 01D2           ;         result -> R22
 01D2           ;         status -> R20
 01D2           ;          prbuf -> R10
 01D2           ;              i -> R12
                        .even
 01D2           _Receive::
 01D2 00D0              rcall push_gset4
 01D4 2D97              sbiw R28,13
 01D6                   .dbline -1
 01D6                   .dbline 203
 01D6           ; }
 01D6           ; /*
 01D6           ; void Search(void)                 //查询方式接收
 01D6           ; {
 01D6           ;    uchar SearchStatus=read_sja(SR);   //读取状态寄存器
 01D6           ;    if(!(SearchStatus & 0xc3))         //是否存在总线关闭、错误状态、数据溢出、有数据位等状态
 01D6           ;    {
 01D6           ;       if((SearchStatus & 0x80) != 0)//如果总线关闭
 01D6           ;         {
 01D6           ;            read_sja(IR);                  //读取中断寄存器,清除中断位
 01D6           ;                write_sja(MODE,0x08); 
 01D6           ;         }
 01D6           ;         else
 01D6           ;         {
 01D6           ;            read_sja(IR);
 01D6           ;          if((read_sja(IR) & 0x08) != 0)//如果有数据溢出
 01D6           ;                write_sja(CMR,0x0c);          //在命令寄存器中清除数据溢出和释放接收缓冲区
 01D6           ;                else
 01D6           ;                {
 01D6           ;                   if((read_sja(IR) & 0x01) != 0)//IR.0=1,接收缓冲区有数据
 01D6           ;                       {
 01D6           ;                           Status_lighting(1);
 01D6           ;                               RevFlag=1;
 01D6           ;                   }
 01D6           ;            }
 01D6           ;         }
 01D6           ;    }
 01D6           ; }*/
 01D6           ; 
 01D6           ; 
 01D6           ; uchar Receive(void)
 01D6           ; {
 01D6                   .dbline 204
 01D6           ;       uchar result=FALSE;
 01D6 6627              clr R22
 01D8                   .dbline 208
 01D8           ;       uchar status,number,i,sff;
 01D8           ;       uchar prbuf;
 01D8           ;       uchar RxData[13];
 01D8           ;       status=read_sja(SR);
 01D8 02E0              ldi R16,2
 01DA 12DF              rcall _read_sja
 01DC 402F              mov R20,R16
 01DE                   .dbline 209
 01DE           ;       prbuf=RXEFF;
 01DE 80E1              ldi R24,16
 01E0 A82E              mov R10,R24
 01E2                   .dbline 210
 01E2           ;       if((status&0xc3)!=0)              //读取总线脱离、错误状态、接收溢出、有数据等位
 01E2 842F              mov R24,R20
 01E4 837C              andi R24,195
 01E6 09F4              brne X0
 01E8 43C0              rjmp L50
 01EA           X0:
 01EA                   .dbline 211
 01EA           ;       {
 01EA                   .dbline 212
 01EA           ;               if((status&0x80)==0x80)
 01EA 842F              mov R24,R20
 01EC 8078              andi R24,128
 01EE 8038              cpi R24,128
 01F0 29F4              brne L52
 01F2                   .dbline 213
 01F2           ;               {
 01F2                   .dbline 214
 01F2           ;                       write_sja(MODE,0x00);
 01F2 2227              clr R18
 01F4 0027              clr R16
 01F6 15DF              rcall _write_sja
 01F8                   .dbline 215
 01F8           ;                       return FALSE;
 01F8 0027              clr R16
 01FA 3BC0              rjmp L49
 01FC           L52:
 01FC                   .dbline 217
 01FC           ;               }
 01FC           ;               if((status&0x02)==0x02)
 01FC 842F              mov R24,R20
 01FE 8270              andi R24,2
 0200 8230              cpi R24,2
 0202 29F4              brne L54
 0204                   .dbline 218
 0204           ;               {
 0204                   .dbline 219
 0204           ;                       write_sja(CMR,0x0c);
 0204 2CE0              ldi R18,12
 0206 01E0              ldi R16,1
 0208 0CDF              rcall _write_sja
 020A                   .dbline 220
 020A           ;                       return FALSE;
 020A 0027              clr R16
 020C 32C0              rjmp L49
 020E           L54:
 020E                   .dbline 223
 020E           ;               }
 020E           ;               
 020E           ;               if((status&0x01)==0x01)
 020E 842F              mov R24,R20
 0210 8170              andi R24,1
 0212 8130              cpi R24,1
 0214 69F5              brne L56
 0216                   .dbline 224
 0216           ;               {
 0216                   .dbline 225
 0216           ;                       if((read_sja(RXEFF)&0x40)==0x40)  //如果RTR=1,为远程帧
 0216 00E1              ldi R16,16
 0218 F3DE              rcall _read_sja
 021A 802F              mov R24,R16
 021C 8074              andi R24,64
 021E 8034              cpi R24,64
 0220 21F4              brne L58
 0222                   .dbline 226
 0222           ;                       {
 0222                   .dbline 227
 0222           ;                               write_sja(CMR,0x04);              //则释放FXFIFO
 0222 24E0              ldi R18,4
 0224 01E0              ldi R16,1
 0226 FDDE              rcall _write_sja
 0228                   .dbline 228
 0228           ;                       }
 0228 23C0              rjmp L59
 022A           L58:
 022A                   .dbline 230
 022A           ;                       else                                                      //为0,则是数据帧
 022A           ;                       {
 022A                   .dbline 231
 022A           ;                               sff=read_sja(prbuf)&0x80;         //取第一个字节的最高位
 022A 0A2D              mov R16,R10
 022C E9DE              rcall _read_sja
 022E 802F              mov R24,R16
 0230 8078              andi R24,128
 0232 C82E              mov R12,R24
 0234                   .dbline 232
 0234           ;                               number=(read_sja(prbuf)&0x0f);//取第一个字节的低四位,即数据长度
 0234 0A2D              mov R16,R10
 0236 E4DE              rcall _read_sja
 0238 402F              mov R20,R16
 023A 4F70              andi R20,15
 023C                   .dbline 233
 023C           ;                               if ((sff&0x80)==0x80)             //判断是标准帧还是扩展帧
 023C 8C2D              mov R24,R12
 023E 8078              andi R24,128
 0240 8038              cpi R24,128
 0242 11F4              brne L60
 0244                   .dbline 234
 0244           ;                               number=number+5;                          //扩展帧,则帧的总长度加5(13字节)
 0244 4B5F              subi R20,251    ; addi 5
 0246 01C0              rjmp L61
 0248           L60:
 0248                   .dbline 236
 0248           ;                               else
 0248           ;                               number=number+3;                          //标准帧,则帧的总长度加3(11字节)
 0248 4D5F              subi R20,253    ; addi 3
 024A           L61:
 024A                   .dbline 237
 024A           ;                               for(i=0;i<number;i++)             //读取数据
 024A CC24              clr R12
 024C 0BC0              rjmp L65
 024E           L62:
 024E                   .dbline 238
 024E                   .dbline 239
 024E 0A2D              mov R16,R10
 0250 D7DE              rcall _read_sja
 0252 80E0              ldi R24,<_RxBuffer
 0254 90E0              ldi R25,>_RxBuffer
 0256 EC2D              mov R30,R12
 0258 FF27              clr R31
 025A E80F              add R30,R24
 025C F91F              adc R31,R25
 025E 0083              std z+0,R16
 0260                   .dbline 240
 0260 A394              inc R10
 0262                   .dbline 241
 0262           L63:
 0262                   .dbline 237
 0262 C394              inc R12
 0264           L65:
 0264                   .dbline 237
 0264 C416              cp R12,R20
 0266 98F3              brlo L62
 0268                   .dbline 242
 0268           ;                               {
 0268           ;                                       RxBuffer[i]=read_sja(prbuf);
 0268           ;                                       prbuf++;
 0268           ;                               }
 0268           ;                               result=TRUE;                              //读取到正确的数据则返回TRUE
 0268 61E0              ldi R22,1
 026A                   .dbline 243
 026A           ;                               write_sja(CMR,0x04);              //最后释放FXFIFO
 026A 24E0              ldi R18,4
 026C 01E0              ldi R16,1
 026E D9DE              rcall _write_sja
 0270                   .dbline 244
 0270           ;                       }
 0270           L59:
 0270                   .dbline 245
 0270           ;               }
 0270           L56:
 0270                   .dbline 246
 0270           ;       }
 0270           L50:
 0270                   .dbline 247
 0270           ;       return result;
 0270 062F              mov R16,R22
 0272                   .dbline -2
 0272           L49:
 0272 2D96              adiw R28,13
 0274 00D0              rcall pop_gset4
 0276                   .dbline 0 ; func end
 0276 0895              ret
 0278                   .dbsym l RxData 0 A[13:13]c
 0278                   .dbsym r sff 12 c
 0278                   .dbsym r number 20 c
 0278                   .dbsym r result 22 c
 0278                   .dbsym r status 20 c
 0278                   .dbsym r prbuf 10 c
 0278                   .dbsym r i 12 c
 0278                   .dbend
                        .area bss(ram, con, rel)
 0000                   .dbfile E:\罗鹏\工作资料\工作记录\CAN\程序\完成版本\CAN.c
 0000           _CanMode::
 0000                   .blkb 14
 000E                   .dbsym e CanMode _CanMode A[14:14]c
 000E           _RevFlag::
 000E                   .blkb 1
 000F                   .dbsym e RevFlag _RevFlag c
 000F           _TransBuffer::
 000F                   .blkb 13
 001C                   .dbsym e TransBuffer _TransBuffer A[13:13]c
 001C           _RxBuffer::
 001C                   .blkb 13
 0029                   .dbsym e RxBuffer _RxBuffer A[13:13]c

⌨️ 快捷键说明

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