Была задача сделать мост UART 500k <-> CAN 125 kBps.
Долго извращался я с такой-же проблемой, но нужно внимательно "курнуть" даташит на английском.
Русская версия мне была понятной но сути в ней не описано.
В итоге сделал так:
Настраиваем фильтр на каждый приемный MAILBOX, выбираем RX/TX Mailboxes, полная инициализация CAN модуля.
Прием только по прерыванию, приняли CAN сообщение, обработали и в UART его.
Аналогичто все обратно.
Инициализация модуля. Это пример для M16M1, отличие только в количестве Mailbox 0...5, у CAN32/64/128 их 15 штук.
CODE
;----------------------;
can_init: ; Initialization CAN module
;---- CANGCON ---------;
; ABRQ OVRQ TTC SYNTTC LISTEN TEST ENA/STB SWRES
ldi tmp,0b00000010 ; 02 - enabled!
sts CANGCON,tmp ; Can General Control Register
;---- CANGIT-----------;
; CANIT BOFFIT OVRTIM BXOK SERG CERG FERG AERG
ldi tmp,0b00000000 ;
andi tmp,0x7F ; 7-th bit read only!
sts CANGIT,tmp ; Can General Interrupt Register
;---- CANGIE ----------;
; ENIT ENBOFF ENRX ENTX ENERR ENBX ENERG ENOVRT
ldi tmp,0b10100000 ; TX & RX interrupt! было 1011 0000
sts CANGIE,tmp ; Can General Interrupt Enable Register
;-------------------------------------------------------------------------------
; Interrupt Enable & Disable for Mob 5...0
;Mob 5,4,3,2,1,0 ; IEMOB5 IEMOB4 IEMOB3 IEMOB2 IEMOB1 IEMOB0
ldi tmp,0b100000 ; Mob5,0 in interrupt mode!
andi tmp,0x3F ;
sts CANIE2,tmp ; Can Enable Interrupt MOb Register
sts CANIE1,zero ; Can Enable Interrupt MOb Register
;--------------------------------------------------------------------------------
; Read only!
; - OVRG - TXBSY RXBSY ENFG BOFF ERRP
;ldi tmp,0b00000000 ;
;andi tmp,0x5F ; bits 7,5 not used!
;sts CANGSTA,tmp ; Can General Status Register
; Enable or Disable Mob 5...0 ;
; Read only! 0 - Disabled; 1 - Enabled;
; bit provides the availability of the MOb.
;Mob 5,4,3,2,1,0 ; ENMOB5 ENMOB4 ENMOB3 ENMOB2 ENMOB1 ENMOB0; CANEN2
;lds tmp,CANEN2 ; Can Enable MOb Register
; CAN Status Interrupt MOb Registers
; read only!
; - - SIT5 SIT4 SIT3 SIT2 SIT1 SIT0
;lds tmp,CANSIT2 ;
rcall baud_500k ; CAN speed baudrate 500k!
;----------------------;
; CAN Timer Clock Period: 0,500 us
; TPRSC7 TPRSC6 TPRSC5 TPRSC4 TPRSC3 TPRSC2 TRPSC1 TPRSC0
; 16 mhz timer timer ovf interrypt!
; (255 = (255*32.7ms)) = 8338ms
ldi tmp,30 ; 30 make ~ 1s timer interrupt
sts CANTCON,tmp ; Can Timer Control Register
;----------------------;
; CANTIM7 CANTIM6 CANTIM5 CANTIM4 CANTIM3 CANTIM2 CANTIM1 CANTIM0
ldi tmp,0b00000000 ;
sts CANTIML,tmp ; Can Bit Timer RegisterL
; CANTIM15 CANTIM14 CANTIM13 CANTIM12 CANTIM11 CANTIM10 CANTIM9 CANTIM8
ldi tmp,0b00000000 ;
sts CANTIMH,tmp ; Can Bit Timer RegisterH
;----------------------;
; TIMTTC7 TIMTTC6 TIMTTC5 TIMTTC4 TIMTTC3 TIMTTC2 TIMTTC1 TIMTTC0
ldi tmp,0b00000000 ;
sts CANTTCL,tmp ; Can TCC Timer RegisterL
; TIMTTC15 TIMTTC14 TIMTTC13 TIMTTC12 TIMTTC11 TIMTTC10 TIMTTC9 TIMTTC8
ldi tmp,0b00000000 ;
sts CANTTCH,tmp ; Can TCC Timer RegisterH
;----------------------;
; TEC7 TEC6 TEC5 TEC4 TEC3 TEC2 TEC1 TEC0
ldi tmp,0b00000000 ;
sts CANTEC,tmp ; Can Transmit Error Counter Register
; REC7 REC6 REC5 REC4 REC3 REC2 REC1 REC0
ldi tmp,0b00000000 ;
sts CANREC,tmp ; Can Receive Error Counter Register
;----------------------;
; HPMOB3 HPMOB2 HPMOB1 HPMOB0 CGP3 CGP2 CGP1 CGP0
ldi tmp,0b01010000 ; MOB5 - RX
sts CANHPMOB,tmp ; Can Highest Priority MOb Register
;----------------------;
; статус временной ометки CAN 0 ... 65535
; TIMSTM7 TIMSTM6 TIMSTM5 TIMSTM4 TIMSTM3 TIMSTM2 TIMSTM1 TIMSTM0
ldi tmp,0x00 ;
sts CANSTML,tmp ; Can Time Stamp RegisterL
; TIMSTM15 TIMSTM14 TIMSTM13 TIMSTM12 TIMSTM11 TIMSTM10 TIMSTM9 TIMSTM8
ldi tmp,0x00 ;
sts CANSTMH,tmp ; Can Time Stamp RegisterH
;----------------------;
rcall clear_all_mobs ; Clear all mobs buffer!
clr flags ;
ret ;
Настройка скоростей, я использую 16МГц кварц.
CODE
;----------------------;
; CAN Bit Timing Registers 1,2,3
; CAN 8 bit 50.000 Kbps 16 MHz
; Sample Point at 75%
baud_50k:
ldi tmp,0x26 ;
sts CANBT1,tmp ; Can Bit Timming Register
ldi tmp,0x0C ;
sts CANBT2,tmp ; Can Bit Timming Register
ldi tmp,0x37 ;
sts CANBT3,tmp ; Can Bit Timming Register
ret
;----------------------;
; CAN 8 bit 75.000 Kbps 16 MHz
; Sample Point at 75%
baud_75k:
ldi tmp,0x1C ;
sts CANBT1,tmp ; Can Bit Timming Register
ldi tmp,0x0C ;
sts CANBT2,tmp ; Can Bit Timming Register
ldi tmp,0x37 ;
sts CANBT3,tmp ; Can Bit Timming Register
ret
;----------------------;
; CAN 8 bit 83.333 Kbps 16 MHz ( 16 0C 37 old )
; Sample Point at xx.x%
baud_83k:
ldi tmp,0x16 ;
sts CANBT1,tmp ; Can Bit Timming Register
ldi tmp,0x0C ;
sts CANBT2,tmp ; Can Bit Timming Register
ldi tmp,0x37 ;
sts CANBT3,tmp ; Can Bit Timming Register
ret
;----------------------;
; CAN 8 bit 100 Kbps 16 MHz
; Sample Point at 75%
baud_100k: ;
ldi tmp,0x12 ;
sts CANBT1,tmp ; Can Bit Timming Register
ldi tmp,0x0C ;
sts CANBT2,tmp ; Can Bit Timming Register
ldi tmp,0x37 ;
sts CANBT3,tmp ; Can Bit Timming Register
ret
;----------------------;
; CAN 8 bit 125 Kbps 16 MHz
; Sample Point at 75%
baud_125k: ;
ldi tmp,0x0E ;
sts CANBT1,tmp ; Can Bit Timming Register
ldi tmp,0x0C ;
sts CANBT2,tmp ; Can Bit Timming Register
ldi tmp,0x37 ;
sts CANBT3,tmp ; Can Bit Timming Register
ret ;
;----------------------;
; CAN 8 bit 200 Kbps 16 MHz
; Sample Point at 75%
baud_200k: ;
ldi tmp,0x08 ;
sts CANBT1,tmp ; Can Bit Timming Register
ldi tmp,0x0C ;
sts CANBT2,tmp ; Can Bit Timming Register
ldi tmp,0x37 ;
sts CANBT3,tmp ; Can Bit Timming Register
ret ;
;----------------------;
; CAN 8 bit 250 Kbps 16 MHz
; Sample Point at 75%
baud_250k: ;
ldi tmp,0x0E ;
sts CANBT1,tmp ; Can Bit Timming Register
ldi tmp,0x04 ;
sts CANBT2,tmp ; Can Bit Timming Register
ldi tmp,0x13 ;
sts CANBT3,tmp ; Can Bit Timming Register
ret ;
;----------------------;
; CAN 8 bit 500 Kbps 16 MHz
; Sample Point at 75%
baud_500k: ;
ldi tmp,0x02 ;
sts CANBT1,tmp ; Can Bit Timming Register
ldi tmp,0x0C ;
sts CANBT2,tmp ; Can Bit Timming Register
ldi tmp,0x37 ;
sts CANBT3,tmp ; Can Bit Timming Register
ret ;
;----------------------;
; CAN 8 bit 1000 Kbps 16 MHz
; Sample Point at 75%
baud_1m: ;
ldi tmp,0x02 ;
sts CANBT1,tmp ; Can Bit Timming Register
ldi tmp,0x04 ;
sts CANBT2,tmp ; Can Bit Timming Register
ldi tmp,0x13 ;
sts CANBT3,tmp ; Can Bit Timming Register
ret ;
;----------------------;