Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AT90CAN128 CAN Buffer
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
pavel-pervomaysk
Всем привет, кто работал с кан модулем пните в нужную сторону плиз.
Доку на русском читаю, понять толком не могу.
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



Получаю такие посылки :

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 : вот это не понятно тоже ...
Палыч
Цитата(Павлик @ Dec 13 2011, 21:57) *
Как туда загнать данные перед отправкой ?
Bcё тот же CANMSG

Цитата(Павлик @ Dec 13 2011, 21:57) *
INDX0 ... INDX2 местоположение байта данных CAN в FIFO для определенного Mob : вот это не понятно тоже ...
Логично установить их (INDXn) в ноль, и установить автоинкремент (индекс будет увиличиваться при каждом обращении к CANMSG).
KRS
А зачем вы на асме пишите?
pavel-pervomaysk
Индексы я ставлю в ноль, автоинкремент включаю, данные в пакете получаеются такие же как я привел в первом посте. Есть ли у кого пример отправки 8 байтового сообщения ?
Пишу на асме, Си не знаю...
Палыч
Цитата(Павлик @ Dec 14 2011, 19:02) *
Индексы я ставлю в ноль, автоинкремент включаю, данные в пакете получаеются такие же как я привел в первом посте. Есть ли у кого пример отправки 8 байтового сообщения ?

Зачем Вам пример? У Вас и так всё работает... После занесения в CANMSG значения 0х85 занесите в этот же регистр нужные Вам данные ещё семь раз!
ILYAUL
Вы можете вместо ldi tmp,0b00000000

сделать например
.def zero = R7 ; регистр с значением 00

И убрать все ldi приведенного выше из кода , где такая команда встречается и записать так sts CANTIML,zero



CODE
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
pavel-pervomaysk
Попробую, спасибо за подсказку.

Гы, не смешно если чесно.
С граматикой в студии у меня проблем нет, ниже все есть.
Модуль инициализирую первый раз, еще так сказать не обкатано все и нет полных коментов, когда будут, пооптимизирую, хотя куда мне девать 128 КБ флеш, за которые я заплатил денег ?
pavel-pervomaysk
Попробовал по советам, получилось кое что, но не могу выловить закономерность.
Включаю модуль на передачу, в цикле посылаю сообщения по 8 байт.
Это код тестовый.

CODE
cycle_can:
ldi tmp,(0<<CONMOB1)|(1<<CONMOB0)|(1<<RPLV)|(0<<IDE)|(1<<DLC3)|(0<<DLC2)|(0<<DLC1)|(0<<DLC0) //
sts CANCDMOB,tmp
ldi tmp,0x00
sts CANMSG,tmp
inc tmp
sts CANMSG,tmp
inc tmp
sts CANMSG,tmp
inc tmp
sts CANMSG,tmp
inc tmp
sts CANMSG,tmp
inc tmp
sts CANMSG,tmp
inc tmp
sts CANMSG,tmp
inc tmp
sts CANMSG,tmp
ldi tmp,(0<<CONMOB1)|(0<<CONMOB0)|(1<<RPLV)|(0<<IDE)|(1<<DLC3)|(0<<DLC2)|(0<<DLC1)|(0<<DLC0) //
sts CANCDMOB,tmp
rcall wait_20ms
rjmp cycle_can


На выходе имеем

CODE
; CAN decoder
;Baudrate=250000

START:0
ID:100
SRR:0
IDE:0
CTRL:08 [Dsize=8]
DATA:07 00 01 02 03 04 05 06
CRC:6A74 OK
CRCDEL:1
ACK:2
END:03 ?


Странно получается ... Или я что-то не дочитал ?
Палыч
Цитата(Павлик @ Dec 14 2011, 23:43) *
Или я что-то не дочитал ?

Наверное, какой-нибудь пример Вам всё-таки посмотреть стоит...
Попробуйте заглянуть в исходники AppNote AVR076 - CAN Bootloader.
pavel-pervomaysk
Вопрос решился, подсказали мне мою ошибку.
bumborashik
Цитата(Павлик @ Dec 18 2011, 18:13) *
Вопрос решился, подсказали мне мою ошибку.

