Перейти к содержанию
    

Не работает колбек CAN

Добрый вечер, настроена база для передачи информации по сети CAN.
не работает простой колбек (помигать светодиодом при получении сообщения) . Если смотреть при отладке код вылетает из if как я понял в моменте проверки на наличие инфы в FIFO. Rx data после отправки сообщения остается пустым. Буду благодарен за любой совет, готов ответить на конкретизирующие вопросы.

image.thumb.png.f89ed791d9a8a3943a8e4eecbadd64bf.png

image.thumb.png.d3b7dec04152f7c3d1753aa507440247.png

/* Private variables ---------------------------------------------------------*/
ADC_HandleTypeDef hadc;

CAN_HandleTypeDef hcan;

TIM_HandleTypeDef htim1;

/* USER CODE BEGIN PV */
CAN_TxHeaderTypeDef TxHeader;
CAN_RxHeaderTypeDef RxHeader;
uint32_t TxMailbox = 0;
uint8_t TxData[8] = {0,};
uint8_t RxData[8] = {0,};
CAN_FilterTypeDef sFilterConfig;
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC_Init(void);
static void MX_CAN_Init(void);
static void MX_TIM1_Init(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_ADC_Init();
  MX_CAN_Init();
  MX_TIM1_Init();
  /* USER CODE BEGIN 2 */

HAL_TIM_Base_Start(&htim1);

	HAL_CAN_Start(&hcan);
	TxHeader.ExtId = 0;
	TxHeader.RTR = CAN_RTR_DATA; 
	TxHeader.IDE = CAN_ID_STD;   
	TxHeader.DLC = 8;
	TxHeader.TransmitGlobalTime = ENABLE;
	HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING | CAN_IT_ERROR | CAN_IT_BUSOFF | CAN_IT_LAST_ERROR_CODE);

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		if(HAL_CAN_GetTxMailboxesFreeLevel(&hcan) > 0)
		 {
			TxHeader.StdId = 0x0378; 
		 for (uint8_t i = 0; i < 8; i++)
    {
      TxData[i] = i;
    }
		}
		HAL_CAN_AddTxMessage(&hcan, &TxHeader, TxData, &TxMailbox);
		
		HAL_Delay(500);
		
		HAL_CAN_GetRxMessage(&hcan, CAN_RX_FIFO0, &RxHeader, RxData);
		if(HAL_CAN_GetRxMessage(&hcan, CAN_RX_FIFO0, &RxHeader, RxData) == HAL_OK)
    {
        HAL_GPIO_WritePin(Led2_GPIO_Port,Led2_Pin, GPIO_PIN_SET);
				HAL_Delay(50);
				HAL_GPIO_WritePin(Led2_GPIO_Port,Led2_Pin, GPIO_PIN_RESET);
    }
		HAL_Delay(500);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		}
  /* USER CODE END 3 */
	}

....описание функицй 
  static void MX_CAN_Init(void)
{

  /* USER CODE BEGIN CAN_Init 0 */

  /* USER CODE END CAN_Init 0 */

  /* USER CODE BEGIN CAN_Init 1 */

  /* USER CODE END CAN_Init 1 */
  hcan.Instance = CAN;
  hcan.Init.Prescaler = 4;
  hcan.Init.Mode = CAN_MODE_NORMAL;
  hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;
  hcan.Init.TimeSeg1 = CAN_BS1_8TQ;
  hcan.Init.TimeSeg2 = CAN_BS2_7TQ;
  hcan.Init.TimeTriggeredMode = DISABLE;
  hcan.Init.AutoBusOff = DISABLE;
  hcan.Init.AutoWakeUp = DISABLE;
  hcan.Init.AutoRetransmission = DISABLE;
  hcan.Init.ReceiveFifoLocked = DISABLE;
  hcan.Init.TransmitFifoPriority = DISABLE;
  if (HAL_CAN_Init(&hcan) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN CAN_Init 2 */
sFilterConfig.FilterBank = 0;
sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; 
sFilterConfig.FilterIdHigh = 0x0000;
sFilterConfig.FilterIdLow = 0x0000;
sFilterConfig.FilterMaskIdHigh = 0x0000;
sFilterConfig.FilterMaskIdLow = 0x0000;
sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;
sFilterConfig.FilterActivation = ENABLE;
sFilterConfig.SlaveStartFilterBank = 14;
  /* USER CODE END CAN_Init 2 */

}
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
    if(HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxHeader, RxData) == HAL_OK)
    {
        HAL_GPIO_WritePin(Led2_GPIO_Port,Led2_Pin, GPIO_PIN_SET);
				HAL_Delay(50);
				HAL_GPIO_WritePin(Led2_GPIO_Port,Led2_Pin, GPIO_PIN_RESET);
				HAL_Delay(50);
    }
}


 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вам всё ещё актуально?

Не понял, что вы делаете. Насколько вижу, отправление из вашего контроллере (что за контроллер-то?) работает, в канвайзе видно 378-е сообщение. Кто тогда отправляет 379-е ? То сообщение, которое вы пытаетесь принять, кто отправляет? Как оно выглядит? (тут неочевидная штука - свои сообщения контроллер не видит).

Также проблема может быть в настройках фильтра. Мне очень лень разбираться, что там навертели в кубе. Покажите значения регистров кана (хоть картинками из отладчика)

 

И да, следите пожалуйста за форматированием кода. Кривые отступы не очень помогают пониманию...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...