реклама на сайте
подробности

 
 
> AT90CAN128 CAN Buffer
pavel-pervomaysk
сообщение Dec 13 2011, 17:57
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 253
Регистрация: 28-12-07
Из: Украина г. Первомайск
Пользователь №: 33 716



Всем привет, кто работал с кан модулем пните в нужную сторону плиз.
Доку на русском читаю, понять толком не могу.
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 : вот это не понятно тоже ...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
pavel-pervomaysk
сообщение Dec 14 2011, 19:43
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 253
Регистрация: 28-12-07
Из: Украина г. Первомайск
Пользователь №: 33 716



Попробовал по советам, получилось кое что, но не могу выловить закономерность.
Включаю модуль на передачу, в цикле посылаю сообщения по 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 ?


Странно получается ... Или я что-то не дочитал ?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Dec 15 2011, 05:10
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



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

Наверное, какой-нибудь пример Вам всё-таки посмотреть стоит...
Попробуйте заглянуть в исходники AppNote AVR076 - CAN Bootloader.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Павлик   AT90CAN128 CAN Buffer   Dec 13 2011, 17:57
- - Палыч   Цитата(Павлик @ Dec 13 2011, 21:57) Как т...   Dec 13 2011, 19:35
- - KRS   А зачем вы на асме пишите?   Dec 13 2011, 19:51
- - Павлик   Индексы я ставлю в ноль, автоинкремент включаю, да...   Dec 14 2011, 15:02
|- - Палыч   Цитата(Павлик @ Dec 14 2011, 19:02) Индек...   Dec 14 2011, 16:02
- - ILYAUL   Вы можете вместо ldi tmp,0b00000000 сделать напр...   Dec 14 2011, 16:15
|- - Павлик   Попробую, спасибо за подсказку. Гы, не смешно есл...   Dec 14 2011, 17:07
- - Павлик   Вопрос решился, подсказали мне мою ошибку.   Dec 18 2011, 15:13
|- - bumborashik   Цитата(Павлик @ Dec 18 2011, 18:13) Вопро...   Dec 21 2011, 05:24
- - Павлик   Когда полностью будет готово, отпишусь с коментами...   Dec 21 2011, 18:22
- - Павлик   Возникла еще одна проблема, не могу вставить задер...   Dec 22 2011, 16:23
- - Павлик   Разобрался и с прерываниями и с заполнением. Стран...   Feb 23 2015, 10:52


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 02:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01443 секунд с 7
ELECTRONIX ©2004-2016