STM32F1 HAL CAN2 не получает
Я использую нестандартную плату с контроллером STM32F107VCT6. Основная цель этой платы - соединить две сети, выполнить некоторые вычисления и передать некоторые данные через SPI другому контроллеру, а некоторые - в другую сеть CAN и наоборот.
Я имею сеть CAN1, получающую и передающую точно, как я хотел бы это выполнить; однако сеть CAN2 может только передавать (таким образом, это не аппаратная ошибка)
После копирования кода, все же изменив банк фильтров на значение больше 14, как предлагали многие другие форумы; а также установка других требований для изменения на CAN2, он все еще не получает ни в режиме прерывания, ни в режиме опроса.
Я использовал STM32Cube MX для генерации того же кода инициализации, что и для CAN1, хотя и на другой шине с разными приоритетами прерываний.
Но код не работает, как будто на шине нет сообщений. Я использую анализатор шины Microchip CAN для отправки и получения тестовых сообщений.
Еще одна деталь: у меня все еще работает CAN1, просто без данных; как таковые все его часы все еще работают.
Вот мой тестовый код:
Основной цикл
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_CAN1_Init();
MX_CAN2_Init();
MX_RTC_Init();
MX_SPI1_Init();
MX_USART1_UART_Init();
CAN_FilterConfTypeDef sFilterConfig2;
sFilterConfig2.FilterNumber = 0;
sFilterConfig2.FilterMode = CAN_FILTERMODE_IDMASK;
sFilterConfig2.FilterScale = CAN_FILTERSCALE_32BIT;
sFilterConfig2.FilterIdHigh = 0x0000;
sFilterConfig2.FilterIdLow = 0x0000;
sFilterConfig2.FilterMaskIdHigh = 0x0000;
sFilterConfig2.FilterMaskIdLow = 0x0000;
sFilterConfig2.FilterFIFOAssignment = CAN_FILTER_FIFO1;
sFilterConfig2.FilterActivation = ENABLE;
sFilterConfig2.BankNumber = 20;
HAL_CAN_ConfigFilter(&hcan2, &sFilterConfig2);
hcan2.pRxMsg = &RxMessage2;
while (1)
{
HAL_CAN_Receive (&hcan2, CAN_FIFO1, 1000);
{
uint8_t buf[100], l = sprintf(buf, " ID: %d DLC: %d Data: %d %d %d %d %d %d %d %d \n\r", RxMessage2.StdId, RxMessage2.DLC, RxMessage2.Data[0], RxMessage2.Data[1], RxMessage2.Data[2], RxMessage2.Data[3], RxMessage2.Data[4], RxMessage2.Data[5], RxMessage2.Data[6], RxMessage2.Data[7]);
HAL_UART_Transmit(&huart1, buf, l, 1000);
}
if (RxMessage2.StdId !=0) {
while(1);
}
}
}
Любой вклад с благодарностью, ура, Том
0 ответов
В настройках фильтра добавьте дополнительную строку с указанием начального номера ведомых банков фильтров.
sFilterConfig2.SlaveStartBankNumber = 14;
При этом банки фильтров CAN определенно разделены на две части. Затем вы можете использовать номера банков фильтров от 14 до 28 для CAN2.