中级会员
 
- 积分
- 203
- 金钱
- 203
- 注册时间
- 2018-6-13
- 在线时间
- 27 小时
|
5金钱
板:两块stm32h750VBcan芯片:microchip MCP2562FD,支持 2,5,8Mbps
两板信号各有2个6N137隔离光耦
问题:FDCAN时钟80Mhz,当FDCAN仲裁段波特率设为1Mbps,数据段波特率设为2Mbps,运行正常,当FDCAN数据段波特率继续上调至5Mbps或者8Mbps时,正常模式出现通讯异常,然后将模式改为外部环回模式,接收板接收到了信号。查看单片机应用手册,外部环回模式会忽视ACK错误。应该是接收板应答问题,有大神能讲解一下吗。对FDCAN这么多寄存器不是很了解,这大概是哪方面导致的。
代码:
初始化部分
void MX_FDCAN2_Init(void)
{
/* USER CODE BEGIN FDCAN2_Init 0 */
FDCAN_FilterTypeDef sFilterConfig;
/* USER CODE END FDCAN2_Init 0 */
/* USER CODE BEGIN FDCAN2_Init 1 */
/* USER CODE END FDCAN2_Init 1 */
hfdcan2.Instance = FDCAN2;
hfdcan2.Init.FrameFormat = FDCAN_FRAME_FD_BRS;
//hfdcan2.Init.Mode = FDCAN_MODE_EXTERNAL_LOOPBACK;
hfdcan2.Init.Mode = FDCAN_MODE_NORMAL;
hfdcan2.Init.AutoRetransmission = ENABLE;
hfdcan2.Init.TransmitPause = DISABLE;
hfdcan2.Init.ProtocolException = ENABLE;
hfdcan2.Init.NominalPrescaler = 1;
hfdcan2.Init.NominalSyncJumpWidth = 15;
hfdcan2.Init.NominalTimeSeg1 = 64;
hfdcan2.Init.NominalTimeSeg2 = 15;
hfdcan2.Init.DataPrescaler = 1;
hfdcan2.Init.DataSyncJumpWidth = 2;
hfdcan2.Init.DataTimeSeg1 = 7;
hfdcan2.Init.DataTimeSeg2 = 2;
hfdcan2.Init.MessageRAMOffset = 0;
hfdcan2.Init.StdFiltersNbr = 1;
hfdcan2.Init.ExtFiltersNbr = 0;
hfdcan2.Init.RxFifo0ElmtsNbr = 2;
hfdcan2.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8;
hfdcan2.Init.RxFifo1ElmtsNbr = 0;
hfdcan2.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8;
hfdcan2.Init.RxBuffersNbr = 0;
hfdcan2.Init.RxBufferSize = FDCAN_DATA_BYTES_8;
hfdcan2.Init.TxEventsNbr = 0;
hfdcan2.Init.TxBuffersNbr = 0;
hfdcan2.Init.TxFifoQueueElmtsNbr = 2;
hfdcan2.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
hfdcan2.Init.TxElmtSize = FDCAN_DATA_BYTES_8;
if (HAL_FDCAN_Init(&hfdcan2) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN FDCAN2_Init 2 */
sFilterConfig.IdType = FDCAN_STANDARD_ID;
sFilterConfig.FilterIndex = 0;
sFilterConfig.FilterType = FDCAN_FILTER_RANGE;
sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
sFilterConfig.FilterID1 = 0x00;
sFilterConfig.FilterID2 = 0x04;
HAL_FDCAN_ConfigFilter(&hfdcan2, &sFilterConfig);
HAL_FDCAN_ConfigFifoWatermark(&hfdcan2,FDCAN_CFG_RX_FIFO0,1);
HAL_FDCAN_ActivateNotification(&hfdcan2,FDCAN_IT_RX_FIFO0_WATERMARK,0);
HAL_FDCAN_Start(&hfdcan2);
/* USER CODE END FDCAN2_Init 2 */
}
发送部分:
if(len>8)
dl = FDCAN_DLC_BYTES_8;
else
dl = ((uint32_t)len) << 16;
pTxHeader.Identifier = 1;
pTxHeader.IdType = FDCAN_STANDARD_ID;
pTxHeader.TxFrameType = FDCAN_DATA_FRAME;
pTxHeader.DataLength = dl;
pTxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
pTxHeader.BitRateSwitch = FDCAN_BRS_ON;
pTxHeader.FDFormat = FDCAN_FD_CAN;
pTxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
pTxHeader.MessageMarker = 0;
HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &pTxHeader, can_tx_buf);
接收部分:
void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
{
FDCAN_RxHeaderTypeDef pRxHeader;
if((RxFifo0ITs & FDCAN_IT_RX_FIFO0_WATERMARK) != 0)
{
if(HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &pRxHeader, can_rx_buf) == HAL_OK)
{
HAL_FDCAN_ActivateNotification(hfdcan,FDCAN_IT_RX_FIFO0_WATERMARK,0);
cmd = can_rx_buf[0];
len = pRxHeader.DataLength >> 16;
id = (uint8_t)pRxHeader.Identifier;
switch(cmd)
{
case 1 :
break;
case 2 :
break;
case 3:
break;
case 4 : HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);
break;
case 5 :
break;
case 9 :
break;
}
}
}
}
FDCAN时钟
应用手册描述
外部环回模式波形 (数据段8Mbps)
正常模式波形+FDCAN自动重发(数据段8Mbps)
|
|