Так написал бы тут - в чём дело было.
pavel-pervomaysk
Когда полностью будет готово, отпишусь с коментами.
pavel-pervomaysk
Возникла еще одна проблема, не могу вставить задержку нормально между отправками сообщений, если вставляю, получается бред ... Без задержки отдает нормально, но устройство не успевает принять.


Это тестовый модуль


CODE
cantx:



; 18 12 00 00 45 85 21 8C

ldi xl,low (0x60D) // 0 ... 0x7FF
ldi xh,high(0x60D) // 0 ... 0x7FF
rcall can_id // Установка ID сообщения CAN

ldi data,0x00
sts CANPAGE,data
ldi data,0x18 // 0
sts CANMSG,data
ldi data,0x01
sts CANPAGE,data
ldi data,0x12 // 1
sts CANMSG,data
ldi data,0x02
sts CANPAGE,data
ldi data,0x00 // 2
sts CANMSG,data
ldi data,0x03
sts CANPAGE,data
ldi data,0x00 // 3
sts CANMSG,data
ldi data,0x04
sts CANPAGE,data
ldi data,0x45 // 4
sts CANMSG,data
ldi data,0x05
sts CANPAGE,data
ldi data,0x85 // 5
sts CANMSG,data
ldi data,0x06
sts CANPAGE,data
ldi data,0x21 // 6
sts CANMSG,data
ldi data,0x07
sts CANPAGE,data
ldi data,0x8c // 7
sts CANMSG,data

ldi data,0x48 // 0 - 8 длинна сообщения
rcall cantx_wait //






ldi xl,low (0x181) // 0 ... 0x7FF
ldi xh,high(0x181) // 0 ... 0x7FF
rcall can_id // Установка ID сообщения CAN

ldi data,0x00
sts CANPAGE,data
ldi data,0x2E // 0
sts CANMSG,data
ldi data,0x01
sts CANPAGE,data
ldi data,0xB0 // 1
sts CANMSG,data
ldi data,0x02
sts CANPAGE,data
ldi data,0x2A // 2
sts CANMSG,data
ldi data,0x03
sts CANPAGE,data
ldi data,0x10 // 3
sts CANMSG,data
ldi data,0x04
sts CANPAGE,data
ldi data,0x2A // 4
sts CANMSG,data
ldi data,0x05
sts CANPAGE,data
ldi data,0x28 // 5
sts CANMSG,data
ldi data,0x06
sts CANPAGE,data
ldi data,0x3F // 6
sts CANMSG,data
ldi data,0x07
sts CANPAGE,data
ldi data,0x02 // 7
sts CANMSG,data

ldi data,0x48 // 0 - 8 длинна сообщения
rcall cantx_wait //


; 075E 4 1 8F 19 00

ldi xl,low (0x75e) // 0 ... 0x7FF
ldi xh,high(0x75e) // 0 ... 0x7FF
rcall can_id // Установка ID сообщения CAN

ldi data,0x00
sts CANPAGE,data
ldi data,0x01 // 0
sts CANMSG,data
ldi data,0x01
sts CANPAGE,data
ldi data,0x8f // 1
sts CANMSG,data
ldi data,0x02
sts CANPAGE,data
ldi data,0x19 // 2
sts CANMSG,data
ldi data,0x03
sts CANPAGE,data
ldi data,0x00 // 3
sts CANMSG,data


ldi data,0x44 // 0 - 8 длинна сообщения
rcall cantx_wait //

;10 03 00 00 00 00 50 00

ldi xl,low (0x35D) // 0 ... 0x7FF
ldi xh,high(0x35D) // 0 ... 0x7FF
rcall can_id // Установка ID сообщения CAN

