CAN и ETHERNET(К1921ВК01Т)
Модераторы: ea, dav, bkolbov, Alis, pip, _sva_
CAN и ETHERNET(К1921ВК01Т)
Добрый день! Есть ли примеры программ с использованием CAN и ETHERNET?
Re: CAN и ETHERNET(К1921ВК01Т)
Чтобы не создавать новую тему про CAN напишу здесь.
При программировании объекта сообщения при попытке записать побитно регистр MOCTR следующим образом:
фактически приводит к записи 1 в следующие биты: RXEN, TXRQ, TXEN0 и TXEN1.
Правильно записывать сразу весь регистр так:
Получается, что регистр MOCTR нельзя записывать через битовые поля структуры?
При программировании объекта сообщения при попытке записать побитно регистр MOCTR следующим образом:
Код: Выделить всё
NT_CAN->CAN_msg[6].MOCTR_bit.SETRXEN = 1;
Правильно записывать сразу весь регистр так:
Код: Выделить всё
NT_CAN->CAN_msg[6].MOCTR = 0x00800000;
-
- Сообщения: 61
- Зарегистрирован: 14 дек 2015, 12:07
- Предприятие: АО НИИЭТ
- Откуда: НИИЭТ
- Контактная информация:
Re: CAN и ETHERNET(К1921ВК01Т)
Здравствуйте. Регистр MOCTR доступен только для записи. А побитовый доступ осуществляется посредством операции "чтение-модификация-запись". Этот регистр можно писать только весь сразу
Re: CAN и ETHERNET(К1921ВК01Т)
Вопросы про контроллер Ethernet.
1) В документации сказано, что, кроме интерфейса MII, дополнительно поддерживаются интерфейсы MACMII, RMII, SMII, PMD, ENDEC (см. стр. 192 документации). Нигде не нашел, в каких регистрах какие биты управляют включением этих дополнительных интерфейсов. Особенно интересует RMII.
2) На следующей странице документации (стр. 193) дана весьма замысловатая формула адресации оперативной памяти контроллера Ethernet на LocalBus :
Адрес(LocalBus) = 00710000h + ((Адрес(ПДП)) /4).
Не понятно, что означает это таинственное смещение 00710000h ? В демонстрационной программе из репозитория, посвященной модулю Ethernet, буфера ввода-вывода для Ethernet расположены в совершенно обычном ОЗУ без какой либо привязки к абсолютному адресу 00710000h.
Может, кто в курсе дела ?
1) В документации сказано, что, кроме интерфейса MII, дополнительно поддерживаются интерфейсы MACMII, RMII, SMII, PMD, ENDEC (см. стр. 192 документации). Нигде не нашел, в каких регистрах какие биты управляют включением этих дополнительных интерфейсов. Особенно интересует RMII.
2) На следующей странице документации (стр. 193) дана весьма замысловатая формула адресации оперативной памяти контроллера Ethernet на LocalBus :
Адрес(LocalBus) = 00710000h + ((Адрес(ПДП)) /4).
Не понятно, что означает это таинственное смещение 00710000h ? В демонстрационной программе из репозитория, посвященной модулю Ethernet, буфера ввода-вывода для Ethernet расположены в совершенно обычном ОЗУ без какой либо привязки к абсолютному адресу 00710000h.
Может, кто в курсе дела ?
-
- Сообщения: 179
- Зарегистрирован: 14 дек 2015, 09:21
- Предприятие: АО НИИЭТ
- Откуда: АО НИИЭТ, Воронеж
Re: CAN и ETHERNET(К1921ВК01Т)
Доброго времени суток!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
Добрый день, спрошу тут раз уж есть 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.
Объект сообщений 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.
-
- Сообщения: 61
- Зарегистрирован: 14 дек 2015, 12:07
- Предприятие: АО НИИЭТ
- Откуда: НИИЭТ
- Контактная информация:
Re: CAN
Добрый день.Роман писал(а): ↑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Т)
Спасибо, этот объект планирую использовать на приём только удалённого запроса.
CAN
Добрый день, пытаюсь сделать обработку состояния 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 (ситуация та же, ручная проверка убрана, прерывания от объектов сообщений работают), что нужно для использования прерываний от узла ?
#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 (ситуация та же, ручная проверка убрана, прерывания от объектов сообщений работают), что нужно для использования прерываний от узла ?