灌篮少年 发表于 2024-9-4 17:39:19

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]
查看完整版本: STM32G474使用CAN实现基础发送和接收