📄 can162.lst
字号:
025B 2F68 MOV R22,R24
025C 2388 TST R24
025D F6A9 BNE 0x0233
(0226) }
(0227) }
(0228) return Err_Flag;
025E 2F04 MOV R16,R20
025F 940E04C7 CALL pop_gset5
0261 9624 ADIW R28,4
0262 9508 RET
_SJASetBaudRateStandard:
Err_Flag --> R20
Err_Cnt --> R22
BaudRateSize --> R10
0263 940E04B2 CALL push_gset3
0265 2EA0 MOV R10,R16
(0229) }
(0230)
(0231) //16MHZ
(0232) unsigned char SJA_BTR_CODETAB[] = {
(0233) 0x53, 0x2F, //20KBPS 0
(0234) 0x87, 0xFF, //40KBPS 1
(0235) 0x47, 0x2F, //50KBPS 2
(0236) 0x83, 0xFF, //80KBPS 3
(0237) 0x43, 0x2F, //100KBPS 4
(0238) 0x03, 0x1C, //125KBPS 5
(0239) 0x81, 0xFA, //200KBPS 6
(0240) 0x01, 0x1C, //250KBPS 7
(0241) 0x80, 0xFA, //400KBPS 8
(0242) 0x00, 0x1C, //500KBPS 9
(0243) 0x80, 0xB6, //666KBPS 10
(0244) 0x00, 0x16, //800KBPS 11
(0245) 0x00, 0x14 //1000KBPS 12
(0246) };
(0247)
(0248) unsigned char SJASetBaudRateStandard(unsigned char BaudRateSize)
(0249) {
(0250) unsigned char Err_Cnt = 0x20;
0266 E260 LDI R22,0x20
(0251) unsigned char Err_Flag = TRUE;
0267 E041 LDI R20,1
(0252) if(BaudRateSize > 12)
0268 E08C LDI R24,0xC
0269 158A CP R24,R10
026A F008 BCS 0x026C
026B C032 RJMP 0x029E
(0253) {
(0254) Err_Flag = TRUE;
(0255) }
026C C037 RJMP 0x02A4
(0256) else
(0257) {
(0258) while(--Err_Cnt)
(0259) {
(0260) write_sja(BTR0, SJA_BTR_CODETAB[BaudRateSize*2]);
026D E082 LDI R24,2
026E 9D8A MUL R24,R10
026F 01F0 MOVW R30,R0
0270 E680 LDI R24,0x60
0271 E090 LDI R25,0
0272 0FE8 ADD R30,R24
0273 1FF9 ADC R31,R25
0274 8120 LDD R18,0+Z
0275 E006 LDI R16,6
0276 DED8 RCALL _write_sja
(0261) if(read_sja(BTR0) != SJA_BTR_CODETAB[BaudRateSize*2])
0277 E006 LDI R16,6
0278 DEC9 RCALL _read_sja
0279 E082 LDI R24,2
027A 9D8A MUL R24,R10
027B 01F0 MOVW R30,R0
027C E680 LDI R24,0x60
027D E090 LDI R25,0
027E 0FE8 ADD R30,R24
027F 1FF9 ADC R31,R25
0280 8020 LDD R2,0+Z
0281 1502 CP R16,R2
0282 F009 BEQ 0x0284
(0262) {
(0263) continue;
0283 C01A RJMP 0x029E
(0264) }
(0265)
(0266) Err_Cnt = 0x20;
0284 E260 LDI R22,0x20
(0267) write_sja(BTR1, SJA_BTR_CODETAB[BaudRateSize*2 + 1]);
0285 E082 LDI R24,2
0286 9D8A MUL R24,R10
0287 01F0 MOVW R30,R0
0288 E681 LDI R24,0x61
0289 E090 LDI R25,0
028A 0FE8 ADD R30,R24
028B 1FF9 ADC R31,R25
028C 8120 LDD R18,0+Z
028D E007 LDI R16,7
028E DEC0 RCALL _write_sja
(0268) if(read_sja(BTR1) != SJA_BTR_CODETAB[BaudRateSize*2 + 1])
028F E007 LDI R16,7
0290 DEB1 RCALL _read_sja
0291 E082 LDI R24,2
0292 9D8A MUL R24,R10
0293 01F0 MOVW R30,R0
0294 E681 LDI R24,0x61
0295 E090 LDI R25,0
0296 0FE8 ADD R30,R24
0297 1FF9 ADC R31,R25
0298 8020 LDD R2,0+Z
0299 1502 CP R16,R2
029A F009 BEQ 0x029C
(0269) {
(0270) continue;
029B C002 RJMP 0x029E
(0271) }
(0272) Err_Flag = FALSE;
029C 2744 CLR R20
(0273) break;
029D C006 RJMP 0x02A4
029E 2F86 MOV R24,R22
029F 5081 SUBI R24,1
02A0 2F68 MOV R22,R24
02A1 2388 TST R24
02A2 F009 BEQ 0x02A4
02A3 CFC9 RJMP 0x026D
(0274) }
(0275) }
(0276) return Err_Flag;
02A4 2F04 MOV R16,R20
02A5 940E04C1 CALL pop_gset3
02A7 9508 RET
_SJASetOtherReg:
Err_Flag --> R20
Err_Cnt --> R22
02A8 940E04AE CALL push_gset2
(0277)
(0278) }
(0279)
(0280) /*void SJAWriteDataToTxBuf(unsigned char Num, unsigned char Data)
(0281) {
(0282) switch(Num)
(0283) {
(0284) case 0:
(0285) TX_Buffer[0] = Data;
(0286) break;
(0287) case 1:
(0288) TX_Buffer[1] = Data;
(0289) break;
(0290) case 2:
(0291) TX_Buffer[2] = Data;
(0292) break;
(0293) case 3:
(0294) TX_Buffer[3] = Data;
(0295) break;
(0296) case 4:
(0297) TX_Buffer[4] = Data;
(0298) break;
(0299) case 5:
(0300) TX_Buffer[5] = Data;
(0301) break;
(0302) case 6:
(0303) TX_Buffer[6] = Data;
(0304) break;
(0305) case 7:
(0306) TX_Buffer[7] = Data;
(0307) break;
(0308) case 8:
(0309) TX_Buffer[8] = Data;
(0310) break;
(0311) case 9:
(0312) TX_Buffer[9] = Data;
(0313) break;
(0314) case 10:
(0315) TX_Buffer[10] = Data;
(0316) break;
(0317) case 11:
(0318) TX_Buffer[11] = Data;
(0319) break;
(0320) case 12:
(0321) TX_Buffer[12] = Data;
(0322) break;
(0323) }
(0324) }*/
(0325)
(0326) unsigned char SJASetOtherReg(void)
(0327) {
(0328) unsigned char Err_Cnt = 0x20;
02AA E260 LDI R22,0x20
(0329) unsigned char Err_Flag = TRUE;
02AB E041 LDI R20,1
(0330)
(0331) if(SJATestRstMode())
02AC DEF7 RCALL _SJATestRstMode
02AD 2300 TST R16
02AE F131 BEQ 0x02D5
(0332) {
(0333) Err_Flag = TRUE;
(0334) }
02AF C02A RJMP 0x02DA
(0335) else
(0336) {
(0337) while(--Err_Cnt)
(0338) {
(0339) write_sja(RXERR,0x00);
02B0 2722 CLR R18
02B1 E00E LDI R16,0xE
02B2 DE9C RCALL _write_sja
(0340) if(read_sja(RXERR) != 0x00)
02B3 E00E LDI R16,0xE
02B4 DE8D RCALL _read_sja
02B5 2300 TST R16
02B6 F009 BEQ 0x02B8
(0341) {
(0342) continue;
02B7 C01D RJMP 0x02D5
(0343) }
(0344)
(0345) Err_Cnt = 0x20;
02B8 E260 LDI R22,0x20
(0346) write_sja(TXERR,0x00);;
02B9 2722 CLR R18
02BA E00F LDI R16,0xF
02BB DE93 RCALL _write_sja
(0347) if(read_sja(TXERR) != 0x00)
02BC E00F LDI R16,0xF
02BD DE84 RCALL _read_sja
02BE 2300 TST R16
02BF F009 BEQ 0x02C1
(0348) {
(0349) continue;
02C0 C014 RJMP 0x02D5
(0350) }
(0351)
(0352) Err_Cnt = 0x20;
02C1 E260 LDI R22,0x20
(0353) write_sja(ECC,0x00);
02C2 2722 CLR R18
02C3 E00C LDI R16,0xC
02C4 DE8A RCALL _write_sja
(0354) if(read_sja(ECC) != 0x00)
02C5 E00C LDI R16,0xC
02C6 DE7B RCALL _read_sja
02C7 2300 TST R16
02C8 F009 BEQ 0x02CA
(0355) {
(0356) continue;
02C9 C00B RJMP 0x02D5
(0357) }
(0358)
(0359) Err_Cnt = 0x20;
02CA E260 LDI R22,0x20
(0360) write_sja(RBSA,0x00);;
02CB 2722 CLR R18
02CC E10E LDI R16,0x1E
02CD DE81 RCALL _write_sja
(0361) if(read_sja(RBSA) != 0x00)
02CE E10E LDI R16,0x1E
02CF DE72 RCALL _read_sja
02D0 2300 TST R16
02D1 F009 BEQ 0x02D3
(0362) {
(0363) continue;
02D2 C002 RJMP 0x02D5
(0364) }
(0365)
(0366) Err_Flag = FALSE;
02D3 2744 CLR R20
(0367) break;
02D4 C005 RJMP 0x02DA
02D5 2F86 MOV R24,R22
02D6 5081 SUBI R24,1
02D7 2F68 MOV R22,R24
02D8 2388 TST R24
02D9 F6B1 BNE 0x02B0
(0368) }
(0369) }
(0370) return Err_Flag;
02DA 2F04 MOV R16,R20
02DB 940E04BE CALL pop_gset2
02DD 9508 RET
_SJASetIER:
Err_Flag --> R20
Err_Cnt --> R22
value --> R10
02DE 940E04B2 CALL push_gset3
02E0 2EA0 MOV R10,R16
(0371) }
(0372)
(0373) unsigned char SJASetIER(unsigned char value)
(0374) {
(0375) unsigned char Err_Cnt = 0x20;
02E1 E260 LDI R22,0x20
(0376) unsigned char Err_Flag = TRUE;
02E2 E041 LDI R20,1
02E3 C009 RJMP 0x02ED
(0377)
(0378) /*if(SJATestRstMode())
(0379) {
(0380) Err_Flag = TRUE;
(0381) }
(0382) else*/
(0383) //{
(0384) while(--Err_Cnt)
(0385) {
(0386) write_sja(IER, value);
02E4 2D2A MOV R18,R10
02E5 E004 LDI R16,4
02E6 DE68 RCALL _write_sja
(0387) if(read_sja(IER) == value)
02E7 E004 LDI R16,4
02E8 DE59 RCALL _read_sja
02E9 150A CP R16,R10
02EA F411 BNE 0x02ED
(0388) {
(0389) Err_Flag = FALSE;
02EB 2744 CLR R20
(0390) break;
02EC C005 RJMP 0x02F2
02ED 2F86 MOV R24,R22
02EE 5081 SUBI R24,1
02EF 2F68 MOV R22,R24
02F0 2388 TST R24
02F1 F791 BNE 0x02E4
(0391) }
(0392) }
(0393) //}
(0394) return Err_Flag;
02F2 2F04 MOV R16,R20
02F3 940E04C1 CALL pop_gset3
02F5 9508 RET
_Init_CAN:
temp --> R22
k --> R20
02F6 940E04AE CALL push_gset2
02F8 9723 SBIW R28,3
(0395) }
(0396)
(0397)
(0398)
(0399) /*************************************************
(0400) SJA1000初始化子函数
(0401) *************************************************/
(0402) void Init_CAN(void)
(0403) {
(0404) unsigned char temp;
(0405) unsigned int k ;
(0406) CLI();
02F9 94F8 BCLR 7
(0407) do
(0408) {
(0409) temp = SJATestInterface(0x55);
02FA E505 LDI R16,0x55
02FB DE60 RCALL _SJATestInterface
02FC 2F60 MOV R22,R16
(0410) }while(temp);//检查硬件连线
02FD 2366 TST R22
02FE F7D9 BNE 0x02FA
(0411) WDR();
02FF 95A8 WDR
(0412) for(k=0;k<6;k++); //延时约5us
0300 2744 CLR R20
0301 2755 CLR R21
0302 C002 RJMP 0x0305
0303 5F4F SUBI R20,0xFF
0304 4F5F SBCI R21,0xFF
0305 3046 CPI R20,6
0306 E0E0 LDI R30,0
0307 075E CPC R21,R30
0308 F3D0 BCS 0x0303
(0413) do
(0414) {
(0415) temp = SJAEntryResetMode();
0309 DE6A RCALL _SJAEntryResetMode
030A 2F60 MOV R22,R16
(0416) }while(temp);
030B 2366 TST R22
030C F7E1 BNE 0x0309
(0417) WDR();
030D 95A8 WDR
(0418) read_sja(IR);//clear IR
030E E003 LDI R16,3
030F DE32 RCALL _read_sja
(0419) for(k=0;k<6;k++); //延时约5us
0310 2744 CLR R20
0311 2755 CLR R21
0312 C002 RJMP 0x0315
0313 5F4F SUBI R20,0xFF
0314 4F5F SBCI R21,0xFF
0315 3046 CPI R20,6
0316 E0E0 LDI R30,0
0317 075E CPC R21,R30
0318 F3D0 BCS 0x0313
(0420) WDR();
0319 95A8 WDR
(0421) if(!SJATestRstMode())
031A DE89 RCALL _SJATestRstMode
031B 2300 TST R16
031C F009 BEQ 0x031E
031D C074 RJMP 0x0392
(0422) {
(0423) do
(0424) {
(0425) temp = SJASetClockDivision(0xC8);
031E EC08 LDI R16,0xC8
031F DEEB RCALL _SJASetClockDivision
0320 2F60 MOV R22,R16
(0426) }while(temp);
0321 2366 TST R22
0322 F7D9 BNE 0x031E
(0427) WDR();
0323 95A8 WDR
(0428) for(k=0;k<6;k++); //延时约5us
0324 2744 CLR R20
0325 2755 CLR R21
0326 C002 RJMP 0x0329
0327 5F4F SUBI R20,0xFF
0328 4F5F SBCI R21,0xFF
0329 3046 CPI R20,6
032A E0E0 LDI R30,0
032B 075E CPC R21,R30
032C F3D0 BCS 0x0327
(0429) do
(0430) {
(0431) temp = SJASetOutControl(0x1a);
032D E10A LDI R16,0x1A
032E DE84 RCALL _SJASetOutControl
032F 2F60 MOV R22,R16
(0432) }while(temp);
0330 2366 TST R22
0331 F7D9 BNE 0x032D
(0433) WDR();
0332 95A8 WDR
(0434) for(k=0;k<6;k++); //延时约5us
0333 2744 CLR R20
0334 2755 CLR R21
0335 C002 RJMP 0x0338
0336 5F4F SUBI R20,0xFF
0337 4F5F SBCI R21,0xFF
0338 3046 CPI R20,6
0339 E0E0 LDI R30,0
033A 075E CPC R21,R30
033B F3D0 BCS 0x0336
(0435) do
(0436) {
(0437) temp = SJASetBaudRateStandard(2);
033C E002 LDI R16,2
033D DF25 RCALL _SJASetBaudRateStandard
033E 2F60 MOV R22,R16
(0438) }while(temp);
033F 2366 TST R22
0340 F7D9 BNE 0x033C
(0439) WDR();
0341 95A8 WDR
(0440) for(k=0;k<6;k++); //延时约5us
0342 2744 CLR R20
0343 2755 CLR R21
0344 C002 RJMP 0x0347
0345 5F4F SUBI R20,0xFF
0346 4F5F SBCI R21,0xFF
0347 3046 CPI R20,6
0348 E0E0 LDI R30,0
0349 075E CPC R21,R30
034A F3D0 BCS 0x0345
(0441) do
(0442) {
(0443) temp = SJASetAccCode(0x00, 0x00, 0x00, 0x00);
034B 2422 CLR R2
034C 822A STD R2,2+Y
034D 8228 STD R2,0+Y
034E 2722 CLR R18
034F 2700 CLR R16
0350 DE7D RCALL _SJASetAccCode
0351 2F60 MOV R22,R16
(0444) }while(temp);
0352 2366 TST R22
0353 F7B9 BNE 0x034B
(0445) WDR();
0354 95A8 WDR
(0446) for(k=0;k<6;k++); //延时约5us
0355 2744 CLR R20
0356 2755 CLR R21
0357 C002 RJMP 0x035A
0358 5F4F SUBI R20,0xFF
0359 4F5F SBCI R21,0xFF
035A 3046 CPI R20,6
035B E0E0 LDI R30,0
035C 075E CPC R21,R30
035D F3D0 BCS 0x0358
(0447) do
(0448) {
(0449) temp = SJASetAccMask(0xFF, 0xFF, 0xFF, 0xFF);
035E EF8F LDI R24,0xFF
035F 838A STD R24,2+Y
0360 8388 STD R24,0+Y
0361 EF2F LDI R18,0xFF
0362 EF0F LDI R16,0xFF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -