📄 can.s
字号:
sts _TransBuffer+2,R2
.dbline 145
; TransBuffer[3]=0x00;
sts _TransBuffer+3,R2
.dbline 146
; TransBuffer[4]=0x00;
sts _TransBuffer+4,R2
.dbline 147
; TransBuffer[5]=0x01;
ldi R24,1
sts _TransBuffer+5,R24
.dbline 148
; TransBuffer[6]=0x02;
ldi R24,2
sts _TransBuffer+6,R24
.dbline 149
; TransBuffer[7]=0x03;
ldi R24,3
sts _TransBuffer+7,R24
.dbline 150
; TransBuffer[8]=0x04;
ldi R24,4
sts _TransBuffer+8,R24
.dbline 151
; TransBuffer[9]=0x05;
ldi R24,5
sts _TransBuffer+9,R24
.dbline 152
; TransBuffer[10]=0x06;
ldi R24,6
sts _TransBuffer+10,R24
.dbline 153
; TransBuffer[11]=0x07;
ldi R24,7
sts _TransBuffer+11,R24
.dbline 154
; TransBuffer[12]=0xaa;
ldi R24,170
sts _TransBuffer+12,R24
L31:
.dbline 155
L32:
.dbline 155
; while(!(read_sja(SR)&0x04)); //wait until reg2^2==1 ,即判断发送缓冲器的状态
ldi R16,2
rcall _read_sja
sbrs R16,2
rjmp L31
.dbline 156
; write_sja(TXEFF,TransBuffer[0]); //扩展帧,数据长度为8个字节
lds R18,_TransBuffer
ldi R16,16
rcall _write_sja
.dbline 157
; write_sja(TXID0,TransBuffer[1]);
lds R18,_TransBuffer+1
ldi R16,17
rcall _write_sja
.dbline 158
; write_sja(TXID1,TransBuffer[2]);
lds R18,_TransBuffer+2
ldi R16,18
rcall _write_sja
.dbline 159
; write_sja(TXID2,TransBuffer[3]);
lds R18,_TransBuffer+3
ldi R16,19
rcall _write_sja
.dbline 160
; write_sja(TXID3,TransBuffer[4]);
lds R18,_TransBuffer+4
ldi R16,20
rcall _write_sja
.dbline 161
; write_sja(TXDATA0,TransBuffer[5]);
lds R18,_TransBuffer+5
ldi R16,21
rcall _write_sja
.dbline 162
; write_sja(TXDATA1,TransBuffer[6]);
lds R18,_TransBuffer+6
ldi R16,22
rcall _write_sja
.dbline 163
; write_sja(TXDATA2,TransBuffer[7]);
lds R18,_TransBuffer+7
ldi R16,23
rcall _write_sja
.dbline 164
; write_sja(TXDATA3,TransBuffer[8]);
lds R18,_TransBuffer+8
ldi R16,24
rcall _write_sja
.dbline 165
; write_sja(TXDATA4,TransBuffer[9]);
lds R18,_TransBuffer+9
ldi R16,25
rcall _write_sja
.dbline 166
; write_sja(TXDATA5,TransBuffer[10]);
lds R18,_TransBuffer+10
ldi R16,26
rcall _write_sja
.dbline 167
; write_sja(TXDATA6,TransBuffer[11]);
lds R18,_TransBuffer+11
ldi R16,27
rcall _write_sja
.dbline 168
; write_sja(TXDATA7,TransBuffer[12]);
lds R18,_TransBuffer+12
ldi R16,28
rcall _write_sja
.dbline 169
; write_sja(CMR,0x01); //发送请求命令
ldi R18,1
ldi R16,1
rcall _write_sja
L46:
.dbline 170
L47:
.dbline 170
; while(!(read_sja(SR) & 0x08));//检测SR.3位,判断发送是否完成
ldi R16,2
rcall _read_sja
sbrs R16,3
rjmp L46
.dbline 171
; SEI(); //开中断
sei
.dbline -2
L18:
.dbline 0 ; func end
ret
.dbsym l status 1 c
.dbend
.dbfunc e Receive _Receive fc
; RxData -> y+0
; sff -> R12
; number -> R20
; result -> R22
; status -> R20
; prbuf -> R10
; i -> R12
.even
_Receive::
rcall push_gset4
sbiw R28,13
.dbline -1
.dbline 203
; }
; /*
; void Search(void) //查询方式接收
; {
; uchar SearchStatus=read_sja(SR); //读取状态寄存器
; if(!(SearchStatus & 0xc3)) //是否存在总线关闭、错误状态、数据溢出、有数据位等状态
; {
; if((SearchStatus & 0x80) != 0)//如果总线关闭
; {
; read_sja(IR); //读取中断寄存器,清除中断位
; write_sja(MODE,0x08);
; }
; else
; {
; read_sja(IR);
; if((read_sja(IR) & 0x08) != 0)//如果有数据溢出
; write_sja(CMR,0x0c); //在命令寄存器中清除数据溢出和释放接收缓冲区
; else
; {
; if((read_sja(IR) & 0x01) != 0)//IR.0=1,接收缓冲区有数据
; {
; Status_lighting(1);
; RevFlag=1;
; }
; }
; }
; }
; }*/
;
;
; uchar Receive(void)
; {
.dbline 204
; uchar result=FALSE;
clr R22
.dbline 208
; uchar status,number,i,sff;
; uchar prbuf;
; uchar RxData[13];
; status=read_sja(SR);
ldi R16,2
rcall _read_sja
mov R20,R16
.dbline 209
; prbuf=RXEFF;
ldi R24,16
mov R10,R24
.dbline 210
; if((status&0xc3)!=0) //读取总线脱离、错误状态、接收溢出、有数据等位
mov R24,R20
andi R24,195
brne X0
rjmp L50
X0:
.dbline 211
; {
.dbline 212
; if((status&0x80)==0x80)
mov R24,R20
andi R24,128
cpi R24,128
brne L52
.dbline 213
; {
.dbline 214
; write_sja(MODE,0x00);
clr R18
clr R16
rcall _write_sja
.dbline 215
; return FALSE;
clr R16
rjmp L49
L52:
.dbline 217
; }
; if((status&0x02)==0x02)
mov R24,R20
andi R24,2
cpi R24,2
brne L54
.dbline 218
; {
.dbline 219
; write_sja(CMR,0x0c);
ldi R18,12
ldi R16,1
rcall _write_sja
.dbline 220
; return FALSE;
clr R16
rjmp L49
L54:
.dbline 223
; }
;
; if((status&0x01)==0x01)
mov R24,R20
andi R24,1
cpi R24,1
brne L56
.dbline 224
; {
.dbline 225
; if((read_sja(RXEFF)&0x40)==0x40) //如果RTR=1,为远程帧
ldi R16,16
rcall _read_sja
mov R24,R16
andi R24,64
cpi R24,64
brne L58
.dbline 226
; {
.dbline 227
; write_sja(CMR,0x04); //则释放FXFIFO
ldi R18,4
ldi R16,1
rcall _write_sja
.dbline 228
; }
rjmp L59
L58:
.dbline 230
; else //为0,则是数据帧
; {
.dbline 231
; sff=read_sja(prbuf)&0x80; //取第一个字节的最高位
mov R16,R10
rcall _read_sja
mov R24,R16
andi R24,128
mov R12,R24
.dbline 232
; number=(read_sja(prbuf)&0x0f);//取第一个字节的低四位,即数据长度
mov R16,R10
rcall _read_sja
mov R20,R16
andi R20,15
.dbline 233
; if ((sff&0x80)==0x80) //判断是标准帧还是扩展帧
mov R24,R12
andi R24,128
cpi R24,128
brne L60
.dbline 234
; number=number+5; //扩展帧,则帧的总长度加5(13字节)
subi R20,251 ; addi 5
rjmp L61
L60:
.dbline 236
; else
; number=number+3; //标准帧,则帧的总长度加3(11字节)
subi R20,253 ; addi 3
L61:
.dbline 237
; for(i=0;i<number;i++) //读取数据
clr R12
rjmp L65
L62:
.dbline 238
.dbline 239
mov R16,R10
rcall _read_sja
ldi R24,<_RxBuffer
ldi R25,>_RxBuffer
mov R30,R12
clr R31
add R30,R24
adc R31,R25
std z+0,R16
.dbline 240
inc R10
.dbline 241
L63:
.dbline 237
inc R12
L65:
.dbline 237
cp R12,R20
brlo L62
.dbline 242
; {
; RxBuffer[i]=read_sja(prbuf);
; prbuf++;
; }
; result=TRUE; //读取到正确的数据则返回TRUE
ldi R22,1
.dbline 243
; write_sja(CMR,0x04); //最后释放FXFIFO
ldi R18,4
ldi R16,1
rcall _write_sja
.dbline 244
; }
L59:
.dbline 245
; }
L56:
.dbline 246
; }
L50:
.dbline 247
; return result;
mov R16,R22
.dbline -2
L49:
adiw R28,13
rcall pop_gset4
.dbline 0 ; func end
ret
.dbsym l RxData 0 A[13:13]c
.dbsym r sff 12 c
.dbsym r number 20 c
.dbsym r result 22 c
.dbsym r status 20 c
.dbsym r prbuf 10 c
.dbsym r i 12 c
.dbend
.area bss(ram, con, rel)
.dbfile E:\罗鹏\工作资料\工作记录\CAN\程序\完成版本\CAN.c
_CanMode::
.blkb 14
.dbsym e CanMode _CanMode A[14:14]c
_RevFlag::
.blkb 1
.dbsym e RevFlag _RevFlag c
_TransBuffer::
.blkb 13
.dbsym e TransBuffer _TransBuffer A[13:13]c
_RxBuffer::
.blkb 13
.dbsym e RxBuffer _RxBuffer A[13:13]c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -