完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
STM32H7B0 CAN发送异常
0X210100 = hfdcan1.Instance->TXFQS /*!< FDCAN Tx Event FIFO Status register, */ 0X200 = hfdcan1.ErrorCode /*!< FDCAN Error code */ 每次上电能正常发送10多次就不能发了 故障代码 就是0X200 = hfdcan1.ErrorCode 是不是外部硬件有问题,还是外部晶震有问题,USART1一直都是正常发送 我是每秒触发两次发送CAN,困惑我好多天了,大家没有遇到过 /* 配置FDCAN1 */ hfdcan1.Instance = FDCAN1; hfdcan1.Init.FrameFormat = FDCAN_FRAME_FD_NO_BRS; hfdcan1.Init.Mode = FDCAN_MODE_NORMAL; hfdcan1.Init.AutoRetransmission = DISABLE; hfdcan1.Init.TransmitPause = DISABLE; hfdcan1.Init.ProtocolException = ENABLE; hfdcan1.Init.NominalPrescaler = 0x0AU; hfdcan1.Init.NominalSyncJumpWidth= 0x08U; hfdcan1.Init.NominalTimeSeg1 = 0x1FU; hfdcan1.Init.NominalTimeSeg2 = 0x08U; hfdcan1.Init.DataPrescaler = 0x0AU; hfdcan1.Init.DataSyncJumpWidth = 0x04U; hfdcan1.Init.DataTimeSeg1 = 0x0FU; hfdcan1.Init.DataTimeSeg2 = 0x04U; hfdcan1.Init.MessageRAMOffset = 0x00U; hfdcan1.Init.StdFiltersNbr = 0x01U; hfdcan1.Init.ExtFiltersNbr = 0x00U; hfdcan1.Init.RxFifo0ElmtsNbr = 0x02U; hfdcan1.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8; hfdcan1.Init.RxFifo1ElmtsNbr = 0x00U; hfdcan1.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8; hfdcan1.Init.RxBuffersNbr = 0x00U; hfdcan1.Init.RxBufferSize = 0x00U; hfdcan1.Init.TxEventsNbr = 0x00U; hfdcan1.Init.TxBuffersNbr = 0x00U; hfdcan1.Init.TxFifoQueueElmtsNbr = 0x02U; hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; hfdcan1.Init.TxElmtSize = FDCAN_DATA_BYTES_8; /* 配置过滤器 */ sFilterConfig1.IdType = FDCAN_EXTENDED_ID; sFilterConfig1.FilterIndex = 0x00U; sFilterConfig1.FilterType = FDCAN_FILTER_MASK; sFilterConfig1.FilterConfig = FDCAN_FILTER_TO_RXFIFO0; sFilterConfig1.FilterID1 = 0x00U; sFilterConfig1.FilterID2 = 0x00U; HAL_FDCAN_ConfigFifoWatermark( hfdcan1, FDCAN_CFG_RX_FIFO0, 0x01U);/* 设置Rx FIFO0的wartermark为1 */ HAL_FDCAN_ActivateNotification( hfdcan1,FDCAN_IT_RX_FIFO0_WATERMARK,0x00U); /* 开启中断*/ HAL_FDCAN_Start( hfdcan1);/* 启动FDCAN */ /* 配置发送参数 */ TxHeader.Identifier = receiveId; TxHeader.IdType = FDCAN_EXTENDED_ID; TxHeader.TxFrameType = FDCAN_DATA_FRAME; TxHeader.DataLength = (uint32_t)((_Len 0xFFU) << 0x10U); TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE; TxHeader.BitRateSwitch = FDCAN_BRS_OFF; TxHeader.FDFormat = FDCAN_FD_CAN; TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS; TxHeader.MessageMarker = 0x00U; if(HAL_FDCAN_AddMessageToTxFifoQ(fdcanH, TxHeader, _DataBuf) != HAL_OK) mo = 0x01U ;else mo = 0x00U ; return mo; /* 系统时钟配置 */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE |RCC_OSCILLATORTYPE_LSE; // RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.LSEState = RCC_LSE_ON; RCC_OscInitStruct.LSIState = RCC_LSI_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 5; RCC_OscInitStruct.PLL.PLLN = 96; RCC_OscInitStruct.PLL.PLLP = 2; RCC_OscInitStruct.PLL.PLLQ = 2; RCC_OscInitStruct.PLL.PLLR = 2; RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2; RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE; RCC_OscInitStruct.PLL.PLLFRACN = 0; if (HAL_RCC_OscConfig( RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2 |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2; RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2; RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2; if (HAL_RCC_ClockConfig( RCC_ClkInitStruct, FLASH_LATENCY_7) != HAL_OK) { Error_Handler(); } PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_ADC|RCC_PERIPHCLK_FDCAN; PeriphClkInitStruct.PLL2.PLL2M = 25; PeriphClkInitStruct.PLL2.PLL2N = 200; PeriphClkInitStruct.PLL2.PLL2P = 2; PeriphClkInitStruct.PLL2.PLL2Q = 2; PeriphClkInitStruct.PLL2.PLL2R = 2; PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_0; PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOMEDIUM; PeriphClkInitStruct.PLL2.PLL2FRACN = 0; PeriphClkInitStruct.FdcanClockSelection = RCC_FDCANCLKSOURCE_PLL2; PeriphClkInitStruct.AdcClockSelection = RCC_ADCCLKSOURCE_PLL2; if (HAL_RCCEx_PeriphCLKConfig( PeriphClkInitStruct) != HAL_OK) { Error_Handler(); } __HAL_RCC_CSI_ENABLE() ; /* 使能CSI时钟 */ __HAL_RCC_SYSCFG_CLK_ENABLE() ; /* 使能SYSCFG时钟 */ HAL_EnableCompensationCell(); /* 使能IO补偿单元 */ |
|
相关推荐
1个回答
|
|
fdcan1.ErrorCode=0x200表示CAN传输中的一般错误。STM32H7B0上CAN传输异常可能有多种原因。以下是几个可能的原因:
1。CAN总线配置不正确:确保正确配置了CAN总线设置,如波特率、定时和帧格式。确认发射器和接收器都设置为相同的设置。 2.硬件问题:检查STM32H7B0和CAN总线之间的物理连接和接线。确保CAN收发器正确连接并通电。 3.电源不足:验证STM32H7B0和CAN收发器的电源是否稳定,是否足以正常进行CAN操作。 4.噪声或干扰:CAN总线易受噪声和干扰的影响。确保附近没有噪声源,如有必要,可考虑添加额外的屏蔽或噪声滤波器。 5.软件问题:验证CAN驱动程序软件是否正确实施和配置。检查是否存在任何驱动程序或库兼容性问题。 6.缓冲器或FIFO溢出:检查CAN传输缓冲器或FIFO状态(hfdcan1.Instance->TXFQS)。如果传输缓冲区或FIFO已满,则传输可能会失败。 在代码中实现正确的错误处理和错误恢复机制。有关can外围设备和故障排除步骤的更多信息,也可以参考STM32H7参考手册和数据表。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1621 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1546 浏览 1 评论
980 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
686 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1599 浏览 2 评论
1867浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
648浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
518浏览 3评论
534浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
506浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-23 17:24 , Processed in 0.769888 second(s), Total 81, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号