你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32H753 FDCAN发送数据异常

[复制链接]
zsy3830 提问时间:2022-4-18 14:36 / 未解决

FDCAN初始化:

HAL_RCC_FDCAN_CLK_ENABLE(); //使能 FDCAN 时钟 HAL_RCC_GPIOB_CLK_ENABLE(); //开启 GPIOB 时钟

//FDCAN1 时钟源配置为 PLL1Q

FDCAN1_PeriphClk.PeriphClockSelection = RCC_PERIPHCLK_FDCAN;
        FDCAN1_PeriphClk.FdcanClockSelection = RCC_FDCANCLKSOURCE_PLL;
        HAL_RCCEx_PeriphCLKConfig(&FDCAN1_PeriphClk);

        GPIO_Initure.Pin        = GPIO_PIN_8|GPIO_PIN_9;    //PB8,9
        GPIO_Initure.Mode       = GPIO_MODE_AF_PP;          //推挽复用
        GPIO_Initure.Pull       = GPIO_PULLUP;              //上拉
        GPIO_Initure.Speed      = GPIO_SPEED_FREQ_HIGH;     //高速
        GPIO_Initure.Alternate  = GPIO_AF9_FDCAN1;          //复用为 CAN1
        HAL_GPIO_Init(GPIOB, &GPIO_Initure);                //初始化  

        HAL_FDCAN_DeInit(&FDCAN1_Handler);                  //先清除以前的设置

        FDCAN1_Handler.Instance = FDCAN1;   
        FDCAN1_Handler.Init.FrameFormat         = FDCAN_FRAME_CLASSIC;  //传统模式
        FDCAN1_Handler.Init.Mode                = FDCAN_MODE_NORMAL;    //正常模式
        FDCAN1_Handler.Init.AutoRetransmission  = DISABLE;              //关闭自动重传!
        FDCAN1_Handler.Init.TransmitPause       = DISABLE;              //关闭传输暂停
        FDCAN1_Handler.Init.ProtocolException   = DISABLE;              //关闭协议异常处理
        FDCAN1_Handler.Init.NominalPrescaler    = FDCAN_CLOCK_DIV1;     //分频系数

        if(1000 == rate)//1M波特率
        {
            FDCAN1_Handler.Init.NominalSyncJumpWidth= 0x08;                //重新同步跳跃宽度
            FDCAN1_Handler.Init.NominalTimeSeg1     = 0x1f;                //tsg1 范围:2~256
            FDCAN1_Handler.Init.NominalTimeSeg2     = 0x08;                //tsg2 范围:2~128
        }

// FDCAN1_Handler.Init.DataPrescaler = 0x1; // FDCAN1_Handler.Init.DataSyncJumpWidth = 0x4; // FDCAN1_Handler.Init.DataTimeSeg1 = 0x5; / DataTimeSeg1 = Propagation_segment + Phase_segment_1 / // FDCAN1_Handler.Init.DataTimeSeg2 = 0x4;

    FDCAN1_Handler.Init.MessageRAMOffset    = 0;                    //信息 RAM 偏移
    FDCAN1_Handler.Init.StdFiltersNbr       = 1;                    //标准信息 ID 滤波器编号
    FDCAN1_Handler.Init.ExtFiltersNbr       = 0;                    //扩展信息 ID 滤波器编号
    FDCAN1_Handler.Init.RxFifo0ElmtsNbr     = 1;                   //接收 FIFO0 元素编号
    FDCAN1_Handler.Init.RxFifo0ElmtSize     = FDCAN_DATA_BYTES_8;   //接收 FIFO0 8 字节
    FDCAN1_Handler.Init.RxBuffersNbr        = 0;                   //接收缓冲编号

    FDCAN1_Handler.Init.TxEventsNbr         = 0;                    //发送事件编号
    FDCAN1_Handler.Init.TxBuffersNbr        = 1;                   //发送缓冲编号
    FDCAN1_Handler.Init.TxFifoQueueElmtsNbr = 0;                    //发送 FIFO 序列元素编号
    FDCAN1_Handler.Init.TxFifoQueueMode     = FDCAN_TX_FIFO_OPERATION;
    FDCAN1_Handler.Init.TxElmtSize          = FDCAN_DATA_BYTES_8;   //发送大小:8 字节

    if(HAL_FDCAN_Init(&FDCAN1_Handler) != HAL_OK)                               //初始化 FDCAN  
    {
        while(1);
    }

    //设置滤波器
    FDCAN1_RXFilter.IdType      = FDCAN_EXTENDED_ID;        //扩展 ID
    FDCAN1_RXFilter.FilterIndex = 0;                        //滤波器索引
    FDCAN1_RXFilter.FilterType  = FDCAN_FILTER_MASK;        //滤波器类型
    FDCAN1_RXFilter.FilterConfig= FDCAN_FILTER_TO_RXFIFO0;  //过滤器 0 关联到 FIFO0
    FDCAN1_RXFilter.FilterID1   = 0x0000;                   //32 位 ID
    FDCAN1_RXFilter.FilterID2   = 0x0000;                   //传统模式的话,这里是 32 位掩码
    HAL_FDCAN_ConfigFilter(&FDCAN1_Handler,&FDCAN1_RXFilter); //滤波器初始化

    //HAL_FDCAN_ActivateNotification(&FDCAN1_Handler,FDCAN_IT_RX_FIFO0_NEW_MESSAGE,0);  
    HAL_FDCAN_Start(&FDCAN1_Handler);                       //开启 FDCAN          

// HAL_NVIC_SetPriority(FDCAN1_IT0_IRQn,1,2); // HAL_NVIC_EnableIRQ(FDCAN1_IT0_IRQn);

发送函数:

FDCAN_TxHeader.Identifier = msg->ID; //32 位 ID FDCAN_TxHeader.IdType = FDCAN_EXTENDED_ID; //扩展 ID FDCAN_TxHeader.TxFrameType = FDCAN_DATA_FRAME; //数据帧 FDCAN_TxHeader.DataLength = FDCAN_DLC_BYTES_8; //数据长度 FDCAN_TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE; FDCAN_TxHeader.BitRateSwitch = FDCAN_BRS_OFF; //关闭速率切换 FDCAN_TxHeader.FDFormat = FDCAN_CLASSIC_CAN; //传统的 CAN 模式 FDCAN_TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS; //无发送事件 FDCAN_TxHeader.MessageMarker = 0;

HAL_FDCAN_AddMessageToTxBuffer(&FDCAN1_Handler, &FDCAN_TxHeader, TxData, FDCAN_TX_BUFFER0);

/ Send calibration confirmation message / HAL_FDCAN_EnableTxBufferRequest(&FDCAN1_Handler, FDCAN_TX_BUFFER0);

收藏 评论0 发布时间:2022-4-18 14:36

举报

0个回答

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版