STM32G474使用CAN实现基础发送和接收
使用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;
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企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]