单片机嵌入式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:发送接口

测试代码

c 复制代码
#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); //
    }
}
相关推荐
一个嵌入式学徒33 分钟前
STM32F4 HAL库常用API手册(非CubeMX生成,需手动调用)
stm32·单片机·嵌入式硬件
m0_3771081440 分钟前
小智ai,esp32
单片机
是摆烂第一名呀1 小时前
RK3576+GMSL摄像头底层适配与调试
linux·arm开发·驱动开发·嵌入式硬件·数码相机
Mr-pn-junction10 小时前
clk_gate
单片机·嵌入式硬件·fpga开发
尼喃15 小时前
662K和65Z5三脚稳压芯片PW6566,附引脚定义与典型电路图
嵌入式硬件
李永奉18 小时前
杰理可视化SDK开发-【BUG】配置“TWS两边同时按消息使能”功能后,按键单击功能无效失灵
开发语言·单片机·嵌入式硬件·物联网·bug
执迷不悟82319 小时前
51单片机--中断/定时/PWM
单片机·嵌入式硬件·51单片机
A小调的码农21 小时前
OPENOCD+MSYS+VSCODE:从“灯不亮“到“终于亮了“
ide·vscode·stm32·单片机·编辑器
AI的探索之旅21 小时前
让 Claude Code 直接操刀画原理图和 PCB:VSCode 插件接外部 API 全流程
linux·ide·vscode·嵌入式硬件·编辑器
Dlrb121121 小时前
单片机通信协议---串口及串口通信
单片机·嵌入式硬件·串口·uart·modbus·波特率·主机从机