📄 can.lis
字号:
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 + -