Страница 1 из 9

CAN и ETHERNET(К1921ВК01Т)

Добавлено: 24 июл 2017, 18:11
Александр
Добрый день! Есть ли примеры программ с использованием CAN и ETHERNET?

Re: CAN и ETHERNET(К1921ВК01Т)

Добавлено: 25 июл 2017, 08:55
bkolbov
Добрый день!

Некоторые примеры использования можно найти в репозитории.

Re: CAN и ETHERNET(К1921ВК01Т)

Добавлено: 15 авг 2017, 17:58
MR.Smith
Чтобы не создавать новую тему про CAN напишу здесь.

При программировании объекта сообщения при попытке записать побитно регистр MOCTR следующим образом:

Код: Выделить всё

NT_CAN->CAN_msg[6].MOCTR_bit.SETRXEN = 1;
фактически приводит к записи 1 в следующие биты: RXEN, TXRQ, TXEN0 и TXEN1.

Правильно записывать сразу весь регистр так:

Код: Выделить всё

NT_CAN->CAN_msg[6].MOCTR = 0x00800000;
Получается, что регистр MOCTR нельзя записывать через битовые поля структуры?

Re: CAN и ETHERNET(К1921ВК01Т)

Добавлено: 16 авг 2017, 10:07
hgost
MR.Smith писал(а): 15 авг 2017, 17:58 Получается, что регистр MOCTR нельзя записывать через битовые поля структуры?
Здравствуйте. Регистр MOCTR доступен только для записи. А побитовый доступ осуществляется посредством операции "чтение-модификация-запись". Этот регистр можно писать только весь сразу

Re: CAN и ETHERNET(К1921ВК01Т)

Добавлено: 18 фев 2018, 21:43
Bond
Вопросы про контроллер Ethernet.
1) В документации сказано, что, кроме интерфейса MII, дополнительно поддерживаются интерфейсы MACMII, RMII, SMII, PMD, ENDEC (см. стр. 192 документации). Нигде не нашел, в каких регистрах какие биты управляют включением этих дополнительных интерфейсов. Особенно интересует RMII.
2) На следующей странице документации (стр. 193) дана весьма замысловатая формула адресации оперативной памяти контроллера Ethernet на LocalBus :
Адрес(LocalBus) = 00710000h + ((Адрес(ПДП)) /4).
Не понятно, что означает это таинственное смещение 00710000h ? В демонстрационной программе из репозитория, посвященной модулю Ethernet, буфера ввода-вывода для Ethernet расположены в совершенно обычном ОЗУ без какой либо привязки к абсолютному адресу 00710000h.
Может, кто в курсе дела ?

Re: CAN и ETHERNET(К1921ВК01Т)

Добавлено: 19 фев 2018, 14:19
dav
Bond писал(а): 18 фев 2018, 21:43 Вопросы про контроллер Ethernet.
1) В документации сказано, что, кроме интерфейса MII, дополнительно поддерживаются интерфейсы MACMII, RMII, SMII, PMD, ENDEC (см. стр. 192 документации). Нигде не нашел, в каких регистрах какие биты управляют включением этих дополнительных интерфейсов. Особенно интересует RMII.
2) На следующей странице документации (стр. 193) дана весьма замысловатая формула адресации оперативной памяти контроллера Ethernet на LocalBus :
Адрес(LocalBus) = 00710000h + ((Адрес(ПДП)) /4).
Не понятно, что означает это таинственное смещение 00710000h ? В демонстрационной программе из репозитория, посвященной модулю Ethernet, буфера ввода-вывода для Ethernet расположены в совершенно обычном ОЗУ без какой либо привязки к абсолютному адресу 00710000h.
Может, кто в курсе дела ?
Доброго времени суток!
1) В данном контроллере доступен только интерфейс MII
2) На данную формулу не стоит обращать внимание. У блока Ethernet имеются только 2 FIFО: для приема – 36-разрядное объемом 4 Кбайта, для передачи – 40-разрядное объемом 2 Кбайта, доступ к которым осуществляется через контроллер прямого доступа к памяти.
В ближайшее время будут внесены соответствующие корректировки в техническое описание.

CAN

Добавлено: 02 мар 2018, 13:40
Роман
Добрый день, спрошу тут раз уж есть CAN в названии темы.
Объект сообщений 2 настроен на приёмопередачу (для ответа на RTR):

#define MOCTR_MSGVAL_SET (1<<21)
#define MOCTR_RXEN_SET (1<<23)
#define MOCTR_TXRQ_SET (1<<24)
#define MOCTR_TX_EN0_EN1_SET (3<<25)
#define MOCTR_DIR_SET (1<<27)
#define MOCTR_TXRQ_RESET (1<<8)

