вопрос другой возник...пытаюсь связать две stm32f105r8t6 через CAN, но после отправки всегда появляется 131 ошибка (ErrorCode=131)...потом все виснет, отчего так может быть?
настройка первой stm
Код
static void MX_CAN1_Init(void)
{
hcan1.Instance = CAN1;
hcan1.Init.Prescaler = 4;
hcan1.Init.Mode = CAN_MODE_NORMAL;
hcan1.Init.SJW = CAN_SJW_1TQ;
hcan1.Init.BS1 = CAN_BS1_4TQ;
hcan1.Init.BS2 = CAN_BS2_4TQ;
hcan1.Init.TTCM = DISABLE;
hcan1.Init.ABOM = DISABLE;
hcan1.Init.AWUM = DISABLE;
hcan1.Init.NART = ENABLE;
hcan1.Init.RFLM = DISABLE;
hcan1.Init.TXFP = DISABLE;
if (HAL_CAN_Init(&hcan1) != HAL_OK)
{
Error_Handler();
}
}
ее фильтры
Код
hcan1.pTxMsg = &canTxMessage;
hcan1.pRxMsg = &canRxMessage;
CAN_FilterConfTypeDef canFilterConfig;
canFilterConfig.FilterNumber = 0;
canFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
canFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
canFilterConfig.FilterIdHigh = 0;
canFilterConfig.FilterIdLow = 0;
canFilterConfig.FilterMaskIdHigh = 0;
canFilterConfig.FilterMaskIdLow = 0;
canFilterConfig.FilterFIFOAssignment = 0;
canFilterConfig.FilterActivation = ENABLE;
canFilterConfig.BankNumber = 1;
HAL_CAN_ConfigFilter(&hcan1, &canFilterConfig);
canRxMessage.StdId = 0x801;
canRxMessage.RTR = CAN_RTR_DATA;
canRxMessage.IDE = CAN_ID_STD;
canRxMessage.DLC = 2;
HAL_CAN_Receive_IT(&hcan1, CAN_FIFO0);
HAL_NVIC_SetPriority(CAN1_RX0_IRQn,2,0);
HAL_NVIC_EnableIRQ(CAN1_RX0_IRQn);
настройки одинаковые у обоих плат.
разница только в том, что первая плата отправляется команду, а вторая принимает.
у первой платы:
Код
void CAN_Transmit()
{
canTxMessage.StdId=0x802;
canTxMessage.DLC=2;
canTxMessage.Data[0] = 0x00;
canTxMessage.Data[1] = 0x01;
HAL_CAN_Transmit(&hcan1,10);
}
в цикле ее же:
Код
while (1)
{
/* USER CODE END WHILE */
CAN_Transmit();
HAL_Delay(2000);
/* USER CODE BEGIN 3 */
}
вторая должна принимать
Код
void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* CanHandle)
{
CAN_ID = CanHandle->pRxMsg->StdId;
CAN_DLC = CanHandle->pRxMsg->DLC;
__HAL_UNLOCK (CanHandle);
r=HAL_CAN_Receive_IT(&hcan1, CAN_FIFO0);
DATA[0]=CanHandle->pRxMsg->Data[0];
DATA[1]=CanHandle->pRxMsg->Data[1];
}
но первая плата после отправки уходит в ошибку 131, потом через некоторое время виснет (число ошибок зашкаливает,наверное)... что может быть не так???
если быть точнее, но в функции отправки уходит в таймаут и сидит там, пока статус кана не перейдет в HAL_STATE_ERROR
Сообщение отредактировал Ekka - Nov 13 2017, 14:26