单片机嵌入式CAN库详解

kw_can库说明

本库是针对CAN类型数据的收发设计:

  • 主要应用于大数据量(数据处理速度高于缓存CAN_RTX_FIFO_SIZE大小)接收不丢包
  • 可快速进出接收中断
  • 可跨线程调用发送接口。
  • 本库开源连接地址:gitee连接

    实现思路

    本库采用C语言进行编程,方便移植,用户只通过调用库接口函数即可使用。

    主要接口函数如下:

    项目 函数 功能
    1 kw_CANInit 初始化,初始化设备信息,和CAN发送回调函数
    2 kw_CANFlush 周期发送指定CAN设备信息中的发送缓存中的数据
    3 kw_CANBufferPop 弹出指定Buffer中的CAN帧
    4 kw_CANBufferPush 压入CAN帧到指定Buffer中

    主要变量结构体定义如下:

    项目 变量 类型 说明
    1 _canSendCB 函数指针变量 can发送回调变量
    2 kw_CanFrame_t CAN帧结构体 id:CAN发送ID
    datas:CAN帧数组
    len:CAN帧数组长度
    3 kw_CanBuffer_t CAN帧环形队列结构体 frame:CAN帧结构体
    read:读指针
    write:写指针
    4 kw_CanDev_t CAN设备结构体 rx:接收队列
    tx:发送队列
    io:发送接口

    测试代码

    #include "kw_baseDrvCFG.h"
    
    static kw_CanDev_t _canDev;
    
    /// @brief can接收回调,该函数可放在can接收中断中
    /// @param rx
    static void _CanRx_CB(const kw_CanFrame_t *rx)
    {
        kw_CANBufferPush(&_canDev.rx, rx->id, rx->datas, rx->len);
    }
    
    /// @brief 调用硬件层CAN发送接口
    /// @param tx
    /// @return
    int _canSendCB(const kw_CanFrame_t *tx)
    {
        return HAL_CanTransmit(&hcan1, tx->id, tx->datas, tx->len, 1000);
    }
    
    void main()
    {
        kw_CANInit(&_canDev, _canSendCB);
        kw_CanFrame_t ret = {0};
        while (1)
        {
            if (kw_CANBufferPop(&_canDev.rx, &ret) == 0)
            {
                if (ret.id == 0x1234567 && ret.len == 2 && ret.datas[0] == 0x5A && ret.datas[1] == 0xA5)
                { // 回传指定的can frame
                    kw_CANBufferPush(&_canDev, &ret);
                }
            }
            kw_CANFlush(&_canDev);
            HAL_Delay(1); //
        }
    }
    
    

    作者:KingQian2018

    物联沃分享整理
    物联沃-IOTWORD物联网 » 单片机嵌入式CAN库详解

    发表回复