Доку на русском читаю, понять толком не могу.
CODE
.cseg
RESET: //
// STACK INIT
ldi tmp, low(ramend) //
out SPL,tmp //
ldi tmp,high(ramend) //
out SPH,tmp //
// CAN
ldi tmp,0b00000010 //
sts CANGCON,tmp // Can General Control Register
ldi tmp,0b00000000 //
sts CANGSTA,tmp // Can General Status Register
ldi tmp,0b00000000 //
sts CANGIT,tmp // Can General Interrupt Register
ldi tmp,0b00000000 //
sts CANGIE,tmp // Can General Interrupt Enable Register
ldi tmp,0b00000000 //
sts CANEN2,tmp // Can Enable MOb Register
ldi tmp,0b11111111 //
sts CANEN1,tmp // Can Enable MOb Register
ldi tmp,0b11111111 //
sts CANIE2,tmp // Can Enable Interrupt MOb Register
ldi tmp,0b00000000 //
sts CANIE1,tmp // Can Enable Interrupt MOb Register
ldi tmp,0b00000000 //
sts CANSIT2,tmp // Can Status Interrupt MOb Register
ldi tmp,0b00000000 //
sts CANSIT1,tmp // Can Status Interrupt MOb Register
// CAN 8 bit 250 Kbps 16 MHz
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
ldi tmp,0b00000000 //
sts CANTCON,tmp // Can Timer Control Register
ldi tmp,0b00000000 //
sts CANTIML,tmp // Can Bit Timer RegisterL
ldi tmp,0b00000000 //
sts CANTIMH,tmp // Can Bit Timer RegisterH
ldi tmp,0b00000000 //
sts CANTTCL,tmp // Can TCC Timer RegisterL
ldi tmp,0b00000000 //
sts CANTTCH,tmp // Can TCC Timer RegisterH
ldi tmp,0b00000000 //
sts CANTEC,tmp // Can Transmit Error Counter Register
ldi tmp,0b00000000 //
sts CANREC,tmp // Can Receive Error Counter Register
ldi tmp,0b00000000 //
sts CANHPMOB,tmp // Can Highest Priority MOb Register
// MOBNB0 ... MOBNB3 номер Mob 0 ... 14
// AINC - 0 автоинкремент индекса 1 нет автоинкремента индекса
// INDX0 ... INDX2 местоположение байта данных CAN в FIFO для определенного Mob
ldi tmp,(0<<MOBNB3)|(0<<MOBNB2)|(0<<MOBNB1)|(0<<MOBNB0)|(0<<AINC)|(0<<INDX2)|(0<<INDX1)|(0<<INDX0)
sts CANPAGE,tmp // Can Page MOb Register
// Регистр состояния объектов сообщения CAN
ldi tmp,0b00000000 //
sts CANSTMOB,tmp // Can MOb Status Register
// CANCDMOB инициализация
// CANMOB1:0 конфигурация объекта сообщения
// 0 0 - запрет 0 1 - разрешение передачи 1 0 - разрешение приема 1 1 - разрешение приема буфера кадра
// RPLV - ответ допустим
// 0 - ответ не готов
// 1 - ответ готов и допустим
// IDE расширение идентификатора
// 0 - CAN 2.0A (длинна идентификаторов 11 бит)
// 1 - CAN 2.0B (длинна идентификаторов 29 бит)
// DLC 0...3 количество байт в сообщении 0...8
ldi tmp,(0<<CONMOB1)|(1<<CONMOB0)|(1<<RPLV)|(0<<IDE)|(1<<DLC3)|(0<<DLC2)|(0<<DLC1)|(0<<DLC0) //
sts CANCDMOB,tmp // Can MOb Control and DLC Register
// Регистры тэга идентификатора CAN
// Если CABNMOB bit IDE равен 1
// ID = 29 bit CANIDT1 (7..0) CANIDT2 (7..0) CANIDT3 (7..0) CANIDT4 (7..3) направление ID <- 28 ...0
// Если CABNMOB bit IDE равен 0
// ID = 11 bit CANIDT1 (7..0) CANIDT2 (7..5) CANIDT3 =0 CANIDT4 &0x05 направление ID <- 10 ...0
ldi xl,low (0x100) // 0 ... 0x7FF
ldi xh,high(0x100) // 0 ... 0x7FF
mov tmp,xl //
swap tmp //
lsl tmp //
andi tmp,0xE0 //
lsr xh
ror xl
lsr xh
ror xl
lsr xh
ror xl
sts CANIDT1,xl // Can Identifier Tag Register1
sts CANIDT2,tmp // Can Identifier Tag Register2
ldi tmp,0x00 //
sts CANIDT3,tmp // Can Identifier Tag Register3
ldi tmp,0x00 //
sts CANIDT4,tmp // Can Identifier Tag Register4
// Регистры маски идентификатора CAN
ldi tmp,0xFE //
sts CANIDM1,tmp // Can Identifier Mask Register1
ldi tmp,0xE0 //
sts CANIDM2,tmp // Can Identifier Mask Register2
ldi tmp,0x00 //
sts CANIDM3,tmp // Can Identifier Mask Register3
ldi tmp,0x00 //
sts CANIDM4,tmp // Can Identifier Mask Register4
// статус временной ометки CAN 0 ... 65535
ldi tmp,0b00000000 //
sts CANSTML,tmp // Can Time Stamp RegisterL
ldi tmp,0b00000000 //
sts CANSTMH,tmp // Can Time Stamp RegisterH
// Регистр данных сообщения CAN
ldi tmp,0x85 //
sts CANMSG,tmp // Can Data Message Register
RESET: //
// STACK INIT
ldi tmp, low(ramend) //
out SPL,tmp //
ldi tmp,high(ramend) //
out SPH,tmp //
// CAN
ldi tmp,0b00000010 //
sts CANGCON,tmp // Can General Control Register
ldi tmp,0b00000000 //
sts CANGSTA,tmp // Can General Status Register
ldi tmp,0b00000000 //
sts CANGIT,tmp // Can General Interrupt Register
ldi tmp,0b00000000 //
sts CANGIE,tmp // Can General Interrupt Enable Register
ldi tmp,0b00000000 //
sts CANEN2,tmp // Can Enable MOb Register
ldi tmp,0b11111111 //
sts CANEN1,tmp // Can Enable MOb Register
ldi tmp,0b11111111 //
sts CANIE2,tmp // Can Enable Interrupt MOb Register
ldi tmp,0b00000000 //
sts CANIE1,tmp // Can Enable Interrupt MOb Register
ldi tmp,0b00000000 //
sts CANSIT2,tmp // Can Status Interrupt MOb Register
ldi tmp,0b00000000 //
sts CANSIT1,tmp // Can Status Interrupt MOb Register
// CAN 8 bit 250 Kbps 16 MHz
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
ldi tmp,0b00000000 //
sts CANTCON,tmp // Can Timer Control Register
ldi tmp,0b00000000 //
sts CANTIML,tmp // Can Bit Timer RegisterL
ldi tmp,0b00000000 //
sts CANTIMH,tmp // Can Bit Timer RegisterH
ldi tmp,0b00000000 //
sts CANTTCL,tmp // Can TCC Timer RegisterL
ldi tmp,0b00000000 //
sts CANTTCH,tmp // Can TCC Timer RegisterH
ldi tmp,0b00000000 //
sts CANTEC,tmp // Can Transmit Error Counter Register
ldi tmp,0b00000000 //
sts CANREC,tmp // Can Receive Error Counter Register
ldi tmp,0b00000000 //
sts CANHPMOB,tmp // Can Highest Priority MOb Register
// MOBNB0 ... MOBNB3 номер Mob 0 ... 14
// AINC - 0 автоинкремент индекса 1 нет автоинкремента индекса
// INDX0 ... INDX2 местоположение байта данных CAN в FIFO для определенного Mob
ldi tmp,(0<<MOBNB3)|(0<<MOBNB2)|(0<<MOBNB1)|(0<<MOBNB0)|(0<<AINC)|(0<<INDX2)|(0<<INDX1)|(0<<INDX0)
sts CANPAGE,tmp // Can Page MOb Register
// Регистр состояния объектов сообщения CAN
ldi tmp,0b00000000 //
sts CANSTMOB,tmp // Can MOb Status Register
// CANCDMOB инициализация
// CANMOB1:0 конфигурация объекта сообщения
// 0 0 - запрет 0 1 - разрешение передачи 1 0 - разрешение приема 1 1 - разрешение приема буфера кадра
// RPLV - ответ допустим
// 0 - ответ не готов
// 1 - ответ готов и допустим
// IDE расширение идентификатора
// 0 - CAN 2.0A (длинна идентификаторов 11 бит)
// 1 - CAN 2.0B (длинна идентификаторов 29 бит)
// DLC 0...3 количество байт в сообщении 0...8
ldi tmp,(0<<CONMOB1)|(1<<CONMOB0)|(1<<RPLV)|(0<<IDE)|(1<<DLC3)|(0<<DLC2)|(0<<DLC1)|(0<<DLC0) //
sts CANCDMOB,tmp // Can MOb Control and DLC Register
// Регистры тэга идентификатора CAN
// Если CABNMOB bit IDE равен 1
// ID = 29 bit CANIDT1 (7..0) CANIDT2 (7..0) CANIDT3 (7..0) CANIDT4 (7..3) направление ID <- 28 ...0
// Если CABNMOB bit IDE равен 0
// ID = 11 bit CANIDT1 (7..0) CANIDT2 (7..5) CANIDT3 =0 CANIDT4 &0x05 направление ID <- 10 ...0
ldi xl,low (0x100) // 0 ... 0x7FF
ldi xh,high(0x100) // 0 ... 0x7FF
mov tmp,xl //
swap tmp //
lsl tmp //
andi tmp,0xE0 //
lsr xh
ror xl
lsr xh
ror xl
lsr xh
ror xl
sts CANIDT1,xl // Can Identifier Tag Register1
sts CANIDT2,tmp // Can Identifier Tag Register2
ldi tmp,0x00 //
sts CANIDT3,tmp // Can Identifier Tag Register3
ldi tmp,0x00 //
sts CANIDT4,tmp // Can Identifier Tag Register4
// Регистры маски идентификатора CAN
ldi tmp,0xFE //
sts CANIDM1,tmp // Can Identifier Mask Register1
ldi tmp,0xE0 //
sts CANIDM2,tmp // Can Identifier Mask Register2
ldi tmp,0x00 //
sts CANIDM3,tmp // Can Identifier Mask Register3
ldi tmp,0x00 //
sts CANIDM4,tmp // Can Identifier Mask Register4
// статус временной ометки CAN 0 ... 65535
ldi tmp,0b00000000 //
sts CANSTML,tmp // Can Time Stamp RegisterL
ldi tmp,0b00000000 //
sts CANSTMH,tmp // Can Time Stamp RegisterH
// Регистр данных сообщения CAN
ldi tmp,0x85 //
sts CANMSG,tmp // Can Data Message Register
Получаю такие посылки :
START:0
ID:100
SRR:0
IDE:0
CTRL:08 [Dsize=8]
DATA:85 F9 FF 99 FE 73 DD 6D
CRC:0060 OK
CRCDEL:1
ACK:3
END:7F
Первый байт 0х85 у нас идет с регистра CANMSG
Где он берет остальные 7 байт ? F9 FF 99 FE 73 DD 6D
Как туда загнать данные перед отправкой ?
В пространстве до 0х100 я их не нашел ...
INDX0 ... INDX2 местоположение байта данных CAN в FIFO для определенного Mob : вот это не понятно тоже ...