fokin91 0 5 марта, 2019 Опубликовано 5 марта, 2019 · Жалоба День добрый. Разбираюсь с каном в STM32f105 . Удалось запустить оба Can а, помог документ от Stm по переходу на новую библиотеку. Брал тут Если по передаче сообщений вопросов нет, то вот с приемом получились вопросы. Для приема используется конструкция void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) { HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &RxHeader, RxData); HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_2); } насколько я понял, это обработчик прерывания по приему. Но этот код срабатывает как на прием с can1, так и с can2, и не понятно, откуда пришли данные. Вопрос в том, как определять с какого из CAN пришло сообщение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andrew_Q 0 6 марта, 2019 Опубликовано 6 марта, 2019 (изменено) · Жалоба Дак, Вам , вроде передается указатель типа CAN_HandleTypeDef на устройство. Проверить чему равен hcan и вызвать соответствующий обработчик. switch(hcan->Instance) { case CAN1: /* CAN1 Process */ break; case CAN2: /* CAN2 Process */ break; } Изменено 6 марта, 2019 пользователем Andrew_Q Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
fokin91 0 6 марта, 2019 Опубликовано 6 марта, 2019 · Жалоба 4 часа назад, Andrew_Q сказал: Дак, Вам , вроде передается указатель типа CAN_HandleTypeDef на устройство. Проверить чему равен hcan и вызвать соответствующий обработчик. switch(hcan->Instance) { case CAN1: /* CAN1 Process */ break; case CAN2: /* CAN2 Process */ break; } Спасибо, понял куда копать. только этот код выдает ошибку ../Src/main.c(400): error: #31: expression must have integral type сейчас с этим пытаюсь разобраться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andrew_Q 0 6 марта, 2019 Опубликовано 6 марта, 2019 · Жалоба Приведите тип к int. switch((uint32_t)hcan->Instance) { case (uint32_t)CAN1: /* CAN1 Process */ break; case (uint32_t)CAN2: /* CAN2 Process */ break; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
fokin91 0 6 марта, 2019 Опубликовано 6 марта, 2019 · Жалоба 8 минут назад, Andrew_Q сказал: Приведите тип к int. switch((uint32_t)hcan->Instance) { case (uint32_t)CAN1: /* CAN1 Process */ break; case (uint32_t)CAN2: /* CAN2 Process */ break; } Большое спасибо, заработало! пойду почитаю учебники по C/C++ что б таких вопросов больше не было Вот такой код работает void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) { switch((uint32_t)hcan->Instance) { case (uint32_t)CAN1: /* CAN1 Process */ HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_15); HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &RxHeader, RxData); TxHeader.StdId=RxHeader.StdId; TxHeader.DLC = RxHeader.DLC; TxHeader.IDE = RxHeader.IDE; HAL_CAN_AddTxMessage(&hcan2, &TxHeader, RxData, &TxMailbox); break; case (uint32_t)CAN2: /* CAN2 Process */ HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_15); HAL_CAN_GetRxMessage(&hcan2, CAN_RX_FIFO0, &RxHeader, RxData); TxHeader.StdId=RxHeader.StdId; TxHeader.DLC = RxHeader.DLC; TxHeader.IDE = RxHeader.IDE; HAL_CAN_AddTxMessage(&hcan1, &TxHeader, RxData, &TxMailbox); break; } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться