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

📄 linmac.lst

📁 基于philips的932单片机的LIN总线程序开发
💻 LST
📖 第 1 页 / 共 5 页
字号:
002C    E5BA           502     						MOV A,SSTAT
002E    5404           503     						ANL A,#04H    ; mask Break Bit
0030    6019           504     						JZ	_NOBREAK
                       505     ;********************************************************************************
                       506     ;Break detected   
                       507     ;********************************************************************************
0032    752101         508     						MOV LINSTATE,#1 ; set Breakflag
0035    D2A0           509     						SETB P2.0       ; ** DEBUG **
                       510     						
                       511     		;*****************************************************
                       512     		;*prepare Timer and counter to evaluate sync sequence*
                       513     		;*****************************************************
0037    C28C           514     						CLR TR0 
                       515     				$IF (_HW_SYNC_COUNTER)
0039    758BFF         516     						MOV TL1,#0FFH			; next falling edge on T1 generates an interrupt
003C    758DFF         517     						MOV TH1,#0FFH   
003F    D28E           518     						SETB TR1					; enable counter
0041    D2AB           519     						SETB ET1				   ; enable interrupt
0043    758A00         520     						MOV TL0,#0
0046    758C00         521     						MOV TH0,#0 ; clear Timer 0
                       522     				$ENDIF
                       523     				$IF (_SW_SYNC_COUNTER)
                               						MOV R4,#5 ;preload number of edges to count (_SyncEdgeCount = R4 in Registerbank 3)
                               						CLR IE1
                               						SETB EX1					 ;enable external Interrupt
                               						MOV TL0,#0FDH;  Offset of -3, because stopping the timer needs three instructioncycles
                               						MOV TH0,#0FFH
                               				$ENDIF
                       530     							    					
                       531     		;Timer and/or external Int are prepared to evaluate the sync-field	
0049    80D2           532     						SJMP _EVENTRETURN	
                       533     _RETI1: 	
                       534     ;********************************************************************************
                       535     ;no Break --> normal data-reception
                       536     ;********************************************************************************
                       537     _NOBREAK:          
004B    209F15         538     						JB  FE,_UARTFRAMINGERROR
004E    300818         539     						JNB LINBREAK,_PROTOCOLERROR  ; Break has to be detected first
0051    300915         540     						JNB LINSYNCED,_PROTOCOLERROR ; the controller has to be synced first
                       541     _TESTIDBIT: 
0054    200A02         542     						JB LINIDRECEIVED,_TESTDATARDY
0057    0100     F     543     						AJMP _EVALUATE_ID
                       544     _TESTDATARDY: 
0059    300D2C         545     						JNB LINDATARDY,_PROCESS_DATA
                       546     _TESTFRAMERDY: 
005C    300E0E         547     						JNB LINFRAMERDY,_PROCESS_CRC
                       548     					;when the controller reaches this point,
                       549     					;it expected less data bytes than sent, and
                       550     					;accidentally the last data-byte was equal to
                       551     					;the CRC, so that no CRC-Error raised.
                       552     					;I now set the Framing-Error.
005F    D213           553     						SETB LINFRAMEERROR  ;Frame Error
0061    80B7           554     						SJMP _ERRORRETURN	
                       555     
                       556     _UARTFRAMINGERROR: 
0063    D215           557     						SETB UARTFRAMINGERROR
0065    C29F           558     						CLR FE
0067    80B1           559     						SJMP _ERRORRETURN				
                       560     						
                       561     _PROTOCOLERROR: 
0069    D214           562     						SETB LINPROTOCOLERROR
006B    80AD           563     						SJMP _ERRORRETURN
                       564     
                       565     ;********************************************************************************
                       566     ;CRC reception and test
                       567     ;********************************************************************************
                       568     _PROCESS_CRC:  						
006D    E599           569     						MOV A,SBUF								;  CRC in Accumulator
006F    300C09         570     						JNB LINTXDATA,_CHECKCRC        	;test if the CRC was transmittet by this node itself (Flag LinTxData)
0072    B51B02         571     						CJNE A,_LINLASTSENT,__VALIDATIONERROR ;validation
                       572     			
0075    8004           573     						SJMP _CHECKCRC
                       574     __VALIDATIONERROR: 
0077    D211           575     						SETB LINVALIDATIONERROR
0079    809F           576     						SJMP _ERRORRETURN
                       577     ;*************************************************		
                       578     
                       579     _CHECKCRC: 
007B    2F             580     						ADD A,R7 ; _LinCRC
007C    B4FF05         581     						CJNE A,#0FFH,_CRCERROR ; sum must be 0xFF
                       582     ;Lin Frame Ok
007F    752167         583     						MOV LINSTATE,#01100111B; set Lin status bits; reset LinTxData, LinRxdata, set Frameready, Datardy, Id, Break and Sync
0082    0100     F     584     						AJMP _EVENTRETURN
                       585     ;*********************************************************
                       586     				
0084    D212           587     _CRCERROR: 			SETB LINCHECKSUMERROR
0086    0100     F     588     						AJMP _ERRORRETURN
                       589     						
                       590     ;********************************************************************************
                       591     ;Process the data reception
                       592     ;********************************************************************************
                       593     _PROCESS_DATA: 
