Upload
phillip-white
View
214
Download
0
Embed Size (px)
Citation preview
Controller Area Network(CAN)
Lecture 5.1
Reference
MSCANBlock GuideV02.14
S12MSCANV2.pdf
PIM_9C32
Block Diagram
CAN module
PCA82C250 / 251CAN Transceiver
0.4 Mbps3m
=2(15ns + 150ns) = 330ns
Bit time =2500ns
2 4MHz
250ns 2500/250 = 10
330/250 = 210 2
7 so PROP_SEG = 3, PHASE_SEG1 = 3 and PHASE_SEG2 = 3
RJW = 3
320x10
= 0.015
32(127)
= 0.0118
21033331.18%
BSET CANCTL1,#$80 ;turn on CAN
$141
;place CAN in init modeCAN_INI BSET CANCTL0,#$01
BRCLR CANCTL1,#$01,CAN_INI
$141
$140
;Bus clock, listen offLDAA #$C0STAA CANCLT1
$141
$141
$140
;CSWAI,WUPE,TIME,SLPRQ offBCLR CANCTL0,#$2E
$140
$140
;CSWAI,WUPE,TIME,SLPRQ offBCLR CANCTL0,#$2E
1 3 + 3 = 6 3
1 0
$142
1 0 0 0 0 0 0 1
MOVB #$81,CANBTR0
Prescale = 2
$142
$143
TSEG2 = 3
0 1 0 3 Tq clock cycles
0 0 1 0
$143
0 0 1 0 0 1 0 1
0 1 0 1 6 Tq clock cycles
TSEG1 = 6
MOVB #$25,CANBTR1
$143
ID = 127 ID = 1
IDR0 = $00IDR1 = $18IDR2 = $00IDR3 = $FE
IDR0 = $00IDR1 = $18IDR2 = $00IDR3 = $02
$150
$151
$152
$153
$158
$159
$15A
$15B
$154
$155
$156
$157
$15C
$15D
$15E
$15F
MOVB #$00,CANIDAC
$14B
$FFFF0001$FFFF0001
$001800FE
ID = 127
$FFFF0001$FFFF0001
$00180002
ID = 1
;Acceptance & Mask registers
MOVW #$0018,CAN0IDA0 ; ID = $0018MOVW #$00FE,CAN0IDA2 ; ID = $00FEMOVW #$FFFF,CAN0IDM0 ; filter = $FFFFMOVW #$0001,CAN0IDM2 ; filter = $0001MOVW #$0018,CAN0IDA4 ; ID = $0018MOVW #$0002,CAN0IDA6 ; ID = $0002MOVW #$FFFF,CAN0IDM4 ; filter = $FFFFMOVW #$0001,CAN0IDM6 ; filter = $0001
BCLR CANCTL0,#$01
EXIT CAN INIT MODE
$140
;wait for syncSYNC BRCLR CANCTL0,#$10,SYNC
$140
LDAB DLRANDB #$0F
$14B
$146
$146
;wait for an available transmit registeragain BRCLR CANTFLG,#$07,again
$14A
$146
$14A
LDAA CANTFLG ; read 00000110STAA CANTBSEL ;write 00000110 <fill TX foreground buffer>LDAA CANTBSEL ; read 00000010STAA CANTFLG ;send data out TX1
ID_SMSG dw $0018 ;CAN ID registersdw $0002
S_DATA db $41 ;CAN DATA db $42db $43db $44db $45db $46db $47db $48
S_DL db 8 ;CAN DATA LengthPRIO_MSG db 0 ;CAN Priority register
LDX #ID_SMSG ;X -> CAN IDsLDY #CANTXFG ;Y -> TX foreground buffer
MOVW 2,X+,2,Y+ ;transmit IDsMOVW 2,X+,2,Y+
LDAB #10loop1 MOVB 1,X+,1,Y+ ;move 10 bytes to TX FG buffer
DECBBNE loop1
$144
$144
$144
$144
$144
;wait for new messageself2 BRCLR CANRFLG,#$01,self2
BSET CANRFLG,#$01 ;clr RXF BSET CANCNTL0,#$80 ;clr RXFRM
$140
;CAN RX foreground buffer thru +$16FCANRXFG: EQU $160
; Move data from foreground buffer to RX bufferLDX #R_ID ;X -> CAN IDsLDY #CANRXFG ;Y -> RX foreground buffer
MOVW 2,Y+,2,X+ ;receive IDsMOVW 2,Y+,2,X+
LDAB 8,Y ;B = no. of data bytesloop1 MOVB 1,Y+,1,X+ ;move data bytes to rx buffer
DECBBNE loop1
ORG $800;RX BufferR_ID rmb 4 ;CAN ID registersR_DATA rmb 8 ;CAN receive data buffer R_DL rmb 1 ;CAN DATA Length
;Example of a CAN TransmitterCANCTL0: EQU $140 ;CAN control register 0CANCTL1: EQU $141 ;CAN control register 1CANBTR0: EQU $142 ;CAN bus timing register 0CANBTR1: EQU $143 ;CAN bus timing register 1CANRFLG: EQU $144 ;CAN receiver flagsCANRIER: EQU $145 ;CAN receiver interrupt enablesCANTFLG: EQU $146 ;CAN transmit flagsCANTIER: EQU $147 ;CAN transmit interrupt enablesCANTARQ: EQU $148 ;CAN transmit message abort controlCANTAAK: EQU $149 ;CAN transmit message abort statusCANTBEL: EQU $14A ;CAN transmit buffer selectCANIDAC: EQU $14B ;CAN identfier acceptance control
Transmitter Example
CANRERR: EQU $14E ;CAN Receive error counterCANTERR: EQU $14F ;CAN Transmit error counterCANIDA0: EQU $150 ;CAN Identifier acceptance register 0CANIDA1: EQU $151 ;CAN Identifier acceptance register 1CANIDA2: EQU $152 ;CAN Identifier acceptance register 2CANIDA3: EQU $153 ;CAN Identifier acceptance register 3CANIDM0: EQU $154 ;CAN Identifier mask register 0CANIDM1: EQU $155 ;CAN Identifier mask register 1CANIDM2: EQU $156 ;CAN Identifier mask register 2CANIDM3: EQU $157 ;CAN Identifier mask register 3CANIDA4: EQU $158 ;CAN Identifier acceptance register 4CANIDA5: EQU $159 ;CAN Identifier acceptance register 5CANIDA6: EQU $15A ;CAN Identifier acceptance register 6CANIDA7: EQU $15B ;CAN Identifier acceptance register 7CANIDM4: EQU $15C ;CAN Identifier mask register 4CANIDM5: EQU $15D ;CAN Identifier mask register 5CANIDM6: EQU $15E ;CAN Identifier mask register 6CANIDM7: EQU $15F ;CAN Identifier mask register 7CANRXFG: EQU $160 ;CAN RX foreground buffer thru +$16FCANTXFG: EQU $170 ;CAN TX foreground buffer thru +$17F
ORG $800
ID_SMSG dw $0018 ;CAN ID registersdw $0002
S_DATA db $41 ;CAN DATA db $42db $43db $44db $45db $46db $47db $48
S_DL db 8 ;CAN DATA LengthPRIO_MSG db 0 ;CAN Priority register
ORG $4000
;Initialize CAN port
main BSET CANCTL1, #$80 ;enable CAN
;place CAN in init modeCAN_INI
BSET CANCTL0,#$01 ;Initialization ModeBRCLR CANCTL1,#$01,CAN_INI
LDAA #$C0STAA CANCTL1 ;use bus clock, turn off listen mode
MOVB #$81,CANBTR0 ;3Tq Synch and baud rate prescaler =2MOVB #$25,CANBTR1 ;1 samp, tseg1=6, tseg2=3 ;MOVB #$00,CANIDAC ;two 32bit acceptance filters
BCLR CANCTL0,#$01 ;Leave initialization mode
;wait for syncSYNC BRCLR CANCTL0,#$10,SYNC
;Check to make sure some buffer is emptyagain BRCLR CANTFLG, #$07, again
BCLR CANCTL0,#$2E ;CSWAI,WUPE,TIME,SLPRQ off
;select next available buffer as transmit bufferLDAA CANTFLGSTAA CANTBEL
LDX #ID_SMSG ;X -> CAN IDsLDY #CANTXFG ;Y -> TX foreground bufferMOVW 2,X+,2,Y+ ;transmit IDsMOVW 2,X+,2,Y+
LDAB #10loop1 MOVB 1,X+,1,Y+ ;move 10 bytes to TX fore buffer
DECBBNE loop1
LDAA CANTBEL ;read next available TX bufferSTAA CANTFLG ;send data over CAN bus
BRA again ;send them all again
;Example of CAN Receiver
ORG $800
R_ID rmb 4 ;CAN ID registersR_DATA rmb 8 ;CAN receive data buffer R_DL rmb 1 ;CAN DATA Length
outa equ $FF4Fout1byt equ $FF52outcrlf equ $FF5B
Receiver Example
ORG $4000main BSET CANCTL1, #$80 ;enable CAN
;place CAN in init modeCAN_INI
BSET CANCTL0,#$01 ;Initialization ModeBRCLR CANCTL1,#$01,CAN_INILDAA #$C0STAA CANCTL1 ;use bus clock, listen mode offMOVB #$81,CANBTR0 ;3Tq Synch baud rate prescale=2MOVB #$25,CANBTR1 ;1 samp, tseg1=6, tseg2=3 ;MOVB #$00,CANIDAC ;two 32bit acceptance filters
;Acceptance & Mask registers MOVW #$0018,CANIDA0 ; ID = $0018MOVW #$00FE,CANIDA2 ; ID = $00FEMOVW #$FFFF,CANIDM0 ; filter = $FFFFMOVW #$0001,CANIDM2 ; filter = $0001MOVW #$0018,CANIDA4 ; ID = $0018MOVW #$0002,CANIDA6 ; ID = $0002MOVW #$FFFF,CANIDM4 ; filter = $FFFFMOVW #$0001,CANIDM6 ; filter = $0001
BCLR CANCTL0,#$01 ;Leave initialization mode
;wait for syncSYNC BRCLR CANCTL0,#$10,SYNC
BCLR CANCTL0,#$2E ;CSWAI,WUPE,TIME,SLPRQ off
;wait for new messageagain BRCLR CANRFLG,#$01,again
BSET CANRFLG,#$01 ;clr RXF BSET CANCTL0,#$80 ;clr RXFRM
;Move data from foreground buffer to RX bufferLDX #R_ID ;X -> CAN IDsLDY #CANRXFG ;Y -> RX foreground buffer
MOVW 2,Y+,2,X+ ;receive IDsMOVW 2,Y+,2,X+
LDAB 8,Y ;B = no. of data bytesANDB #$0F ;mask upper nibbleSTAB R_DL ;R_DL =no. of data bytes
loop1 MOVB 1,Y+,1,X+ ;move data bytes to receive bufferDECBBNE loop1
;display dataldx #R_DATAldab R_DL
mn1 jsr out1bytjsr outcrlfdecbbne mn1
BRA again
END