ldi data,0x00
sts CANPAGE,data
ldi data,0x10
sts CANMSG,data
ldi data,0x01
sts CANPAGE,data
ldi data,0x03
sts CANMSG,data
ldi data,0x02
sts CANPAGE,data
ldi data,0x00
sts CANMSG,data
ldi data,0x03
sts CANPAGE,data
ldi data,0x00
sts CANMSG,data
ldi data,0x04
sts CANPAGE,data
ldi data,0x00
sts CANMSG,data
ldi data,0x05
sts CANPAGE,data
ldi data,0x00
sts CANMSG,data
ldi data,0x06
sts CANPAGE,data
ldi data,0x50
sts CANMSG,data
ldi data,0x07
sts CANPAGE,data
ldi data,0x00
sts CANMSG,data


ldi data,0x48 // 0 - 8 длинна сообщения
rcall cantx_wait //


ret







cantx_wait:
ser tmp //
sts CANSTMOB,tmp //
sts CANCDMOB,data //
ldi tmp,0x02 //
sts CANGCON,tmp //
can_wt:
lds tmp,CANSTMOB //
sbrc tmp,TXOK // ждем пока сбросится бит 6 TXOK
rjmp can_wt //
cantx_ok:
sts CANGCON,zero //
lds tmp,CANCDMOB //
andi tmp,0xF //
sts CANCDMOB,tmp //
ser tmp
sts CANSTMOB,tmp //
rcall wait_10ms
ret //



can_id: // Установка ID сообщения CAN
push tmp //
mov tmp,xl //
swap tmp //
lsl tmp //
andi tmp,0xE0 //
clc //
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
sts CANIDT3,zero // Can Identifier Tag Register3
sts CANIDT4,zero // Can Identifier Tag Register4
pop tmp //
ret //

wait_10ms: // Задержка 10 мсек.
ldi yl, low(35000) //
ldi yh,high(35000) //
wt_10: //
sbiw yl,1 //
brne wt_10 //
ret //



На выходе получаю

CODE
; CAN decoder
;Baudrate=500000

START:0
ID:60D
SRR:0
IDE:0
CTRL:08 [Dsize=8]
DATA:18 12 00 00 45 85 21 8C
CRC:43EE OK
CRCDEL:1
ACK:2
END:03 ?

START:0
ID:60D
SRR:0
IDE:0
CTRL:08 [Dsize=8]
DATA:2E B0 2A 10 2A 28 3F 02
CRC:66B0 OK
CRCDEL:1
ACK:2
END:03 ?

START:0
ID:181
SRR:0
IDE:0
CTRL:08 [Dsize=8]
DATA:01 8F 19 00 2A 28 3F 02
CRC:76EB OK
CRCDEL:1
ACK:2
END:03 ?

START:0
ID:75E
SRR:0
IDE:0
CTRL:04 [Dsize=4]
DATA:10 03 00 00
CRC:5B3B OK
CRCDEL:1
ACK:2


Если убрать задержку 10мс получаем так :

CODE
; CAN decoder
;Baudrate=500000

START:0
ID:60D
SRR:0
IDE:0
CTRL:08 [Dsize=8]
DATA:18 12 00 00 45 85 21 8C
CRC:43EE OK
CRCDEL:1
ACK:2
END:03 ?

START:0
ID:181
SRR:0
IDE:0
CTRL:08 [Dsize=8]
DATA:2E B0 2A 10 2A 28 3F 02
CRC:47F1 OK
CRCDEL:1
ACK:2
END:03 ?

START:0
ID:75E
SRR:0
IDE:0
CTRL:04 [Dsize=4]
DATA:01 8F 19 00
CRC:3D8C OK
CRCDEL:1
ACK:2
END:03 ?

START:0
ID:35D
SRR:0
IDE:0
CTRL:08 [Dsize=8]
DATA:10 03 00 00 00 00 50 00
CRC:199A OK
CRCDEL:1
ACK:2
END:03 ?




Может кто подскажет где ошибка ?
pavel-pervomaysk
Разобрался и с прерываниями и с заполнением.
Странная организация без непосредственного доступа без CANPAGE.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.