马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
使用STM32CubeMX天生代码,
- CAN波特率设置:经Clock Divider分频后,得到CAN的时钟频率 f c a n f_{can} fcan,CAN的发送波特率为 f c a n / ( N o m i n a l S y n c J u m p W i d t h + N o m i n a l T i m e S e g 1 + N o m i n a l T i m e S e g 2 ) f_{can}/(Nominal Sync Jump Width + Nominal Time Seg1 + Nominal Time Seg2) fcan/(NominalSyncJumpWidth+NominalTimeSeg1+NominalTimeSeg2)。
- 开启interrupt 0停止,以启动接收停止
设置完成后天生代码,在fdcan.c文件修改MX_FDCAN3_Init函数,只列出修改部分:
- /* USER CODE BEGIN FDCAN3_Init 0 */
- FDCAN_FilterTypeDef FDCAN3_RXFilter;
- /* USER CODE END FDCAN3_Init 0 */
- FDCAN3_RXFilter.IdType=FDCAN_STANDARD_ID;
- FDCAN3_RXFilter.FilterIndex=0;
- FDCAN3_RXFilter.FilterType=FDCAN_FILTER_RANGE;
- FDCAN3_RXFilter.FilterConfig=FDCAN_FILTER_TO_RXFIFO0;
- FDCAN3_RXFilter.FilterID1=0x0000;
- FDCAN3_RXFilter.FilterID2=0x0000;
- if(HAL_FDCAN_ConfigFilter(&hfdcan3,&FDCAN3_RXFilter)!=HAL_OK)
- {
- Error_Handler();
- }
-
-
- HAL_FDCAN_Start(&hfdcan3);
- HAL_FDCAN_ActivateNotification(&hfdcan3,FDCAN_IT_RX_FIFO0_NEW_MESSAGE,0);
复制代码 在fdcan.c文件最下端添加发送和停止处置惩罚函数
- /* USER CODE BEGIN 1 */
- FDCAN_TxHeaderTypeDef TxHeader;
- uint8_t FDCAN_Transmit(uint32_t can_id, uint32_t DataLength, uint8_t tx_data[])
- {
-
- TxHeader.Identifier = can_id;
- TxHeader.IdType = FDCAN_EXTENDED_ID; // 先设置为扩展ID
- if(can_id < 0x800) { //一般情况都是标准ID
- TxHeader.IdType = FDCAN_STANDARD_ID;
- }
- TxHeader.TxFrameType = FDCAN_DATA_FRAME; //
- TxHeader.DataLength = DataLength;
- TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
- TxHeader.BitRateSwitch = FDCAN_BRS_ON;
- TxHeader.FDFormat = FDCAN_FD_CAN;
- TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
- TxHeader.MessageMarker = 0;
- if(HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan3, &TxHeader, tx_data) != HAL_OK) {
- return 1;
- }
- return 0;
- }
- uint8_t RxData1[8];
- FDCAN_RxHeaderTypeDef RxHeader;
- void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
- {
- if((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != 0) {
- HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &RxHeader, RxData1);
- if (hfdcan->Instance == FDCAN3) {
-
- }
- }
- }
- /* USER CODE END 1 */
复制代码 最后,在fdcan.h添加函数声明:
- uint8_t FDCAN_Transmit(uint32_t can_id, uint32_t DataLength, uint8_t tx_data[]);
- void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs);
复制代码 此时,可以使用fdcan1_transmit发送数据,在HAL_FDCAN_RxFifo0Callback函数中对接收数据举行处置惩罚
如果要过滤ID,那么需要将StdFiltersNbr或者ExtFiltersNbr设置为你使用的滤波器个数,StdFiltersNbr为标准帧滤波器个数,ExtFiltersNbr为扩展帧滤波器个数。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |