ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
4 июля
1273480 Топик полностью
bnb62 (05.01.2023 21:40, просмотров: 161) ответил bnb62 на Извиняюсь. Ввел в заблуждение некорректным описанием вопроса! Речь о CAN. Требуется менять значения или диапазоны по маске фильтров ID
Требуется модифицировать эти значения при поступлении команды извне (GSM, GPRS, LTE, SMS) 

Как написано:

[Рабочие режимы bxCAN]

У bxCAN есть 3 основных рабочих режима: initialization (инициализация), normal (активная работа) и Sleep (сон, приостановка). После аппаратного сброса bxCAN находится в режиме Sleep, чтобы снизить потребление энергии, и на CANTX активен внутренний pull-up (верхний подтягивающий резистор). Программа запрашивает bxCAN на вход в режим initialization или Sleep установкой бит INRQ или SLEEP в регистре CAN_MCR. Как только произошел вход в режим, bxCAN подтверждает это установкой бит INAK или SLAK в регистре CAN_MSR, и внутренний pull-up запрещается. Когда ни один из бит INAK и SLAK не установлен, bxCAN находится в режиме normal. Перед входом в режим normal bxCAN всегда должен быть синхронизирован с шиной CAN. Для синхронизации bxCAN ждет, пока шина CAN не освободится (перейдет в состояние idle), это означает, что отслеживается появление 11 следующих друг за другом рецессивных бита на сигнале CANRX.

Режим инициализации. Программная инициализация может быть осуществлена, когда железо CAN находится в режиме инициализации (Initialization mode). Чтобы войти в этот режим, программа устанавливает бит INRQ в регистре CAN_MCR и ждет, пока железо подтвердит этот запрос установкой бита INAK в регистре статуса CAN_MSR.

Чтобы покинуть режим инициализации, программа очищает бит INQR. bxCAN покинет режим инициализации, когда бит INAK очистится аппаратурой.

Во время режима инициализации останавливаются все входящие и исходящие транзакции сообщений CAN, и статус шины CAN на выходе CANTX сохраняется рецессивным (лог. 1).

Вход в режим инициализации не меняет ни один регистр конфигурации.

Чтобы инициализировать контроллер CAN, программа должна установить длительность бита (Bit Timing, регистр CAN_BTR) и опции CAN (регистр управления CAN_MCR).

Чтобы инициализировать регистры, связанные с банками фильтров CAN (mode, scale, FIFO assignment, activation и значения фильтраand filter values), программа должна установить бит FINIT (в регистре CAN_FMR). Инициализация фильтра также может быть осуществлена вне режима инициализации.

Примечание: когда FINIT=1, прием CAN деактивирован. Значения фильтра также можно модифицировать сбросом соответствующих бит активации (в регистре CAN_FA1R). Если банк фильтра не используется, то рекомендуется оставить его в неактивном режиме (т. е. оставить его соответствующий бит FACTx очищенным).


- не работает - убился в вариантах и комбинациях. Суть: если прописать численно фильтры в

void MX_CAN1_Init (void)

{

...

}

То всё замечательно фильтруется,

но если то же самое посимвольно поместить в юзер-функцию.... То фильтры, именно значения (маски-сказки-раскраски) обнуляются)

Не помогает ни предваряющий

HAL_CAN_DeInit(&hcan1);

ни

hcan1Filter.FilterActivation = DISABLE;


Другие источники пишут - Вроде бы должно работать при соблюдении описанных условий. Все флаги-биты проверил - в Хале всё строго. Например;

/* Request initialisation */

SET_BIT(hcan->Instance->MCR, CAN_MCR_INRQ);


Живьём - всё прёт на прием, как при 0х0000 в фильтрах;


Что поражает, я ранее реализовал изменение битрэйта, буквально вытащив их библии Хала:

hcan->Init.Prescaler = prescaler;

WRITE_REG(hcan->Instance->BTR, (uint32_t)(hcan->Init.Mode | hcan->Init.SyncJumpWidth |hcan->Init.TimeSeg1 | hcan->Init.TimeSeg2 | hcan->Init.Prescaler - 1U)));

А вот в фильтрах такой фишки WRITE_REG() нет.

Впрочем и в прочем, извините, не в каникулы же!

С Новым! :-)