📄 can_module.s
字号:
; if(!SJATestRstMode())
xcall _SJATestRstMode
tst R16
breq X8
xjmp L115
X8:
.dbline 422
; {
L117:
.dbline 424
; do
; {
.dbline 425
; temp = SJASetClockDivision(0xC8);
ldi R16,200
xcall _SJASetClockDivision
mov R22,R16
.dbline 426
L118:
.dbline 426
; }while(temp);
tst R22
brne L117
.dbline 427
; WDR();
wdr
.dbline 428
clr R20
clr R21
xjmp L123
L120:
.dbline 428
L121:
.dbline 428
subi R20,255 ; offset = 1
sbci R21,255
L123:
.dbline 428
; for(k=0;k<6;k++); //延时约5us
cpi R20,6
ldi R30,0
cpc R21,R30
brlo L120
L124:
.dbline 430
; do
; {
.dbline 431
; temp = SJASetOutControl(0x1a);
ldi R16,26
xcall _SJASetOutControl
mov R22,R16
.dbline 432
L125:
.dbline 432
; }while(temp);
tst R22
brne L124
.dbline 433
; WDR();
wdr
.dbline 434
clr R20
clr R21
xjmp L130
L127:
.dbline 434
L128:
.dbline 434
subi R20,255 ; offset = 1
sbci R21,255
L130:
.dbline 434
; for(k=0;k<6;k++); //延时约5us
cpi R20,6
ldi R30,0
cpc R21,R30
brlo L127
L131:
.dbline 436
; do
; {
.dbline 437
; temp = SJASetBaudRateStandard(2);
ldi R16,2
xcall _SJASetBaudRateStandard
mov R22,R16
.dbline 438
L132:
.dbline 438
; }while(temp);
tst R22
brne L131
.dbline 439
; WDR();
wdr
.dbline 440
clr R20
clr R21
xjmp L137
L134:
.dbline 440
L135:
.dbline 440
subi R20,255 ; offset = 1
sbci R21,255
L137:
.dbline 440
; for(k=0;k<6;k++); //延时约5us
cpi R20,6
ldi R30,0
cpc R21,R30
brlo L134
L138:
.dbline 442
; do
; {
.dbline 443
; temp = SJASetAccCode(0x00, 0x00, 0x00, 0x00);
clr R2
std y+2,R2
std y+0,R2
clr R18
clr R16
xcall _SJASetAccCode
mov R22,R16
.dbline 444
L139:
.dbline 444
; }while(temp);
tst R22
brne L138
.dbline 445
; WDR();
wdr
.dbline 446
clr R20
clr R21
xjmp L144
L141:
.dbline 446
L142:
.dbline 446
subi R20,255 ; offset = 1
sbci R21,255
L144:
.dbline 446
; for(k=0;k<6;k++); //延时约5us
cpi R20,6
ldi R30,0
cpc R21,R30
brlo L141
L145:
.dbline 448
; do
; {
.dbline 449
; temp = SJASetAccMask(0xFF, 0xFF, 0xFF, 0xFF);
ldi R24,255
std y+2,R24
std y+0,R24
ldi R18,255
ldi R16,255
xcall _SJASetAccMask
mov R22,R16
.dbline 450
L146:
.dbline 450
; }while(temp);
tst R22
brne L145
.dbline 451
; WDR();
wdr
.dbline 452
clr R20
clr R21
xjmp L151
L148:
.dbline 452
L149:
.dbline 452
subi R20,255 ; offset = 1
sbci R21,255
L151:
.dbline 452
; for(k=0;k<6;k++); //延时约5us
cpi R20,6
ldi R30,0
cpc R21,R30
brlo L148
L152:
.dbline 454
; do
; {
.dbline 455
; temp = SJASetOtherReg();
xcall _SJASetOtherReg
mov R22,R16
.dbline 456
L153:
.dbline 456
; }while(temp);
tst R22
brne L152
.dbline 457
; WDR();
wdr
.dbline 458
clr R20
clr R21
xjmp L158
L155:
.dbline 458
L156:
.dbline 458
subi R20,255 ; offset = 1
sbci R21,255
L158:
.dbline 458
; for(k=0;k<6;k++); //延时约5us
cpi R20,6
ldi R30,0
cpc R21,R30
brlo L155
L159:
.dbline 460
; do
; {
.dbline 461
; temp = SJAQuitResetMode();
xcall _SJAQuitResetMode
mov R22,R16
.dbline 462
L160:
.dbline 462
; }while(temp);
tst R22
brne L159
.dbline 464
;
; WDR();
wdr
.dbline 465
clr R20
clr R21
xjmp L165
L162:
.dbline 465
L163:
.dbline 465
subi R20,255 ; offset = 1
sbci R21,255
L165:
.dbline 465
; for(k=0;k<6;k++); //延时约5us
cpi R20,6
ldi R30,0
cpc R21,R30
brlo L162
L166:
.dbline 467
; do
; {
.dbline 468
; temp = SJASetIER(0x01);
ldi R16,1
xcall _SJASetIER
mov R22,R16
.dbline 469
L167:
.dbline 469
; }while(temp);
tst R22
brne L166
.dbline 472
;
;
; }
L115:
.dbline 474
;
; write_sja(CMR,0x0c); //清除数据溢出和释放接收缓冲器;
ldi R18,12
ldi R16,1
xcall _write_sja
.dbline 475
clr R20
clr R21
xjmp L172
L169:
.dbline 475
L170:
.dbline 475
subi R20,255 ; offset = 1
sbci R21,255
L172:
.dbline 475
; for(k=0;k<6;k++); //延时约5us
cpi R20,6
ldi R30,0
cpc R21,R30
brlo L169
.dbline 476
; WDR();
wdr
L173:
.dbline 478
; do
; {
.dbline 479
; write_sja(MODE, 0x0C);
ldi R18,12
clr R16
xcall _write_sja
.dbline 480
L174:
.dbline 480
; }while((read_sja(MODE) & 0x01));
clr R16
xcall _read_sja
sbrc R16,0
rjmp L173
.dbline 490
; /*WDR();
; for(k=0;k<6;k++); //延时约5us
; if(SJATestRstMode())
; {
; do
; {
; temp = SJASetIER(0x01);
; }while(temp);
; }*/
; SEI();
sei
.dbline -2
.dbline 492
;
; }
L100:
adiw R28,3
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r temp 22 c
.dbsym r k 20 i
.dbend
.dbfunc e CanTransmit _CanTransmit fV
; status -> <dead>
.even
_CanTransmit::
.dbline -1
.dbline 497
; /*************************************************
; SJA1000发送子函数
; *************************************************/
; void CanTransmit(void)
; {
.dbline 499
; unsigned char status;
; CLI(); //关中断
cli
.dbline 514
; //实际用时对SJAWriteDataToTxBuf();的调用在个检测模块中
; /*SJAWriteDataToTxBuf(0, 0x88);
; SJAWriteDataToTxBuf(1, 0x00);
; SJAWriteDataToTxBuf(2, 0x00);
; SJAWriteDataToTxBuf(3, 0x00);
; SJAWriteDataToTxBuf(4, 0x00);
; SJAWriteDataToTxBuf(5, 0x01);
; SJAWriteDataToTxBuf(6, 0x02);
; SJAWriteDataToTxBuf(7, 0x03);
; SJAWriteDataToTxBuf(8, 0x04);
; SJAWriteDataToTxBuf(9, 0x05);
; SJAWriteDataToTxBuf(10, 0x06);
; SJAWriteDataToTxBuf(11, 0x07);
; SJAWriteDataToTxBuf(12, 0xaa);*/
; TX_Buffer[0]=0x88;
ldi R24,136
sts _TX_Buffer,R24
.dbline 515
; TX_Buffer[1]=0x00;
clr R2
sts _TX_Buffer+1,R2
.dbline 516
; TX_Buffer[2]=0x00;
sts _TX_Buffer+2,R2
.dbline 517
; TX_Buffer[3]=0x00;
sts _TX_Buffer+3,R2
.dbline 518
; TX_Buffer[4]=0x00;
sts _TX_Buffer+4,R2
.dbline 519
; TX_Buffer[5]=0x01;
ldi R24,1
sts _TX_Buffer+5,R24
.dbline 520
; TX_Buffer[6]=0x02;
ldi R24,2
sts _TX_Buffer+6,R24
.dbline 521
; TX_Buffer[7]=0x03;
ldi R24,3
sts _TX_Buffer+7,R24
.dbline 522
; TX_Buffer[8]=0x04;
ldi R24,4
sts _TX_Buffer+8,R24
.dbline 523
; TX_Buffer[9]=0x05;
ldi R24,5
sts _TX_Buffer+9,R24
.dbline 524
; TX_Buffer[10]=0x06;
ldi R24,6
sts _TX_Buffer+10,R24
.dbline 525
; TX_Buffer[11]=0x07;
ldi R24,7
sts _TX_Buffer+11,R24
.dbline 526
; TX_Buffer[12]=0xaa;
ldi R24,170
sts _TX_Buffer+12,R24
L189:
.dbline 528
L190:
.dbline 528
;
; while(!(read_sja(SR)&0x04)); //wait until reg2^2==1 ,即判断发送缓冲器的状态
ldi R16,2
xcall _read_sja
sbrs R16,2
rjmp L189
.dbline 530
;
; write_sja(TXEFF, TX_Buffer[0]); //扩展帧,数据长度为8个字节
lds R18,_TX_Buffer
ldi R16,16
xcall _write_sja
.dbline 531
; write_sja(TXID0, TX_Buffer[1]);
lds R18,_TX_Buffer+1
ldi R16,17
xcall _write_sja
.dbline 532
; write_sja(TXID1, TX_Buffer[2]);
lds R18,_TX_Buffer+2
ldi R16,18
xcall _write_sja
.dbline 533
; write_sja(TXID2, TX_Buffer[3]);
lds R18,_TX_Buffer+3
ldi R16,19
xcall _write_sja
.dbline 534
; write_sja(TXID3, TX_Buffer[4]);
lds R18,_TX_Buffer+4
ldi R16,20
xcall _write_sja
.dbline 535
; write_sja(TXDATA0, TX_Buffer[5]);
lds R18,_TX_Buffer+5
ldi R16,21
xcall _write_sja
.dbline 536
; write_sja(TXDATA1, TX_Buffer[6]);
lds R18,_TX_Buffer+6
ldi R16,22
xcall _write_sja
.dbline 537
; write_sja(TXDATA2, TX_Buffer[7]);
lds R18,_TX_Buffer+7
ldi R16,23
xcall _write_sja
.dbline 538
; write_sja(TXDATA3, TX_Buffer[8]);
lds R18,_TX_Buffer+8
ldi R16,24
xcall _write_sja
.dbline 539
; write_sja(TXDATA4, TX_Buffer[9]);
lds R18,_TX_Buffer+9
ldi R16,25
xcall _write_sja
.dbline 540
; write_sja(TXDATA5, TX_Buffer[10]);
lds R18,_TX_Buffer+10
ldi R16,26
xcall _write_sja
.dbline 541
; write_sja(TXDATA6, TX_Buffer[11]);
lds R18,_TX_Buffer+11
ldi R16,27
xcall _write_sja
.dbline 542
; write_sja(TXDATA7, TX_Buffer[12]);
lds R18,_TX_Buffer+12
ldi R16,28
xcall _write_sja
.dbline 543
; write_sja(CMR,0x10); //发送请求命令
ldi R18,16
ldi R16,1
xcall _write_sja
L204:
.dbline 544
L205:
.dbline 544
; while(!(read_sja(SR) & 0x08));//检测SR.3位,判断发送是否完成
ldi R16,2
xcall _read_sja
sbrs R16,3
rjmp L204
.dbline 545
; SEI(); //开中断
sei
.dbline -2
.dbline 546
; }
L176:
.dbline 0 ; func end
ret
.dbsym l status 1 c
.dbend
.dbfunc e CanReceive _CanReceive fc
; sff -> R12
; number -> R20
; result -> R22
; status -> R20
; prbuf -> R10
; i -> R12
.even
_CanReceive::
xcall push_gset4
.dbline -1
.dbline 549
;
; unsigned char CanReceive(void)
; {
.dbline 550
; unsigned char result = FALSE;
clr R22
.dbline 553
; unsigned char status,number,i,sff;
; unsigned char prbuf;
; status = read_sja(SR);
ldi R16,2
xcall _read_sja
mov R20,R16
.dbline 554
; prbuf = RXEFF;
ldi R24,16
mov R10,R24
.dbline 555
; if((status&0xc3) != 0) //读取总线脱离、错误状态、接收溢出、有数据等位
mov R24,R20
andi R24,195
brne X9
xjmp L208
X9:
.dbline 556
; {
.dbline 557
; if((status&0x80) == 0x80)
mov R24,R20
andi R24,128
cpi R24,128
brne L210
.dbline 558
; {
.dbline 559
; write_sja(MODE, 0x00);
clr R18
clr R16
xcall _write_sja
.dbline 560
; return FALSE;
clr R16
xjmp L207
L210:
.dbline 562
; }
; if((status&0x02) == 0x02)
mov R24,R20
andi R24,2
cpi R24,2
brne L212
.dbline 563
; {
.dbline 564
; write_sja(CMR, 0x0c);
ldi R18,12
ldi R16,1
xcall _write_sja
.dbline 565
; return FALSE;
clr R16
xjmp L207
L212:
.dbline 568
; }
;
; if((status&0x01) == 0x01)
mov R24,R20
andi R24,1
cpi R24,1
brne L214
.dbline 569
; {
.dbline 570
; if((read_sja(RXEFF) & 0x40) == 0x40) //如果RTR=1,为远程帧
ldi R16,16
xcall _read_sja
mov R24,R16
andi R24,64
cpi R24,64
brne L216
.dbline 571
; {
.dbline 572
; write_sja(CMR, 0x04); //则释放FXFIFO
ldi R18,4
ldi R16,1
xcall _write_sja
.dbline 573
; }
xjmp L217
L216:
.dbline 575
; else //为0,则是数据帧
; {
.dbline 576
; sff = read_sja(prbuf) & 0x80; //取第一个字节的最高位
mov R16,R10
xcall _read_sja
mov R24,R16
andi R24,128
mov R12,R24
.dbline 577
; number = (read_sja(prbuf) & 0x0f);//取第一个字节的低四位,即数据长度
mov R16,R10
xcall _read_sja
mov R20,R16
andi R20,15
.dbline 578
; if((sff & 0x80) == 0x80) //判断是标准帧还是扩展帧
mov R24,R12
andi R24,128
cpi R24,128
brne L218
.dbline 579
; number = number + 5; //扩展帧,则帧的总长度加5(13字节)
subi R20,251 ; addi 5
xjmp L219
L218:
.dbline 581
; else
; number = number + 3; //标准帧,则帧的总长度加3(11字节)
subi R20,253 ; addi 3
L219:
.dbline 582
; for(i = 0; i < number; i++) //读取数据
clr R12
xjmp L223
L220:
.dbline 583
.dbline 584
mov R16,R10
xcall _read_sja
ldi R24,<_RX_Buffer
ldi R25,>_RX_Buffer
mov R30,R12
clr R31
add R30,R24
adc R31,R25
std z+0,R16
.dbline 585
inc R10
.dbline 586
L221:
.dbline 582
inc R12
L223:
.dbline 582
cp R12,R20
brlo L220
.dbline 587
; {
; RX_Buffer[i]=read_sja(prbuf);
; prbuf++;
; }
; result = TRUE; //读取到正确的数据则返回TRUE
ldi R22,1
.dbline 588
; write_sja(CMR, 0x04); //最后释放FXFIFO
ldi R18,4
ldi R16,1
xcall _write_sja
.dbline 589
; }
L217:
.dbline 590
; }
L214:
.dbline 591
; }
L208:
.dbline 592
; return result;
mov R16,R22
.dbline -2
L207:
xcall pop_gset4
.dbline 0 ; func end
ret
.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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -