CAN и ETHERNET(К1921ВК01Т)

32-разрядные микроконтроллеры разработки АО "НИИЭТ"

Модераторы: ea, dav, bkolbov, Alis, pip, _sva_

Виктор
Сообщения: 10
Зарегистрирован: 04 апр 2019, 12:10
Предприятие: МНИТИ

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

Сообщение Виктор »

В окне memory все массивы регистров отображаются некорректно (отображается адрес нулевого регистра из массива), а в expresions всё отображается корректно (адреса &NT_CAN->LIST[0] и &NT_CAN->LIST[1] разные).
Содержимое svd:
| Показать
<cluster>
<!-- dimElementGroup -->
<dim>8</dim>
<dimIncrement>4</dimIncrement>
<dimIndex>0-7</dimIndex>
<!-- end of dimElementGroup -->
<name>LIST[%s]</name>
<description>LIST</description>
<addressOffset>0x100</addressOffset>
<!-- LIST: Register list0 -->
<register>
<name>LIST</name>
<description>Register list0</description>
<addressOffset>0x00</addressOffset>
<size>32</size>
<access>read-only</access>
<resetValue>0x00000000</resetValue>
<resetMask>0xFFFFFFFF</resetMask>
<fields>
<!-- BEGIN: -->
<field>
<name>BEGIN</name>
<bitRange>[7:0]</bitRange>
<access>read-only</access>
</field>
<!-- END: -->
<field>
<name>END</name>
<bitRange>[15:8]</bitRange>
<access>read-only</access>
</field>
<!-- SIZE: List size -->
<field>
<name>SIZE</name>
<description>List size</description>
<bitRange>[23:16]</bitRange>
<access>read-only</access>
</field>
<!-- EMPTY: Indicate empty list -->
<field>
<name>EMPTY</name>
<description>Indicate empty list</description>
<bitRange>[24:24]</bitRange>
<access>read-only</access>
</field>
</fields>
</register>
</cluster>
bkolbov
Сообщения: 248
Зарегистрирован: 14 дек 2015, 11:37
Предприятие: АО НИИЭТ
Откуда: Воронеж

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

Сообщение bkolbov »

Виктор писал(а): 12 апр 2019, 16:47 В окне memory все массивы регистров отображаются некорректно (отображается адрес нулевого регистра из массива), а в expresions всё отображается корректно (адреса &NT_CAN->LIST[0] и &NT_CAN->LIST[1] разные).
Содержимое svd:
Похоже что эклипсовский плагин некорректно отображает массивы кластеров из svd. Попробовал сейчас svd открыть в keil - там все адреса внутри массива разные.
Al-x
Сообщения: 29
Зарегистрирован: 02 фев 2021, 19:22
Предприятие: АО "НТЦ "РИФ"

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

Сообщение Al-x »

Обнаружил интересное поведение CAN: при КЗ в линии счётчики REC и TEC обнуляются, узлы отключаются от шины - CAN_NCR_INIT становится 1.

Пришлось сделать такую вставку:
if (NT_CAN->CAN_Node[CAN1_NODE].NCR & CAN_NCR_INIT_Msk) NT_CAN->CAN_Node[CAN1_NODE].NCR = 0;
В ходе экспериментов я пытался сымитировать состояние ошибки по описанию:
Узел находится в состоянии отключения от шины, если значение счетчика ошибок TEC больше или равно 256. О том, что CAN узел находится в состоянии отключения от шины, сигнализирует флаг BOFF регистра NSR. Узел в состоянии отключения от шины не может работать с шиной (выходные передатчики отключены).
Достоверно это сделать не получилось, но один раз вроде бы счётчики зашкалили и так же установился флаг CAN_NCR_INIT.

Отсюда вопрос: достаточно ли такого костыля по принудительному сбросу флага? Не может ли ещё что-то где-то заклинить при какой-нибудь большой широкополосной помехе, что потребуется где-то что-то очищать для сброса ошибки?
Аватара пользователя
Лашкевич
Сообщения: 373
Зарегистрирован: 13 май 2015, 13:10
Предприятие: ООО "НПФ Вектор"
Откуда: Москва
Контактная информация:

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

