单片机嵌入式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); //
    }
}
相关推荐
阿让啊8 小时前
Notepad++如何列选
c语言·嵌入式硬件·notepad++
Archer-8 小时前
解决STM32H7系列串口DMA发送一次卡死
stm32·单片机·嵌入式硬件
通信.萌新9 小时前
【stm32f4】ADC实验(stm32hal库)
stm32·单片机·嵌入式硬件
Mr-Apple9 小时前
使用STM32设置GPIO中断
stm32·单片机·嵌入式硬件
jasonslaex11 小时前
stm32传感器通用驱动代码
驱动开发·stm32·嵌入式硬件
嵌入式仿真实验教学平台17 小时前
深入探索IIC-OLED显示技术:嵌入式仿真平台如何重塑高校教学范式——深圳航天科技创新研究院技术赋能新一代工程教育
科技·单片机·gd32·嵌入式仿真·iic-oled显示技术
十碗阳春面17 小时前
TI 毫米波雷达走读系列—— 3DFFT及测角
单片机·嵌入式硬件·毫米波雷达·mmwave radar·awr/iwr系列
CPETW18 小时前
同旺科技 USB TO SPI / I2C适配器(专业版)--EEPROM读写——C
c语言·开发语言·科技·stm32·单片机·嵌入式硬件·电子
keke1018 小时前
PLC入门【6】计时器、计数器、存储器
嵌入式硬件
小智学长 | 嵌入式1 天前
Arduino入门教程:4-1、代码基础-进阶
嵌入式硬件·物联网·arduino