;-----------------------------------------------------------------------!
; Init CAN Module [2]!
;-----------------------------------------------------------------------!
; P0.4 CAN 2 Rx !pu/d !hys !inv !filter fast slew !OD
; P0.5 CAN 2 Tx !pu/d !hys !inv !filter fast slew !OD
; P1.12 CAN Stby pu !hys !inv !filter fast slew !OD output
P112= (1<<28)+(12<<20)+(1<<12)+0x01; P1.12[1] out/lo
Clk= 120000000; peripheral clock = 120MHz
;CBT= 250000; can bit rate = 250Kbps
CBT= 1000000; can bit rate = 1Mbps
TQ= 24; nbr time quanta per bit
BPR= ((Clk/CBT)/TQ)-1; baud 250Kbps [24 quanta per bit]
; Sync+Prop+Phase1+Phase2 MUST EQUAL TQ; and all must be <= 8
Sync= 1; sync = 1 [Mandated by spec]
Prop= 7; propagation delay
Phase1= 8; pre sample point
Phase2= 8; post sample point
TSeg1= (Prop+Phase1)-1; minus 1 encoding
TSeg2= (Phase2)-1; minus 1 encoding
SJW= (4)-1; max allowed (and <= min Phase1/2)
SS= 0; 0/1 single/triple sampling
Baud= (SS<<23)+(TSeg2<<20)+(TSeg1<<16)+(SJW<<14)+(BPR<<0)
;------------------------------------------------------------------------
fn InitCAN
push{lr}; save regs
movsr0, pCAN2; enable peripheral clock
blPowerOn;
adrr0, canPins; Assign pins
blPinSetup;
ldrr3, =canBase; setup the CAN Controller
movsr0, 1; disable during setup
strr0, [r3, canMode];
ldrr0, =Baud; CAN bus timing details
strr0, [r3, canTiming];
movsr0, 0; clear errors/disable interrupts
strr0, [r3, canIntEnable];
strr0, [r3, canGStatus];
ldrr1, [r3, canIntStatus]; reset any interrupt flags
movsr1, (1<<3)+(1<<2)+(1<<1); abort tx, release rx, clr overrun
strr1, [r3, canCmd];
; set IRQ handler
; enable Rx Irq
movsr0, 0; enable controller
strr0, [r3, canMode];
ldrr3, =filtBase; bypass acceptance filter
movsr0, 3; and start accepting messages
strr0, [r3, filtCtrl];
ldrr0, =P112; bring CAN transciever
blPioSetDir; out of standby
pop{pc}; return
fe InitCAN
;------------------------------------------------------------------------
canPins:;Port Pin Count Func Flags
.word(0<<28)+(04<<20)+(2<<12)+(2<<8)+0x08; CAN
.word(1<<28)+(12<<20)+(1<<12)+(0<<8)+0x01, 0; GPIO
|