Сообщение Лашкевич »

Странно обнулять весь регистр, у нас в коде так

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

if (T_CAN->CAN_Node[CAN1_NODE]->NCR_bit.INIT)
	T_CAN->CAN_Node[CAN1_NODE]->NCR_bit.INIT = 0;
С уважением,
Лашкевич Максим.
Инженер-программист ООО "НПФ Вектор", Москва.
http://motorcontrol.ru/
Сергей
Сообщения: 20
Зарегистрирован: 25 янв 2018, 15:10
Предприятие: АО "Корпорация "ВНИИЭМ"

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

Сообщение Сергей »

Проинициализировал FIFO структуру из одного базового (12-го) 20 вспомогательных (с 13 по 32) объектов таким вот образом.
инициализация базового объекта:
NT_CAN.CAN_MSG[12].MOFCR.bit.MMC = 2;
NT_CAN.CAN_MSG[12].MOFGPR.bit.CUR = 13;
NT_CAN.CAN_MSG[12].MOFGPR.bit.BOT = 13;
прерывание возникает когда начинается отправка данных из последнего объекта
NT_CAN.CAN_MSG[12].MOFGPR.bit.SEL = 32;
NT_CAN.CAN_MSG[12].MOFGPR.bit.TOP = 32;
NT_CAN.CAN_MSG[12].MOCTR.all = MOCTR_MSGVAL_SET;
прерывание выведено на 3-й канал
NT_CAN.CAN_MSG[12].MOIPR.bit.RXINP = 3;
NT_CAN.CAN_MSG[12].MOFCR.bit.RXIE = SET;
NT_CAN.CAN_MSG[12].MOFCR.bit.OVIE = SET;

инициализация первого вспомогательного объекта:
NT_CAN.CAN_MSG[13].MOCTR.all = MOCTR_DIR_SET | MOCTR_TX_EN0_EN1_SET;
NT_CAN.CAN_MSG[13].MOFGPR.bit.CUR = 12;
NT_CAN.CAN_MSG[13].MOAR.bit.PRI = 2;
NT_CAN.CAN_MSG[13].MOAR.bit.ID = ID << 18;
NT_CAN.CAN_MSG[13].MOFCR.bit.DLC = 8;
NT_CAN.CAN_MSG[13].MOFCR.bit.MMC = 3;

инициализация остальных вспомогательных объектов:
for(uint32_t BufNum = 14; BufNum < 33; BufNum++)
{
NT_CAN.CAN_MSG[BufNum].MOCTR.all = MOCTR_DIR_SET | MOCTR_TXEN0_SET;
NT_CAN.CAN_MSG[BufNum].MOFGPR.bit.CUR = 12;
NT_CAN.CAN_MSG[BufNum].MOAR.bit.PRI = 2;
NT_CAN.CAN_MSG[BufNum].MOAR.bit.ID = ID << 18;
NT_CAN.CAN_MSG[BufNum].MOFCR.bit.DLC = 8;
NT_CAN.CAN_MSG[BufNum].MOFCR.bit.MMC = 3;
}

for(uint32_t ind = 13; ind < 33; ind++)
NT_CAN.CAN_MSG[ind].MOCTR.all = MOCTR_MSGVAL_SET;

При возникновении условий инициируется передача данных
Сначала загружаются данные в регистры данных объектов и инициируется передача
for(uint32_t ind = 0; ind < 20; ind++)
NT_CAN.CAN_MSG[ind + 13].MOCTR.all = MOCTR_TXRQ_SET;

При возникновении прерывания делается следующее:
загружаются данные в регистры данных объектов и инициируется передача
for(uint32_t ind = 0; ind < 20; ind++)
NT_CAN.CAN_MSG[ind + 13].MOCTR.all = MOCTR_TXRQ_SET;
если больше не нужно отправлять данные то просто выходим из прерывания.

Таким образом передается 20000 единиц данных 32 разрядных,
при этом не все данные доходят до адресата.
1. В чем может быть проблема? Что делаю не так?
2. Если узлы CAN могут работать только со своим списком, зачем нужны остальные списки?
dav
Сообщения: 208
Зарегистрирован: 14 дек 2015, 09:21
Предприятие: АО НИИЭТ
Откуда: АО НИИЭТ, Воронеж

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