#define MOSTAT_TXRQ (1<<8)

NT_CAN->CAN_Msg[2].MOAR = (2<<30) | (3<<18);
NT_CAN->CAN_Msg[2].MOIPR = 0x00000000;
NT_CAN->CAN_Msg[2].MOFCR = 0x08000000; // только поле DLC, 8 байт.
NT_CAN->CAN_Msg[2].MOCTR = MOCTR_DIR_SET | MOCTR_RXEN_SET | MOCTR_MSGVAL_SET | MOCTR_TX_EN0_EN1_SET;

В главном цикле при изменении состояния собираюсь отправлять новые данные по собственной инициативе (обновляю new_state_l и new_state_h, выставляю флаг new_state_for_tx_fl и вызываю mbox2update()):

static uint16_t new_state_for_tx_fl = 0;
static uint16_t new_state_wait_end_tx_fl = 0;
uint32_t new_state_l = 0;
uint32_t new_state_h = 0;

void mbox2update(void)
{
if (new_state_for_tx_fl)
{
if (NT_CAN->CAN_Msg[2].MOSTAT & MOSTAT_TXRQ)
{
if (!new_state_wait_end_tx_fl) {
NT_CAN->CAN_Msg[2].MOCTR = MOCTR_TXRQ_RESET;
new_state_wait_end_tx_fl = 1;
} else {
// отправка ещё в процессе - жду.
return;
}
} else {
NT_CAN->CAN_Msg[2].MODATAL = new_state_l;
NT_CAN->CAN_Msg[2].MODATAH = new_state_h;
NT_CAN->CAN_Msg[2].MOCTR = MOCTR_TXRQ_SET;
new_state_wait_end_tx_fl = 0;
new_state_for_tx_fl = 0;
}
}
}
Правильно ли я себе представляю следующие моменты:
1. Если бит TXRQ в NT_CAN->CAN_Msg[2].MOSTAT установлен - пакет по какой-то причине ещё не отправлен
(в этом случае хочу чтобы дальнейшие попытки отправки были с новыми данными).
2. Запись NT_CAN->CAN_Msg[2].MOCTR = (1<<8) прекращает попытки отправки текущего пакета.
3. Отправка прекратится не мгновенно а по завершению текущей попытки, и тогда же сбросится TXRQ в NT_CAN->CAN_Msg[2].MOSTAT.

Re: CAN

Добавлено: 02 мар 2018, 14:49
hgost
Роман писал(а): 02 мар 2018, 13:40 Правильно ли я себе представляю следующие моменты:
1. Если бит TXRQ в NT_CAN->CAN_Msg[2].MOSTAT установлен - пакет по какой-то причине ещё не отправлен
(в этом случае хочу чтобы дальнейшие попытки отправки были с новыми данными).
2. Запись NT_CAN->CAN_Msg[2].MOCTR = (1<<8) прекращает попытки отправки текущего пакета.
3. Отправка прекратится не мгновенно а по завершению текущей попытки, и тогда же сбросится TXRQ в NT_CAN->CAN_Msg[2].MOSTAT.
Добрый день.
1. Да. Если хотите новые данные, надо сбросить бит TXRQ.
2. Если передача уже идет, то она не прервется
3. Да, верно

Еще есть уточнение по поводу приема/передачи Вашим объектом №2. по программе DIR=1,означает что будет передано стандартное сообщение, а принять при такой установке он сможет только сообщение удаленного запроса. Имейте это в виду

Re: CAN и ETHERNET(К1921ВК01Т)

Добавлено: 02 мар 2018, 15:09
Роман
Спасибо, этот объект планирую использовать на приём только удалённого запроса.

CAN

Добавлено: 06 мар 2018, 15:24
Роман
Добрый день, пытаюсь сделать обработку состояния BUS OFF, на данный момент в главном цикле такая проверка:
#define NSR_BOFF (1<<7)
if (NT_CAN->CAN_Node[0].NSR & NSR_BOFF)
NT_CAN->CAN_Node[0].NCR = 0;
При к.з. на линии в процессе отправки сообщения точка останова срабатывает, после восстановления линии сообщение доходит.

Из описания складывается ощущение что для этой цели можно использовать прерывание ALERT от узла,
т.к. бит ALERT в NSR выставляется при модификации бита BOFF и при разрещении ALIE в NCR это вроде должно вызывать прерывание.
Но при инициализации:
NT_CAN->CAN_Node[0].NIPR = 0;
NT_CAN->CAN_Node[0].NCR = (1<<3);
не приводит к появлению прерывания CAN0 (ситуация та же, ручная проверка убрана, прерывания от объектов сообщений работают), что нужно для использования прерываний от узла ?