0088    200C02         594     						JB LINTXDATA,_DO_NOT_SET_BIT
008B    D20B           595     						SETB LINRXDATA
                       596     _DO_NOT_SET_BIT: 				
008D    7400     F     597     						MOV A,#LINDATA
008F    2E             598     						ADD A,R6;_ByteLeft
0090    F9             599     						MOV R1,A
0091    A799           600     						MOV @R1,SBUF ;receive the data
                       601     ;calculate CRC
                       602     _CALCCRC: 	
0093    EF             603     						MOV A,R7;_LinCRC
0094    37             604     						ADDC A,@R1
0095    5001           605     						JNC _NOADD
0097    04             606     						INC A
                       607     _NOADD: 
0098    FF             608     						MOV R7,A ;save CRC	; _LinCRC		
                       609     ;test if this was the last byte
0099    EE             610     						MOV A,R6;_ByteLeft
009A    7002           611     						JNZ _NEXT_IS_DATA
009C    D20D           612                 		SETB LINDATARDY
                       613     _NEXT_IS_DATA: 
009E    1E             614     						DEC R6;_ByteLeft
009F    300C16         615     						JNB LINTXDATA,__RXRETI; again, test if this node has to transmit the Lin-data
                       616     						;validate the last data
00A2    E7             617     						MOV A,@R1
00A3    B51BD1         618     						CJNE A,_LINLASTSENT,__VALIDATIONERROR;
00A6    200D0A         619     						JB LINDATARDY,_SENDCRC
                       620     ;send the next databyte
00A9    7400     F     621     						MOV A,#LINDATA
00AB    2E             622     						ADD A,R6;_ByteLeft
00AC    F9             623     						MOV R1,A
00AD    8799           624     						MOV SBUF,@R1
00AF    871B           625     						MOV _LINLASTSENT,@R1;
00B1    0100     F     626     						AJMP _RXRETI
00B3    EF             627     _SENDCRC: 			MOV A,R7; LinCRC
00B4    F4             628     						CPL A   ; A=#0FFH-A
00B5    FB             629     						MOV R3,A;_LinLastSent
00B6    F599           630     						MOV SBUF,A
00B8    0100     F     631     __RXRETI: 			AJMP _RXRETI
                       632     						
                       633     
                       634     ;********************************************************************************
                       635     ;Evaluating the ID-field
                       636     ;********************************************************************************
                       637     _EVALUATE_ID: 
00BA    E599           638     						MOV A,SBUF
00BC    F500     F     639     						MOV LINID,A
00BE    53003F   F     640     		      		ANL LINID,#3FH
00C1    23             641     						RL A
00C2    23             642     						RL A      ; ACC = FL,FL,X,X|X,X,P1,P0
                       643     						; get Frame-Length
00C3    750002   F     644     						MOV LINFRAMELENGTH,#2
00C6    33             645     						RLC A
00C7    500C           646     						JNC _ADDRLC ; ---> one additional RLC has to be done
00C9    750004   F     647     						MOV LINFRAMELENGTH,#4
00CC    33             648     			   		RLC A
00CD    5007           649     						JNC _GETPARITY
00CF    750008   F     650     						MOV LINFRAMELENGTH,#8
00D2    020000   F     651     						LJMP _GETPARITY
00D5    33             652     _ADDRLC:     		RLC A				
                       653     				  		; ACC = X,X,X,X,P1,P0,C,FL
00D6    540C           654     _GETPARITY: 			ANL A,#0CH
00D8    F523           655     						MOV _PARITY,A
                       656     
                       657     _TESTPARITY : 
                       658     						;Parity Check
00DA    E500     F     659     						MOV A,LINID ; renew FrameID in accumulator
00DC    5417           660     						ANL A,#17H  ; Mask Accumulator for Parity0
00DE    A2D0           661     						MOV C,P		; read Parity from Program Status Word
00E0    921E           662     						MOV CALCPAR0,C  ; store Parity 0
00E2    E500     F     663     						MOV A,LINID	;renew FrameID in accumulator
00E4    543A           664     						ANL A,#3AH  ; Mask Accumulator for Parity1
00E6    A2D0           665     						MOV C,P		
00E8    B3             666     						CPL C			; odd Parity 
00E9    921F           667     						MOV CALCPAR1,C ;store Parity 0
                       668     				
                       669     	    ;Parity Ready
                       670     	    	;check parity-bits
00EB    E523           671     						MOV A,_PARITY ; _Parity is in bitadressable RAM ... Bit 2&3 are Par0 & Par1, Bit 5&6 are calcPAr0 and calcPar1
00ED    C4             672     						SWAP A
00EE    B5230E         673     						CJNE A,_PARITY,_PARITY_ERROR
00F1    C210           674     						CLR 	LINPARITYERROR
                       675     				 
00F3    D20A           676     						SETB 	LINIDRECEIVED
                       677     						
00F5    85001E   F     678     						MOV _BYTELEFT,LINFRAMELENGTH
00F8    151E           679     						DEC _BYTELEFT
00FA    751F00         680     						MOV _LINCRC,#0
                       681     				
00FD    0100     F     682     						AJMP _EVENTRETURN
                       683     				
                       684     _PARITY_ERROR: 
00FF    D210           685     						SETB LINPARITYERROR
0101    0100     F     686     						AJMP _ERRORRETURN	

⌨️ 快捷键说明

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