Сообщение dav »

Сергей писал(а): 20 май 2021, 15:45 Таким образом передается 20000 единиц данных 32 разрядных,
при этом не все данные доходят до адресата.
1. В чем может быть проблема? Что делаю не так?
2. Если узлы CAN могут работать только со своим списком, зачем нужны остальные списки?
Доброго времени суток!
1) Попробуйте выставлять флаг корректности передающего базового объекта сообщения.
Строка в коде:

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

NT_CAN.CAN_MSG[12].MOCTR.all = MOCTR_MSGVAL_SET;
непосредственно перед установкой аналогичных флагов у вспомогательных объектов после их инициализации
Строка в коде:

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

for(uint32_t ind = 13; ind < 33; ind++)
NT_CAN.CAN_MSG[ind].MOCTR.all = MOCTR_MSGVAL_SET;

Также, причина, по которой данные не доходят до адресата, может быть в конфигурации передающей стороны, которая в данном фрагменте коде не отражена.

2) Остальные списки (кроме 0, 1 и 2) в данной реализации не задействованы.

Так же, не совсем ясно с какой целью во всех вспомогательных объектах задается один и тот же идентификатор (ID).
Сергей
Сообщения: 20
Зарегистрирован: 25 янв 2018, 15:10
Предприятие: АО "Корпорация "ВНИИЭМ"

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

Сообщение Сергей »

Также, причина, по которой данные не доходят до адресата, может быть в конфигурации передающей стороны, которая в данном фрагменте коде не отражена.
Это как раз передача!
Сергей
Сообщения: 20
Зарегистрирован: 25 янв 2018, 15:10
Предприятие: АО "Корпорация "ВНИИЭМ"

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

Сообщение Сергей »

Так же, не совсем ясно с какой целью во всех вспомогательных объектах задается один и тот же идентификатор (ID).
Так как это массив данных, который должно получить одно устройство как общий массив.
Сергей
Сообщения: 20
Зарегистрирован: 25 янв 2018, 15:10
Предприятие: АО "Корпорация "ВНИИЭМ"

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

Сообщение Сергей »

Доброго времени суток!
Попробовал сделать как Вы говорили
1) Попробуйте выставлять флаг корректности передающего базового объекта сообщения.

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

NT_CAN.CAN_MSG[12].MOCTR.all = MOCTR_MSGVAL_SET;
непосредственно перед установкой аналогичных флагов у вспомогательных объектов после их инициализации

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

for(uint32_t ind = 13; ind < 33; ind++)
NT_CAN.CAN_MSG[ind].MOCTR.all = MOCTR_MSGVAL_SET;

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

NT_CAN.CAN_MSG[12].MOCTR.all = MOCTR_MSGVAL_SET;

for(uint32_t ind = 13; ind < 33; ind++)
	NT_CAN.CAN_MSG[ind].MOCTR.all = MOCTR_MSGVAL_SET;
Стало лучше, но периодически доходит не все.

Почему инициировать передачу нужно выставление флагов TXREQ во всех вспомогательных объектах?

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

for(int ind = 0; ind < 20; ind++)
	NT_CAN.CAN_MSG[ind + 13].MOCTR.all = MOCTR_TXRQ_SET;
Нельзя ли как-нибудь выставлением одного флага?
Сергей
Сообщения: 20
Зарегистрирован: 25 янв 2018, 15:10
Предприятие: АО "Корпорация "ВНИИЭМ"

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

Сообщение Сергей »

Почему при использовании механизма FIFO, для разрешения прерывания по окончании отправки
необходимо выставлять флаги, которые в других режимах используются для разрешения прерывания по приему?

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

	NT_CAN.CAN_MSG[12].MOIPR.bit.RXINP = 3;
	NT_CAN.CAN_MSG[12].MOFCR.bit.RXIE = SET;
	NT_CAN.CAN_MSG[12].MOFCR.bit.OVIE = SET;
И наоборот.
Ответить

Вернуться в «32-разрядные микроконтроллеры»