【龙芯1c库】封装CAN接口和使用示例

【GD32篇】CAN总线入门教程——实现数据收发 CAN通信实验。使用GD32F103标准开发方式实现CAN与上位机通信,快速了解接口函数,实现数据收发。 阅读详情

can使用还是比较广泛的,之前有网友在龙芯1b和龙芯1c上已经测试过了在裸机编程中使用CAN接口,这里把他们分享的程序贴上来,供大家参考。

龙芯1b上的测试程序在https://gitee.com/caogos/OpenLoongsonLib1b

龙芯1c上的测试程序在https://gitee.com/caogos/OpenLoongsonLib1c

据说,淘宝上的CAN模块TJA1050可以用。

这里,把龙芯1c的测试程序和封装的接口函数都贴上来

源码

test_can.c

/*
 * File      : test_can.c
测试硬件can驱动
1.test_cansend() 初始化CAN口(100K)后,以速率100K, 发送标准数据帧(1-8 共8个数据)和扩展数据帧(1-8 共8个数据)
2. candump() 打印出当前CAN寄存器值
3. 当收到数据,打印出来。
 */


#include "../lib/ls1c_public.h"
#include "../lib/ls1c_regs.h"
#include "../lib/ls1c_clock.h"
#include "../lib/ls1c_can.h"
#include "../lib/ls1c_pin.h"
#include "../lib/ls1c_irq.h"


CanRxMsg RxMessage;
CanTxMsg TxMessage;

void candump(void)
{
    CAN_TypeDef* CANx;
    unsigned char temp;
    CANx =  CAN0;

    temp =  CANx->MOD;
    printf("\r\ncan0->MOD= 0x%02x  \r\n",temp);   

    temp =  CANx->CMR;
    printf("\ncan0->CMR = 0x%02x  \r\n",temp);  

    temp =  CANx->SR;
    printf("\ncan0->SR = 0x%02x  \r\n",temp); 

    temp =  CANx->IR;
    printf("\ncan0->IR = 0x%02x  \r\n",temp); 

    temp =  CANx->IER;
    printf("\ncan0->IER = 0x%02x  \r\n",temp); 

    temp =  CANx->BTR0;
    printf("\ncan0->BTR0 = 0x%02x  \r\n",temp); 

    temp =  CANx->BTR1;
    printf("\ncan0->BTR1 = 0x%02x  \r\n",temp); 

    temp =  CANx->CDR;
    printf("\ncan0->CDR = 0x%02x  \r\n",temp); 

    temp =  CANx->RMCR;
    printf("\ncan0->RMCR = 0x%02x  \r\n",temp); 

    printf("\r\n验收代码:");
    temp =  CANx->IDE_RTR_DLC;
    printf("  0x%02x ",temp); 
    temp =  CANx->ID[0];
    printf("  0x%02x ",temp); 
    temp =  CANx->ID[1];
    printf("  0x%02x ",temp); 
    temp =  CANx->ID[2];
    printf("  0x%02x ",temp); 

    printf("\r\n验收屏蔽:");
    temp =  CANx->ID[3];
    printf("  0x%02x ",temp); 
    temp =  CANx->BUF[0];
    printf("  0x%02x ",temp); 
    temp =  CANx->BUF[1];
    printf("  0x%02x ",temp); 
    temp =  CANx->BUF[2];
    printf("  0x%02x ",temp); 

}

void ls1c_can0_irqhandler(int irq, void *param)  
{  
    CAN_TypeDef* CANx;
    int i;
    unsigned char status;
    CANx =  CAN0;
    /*读寄存器清除中断*/
   status = CANx->IR;
   printf("\r\ncan0 int happened!\r\n");
    /*接收中断*/
    if (( status & CAN_IR_RI) == CAN_IR_RI) 
    {
        /*清除RI 中断*/
       CAN_Receive(CANx, &RxMessage);
       CANx->CMR |= CAN_CMR_RRB; 
       CANx->CMR |= CAN_CMR_CDO; 
       printf("\r\ncan0 receive:\r\n");
       printf(" IDE=%d   RTR = %d DLC=%d  ",RxMessage.IDE, RxMessage.RTR ,RxMessage.DLC);
       if(RxMessage.IDE == CAN_Id_Standard)
       {
         printf("\r\n Standard ID= %02X  ",RxMessage.StdId);
       }
       else if(RxMessage.IDE == CAN_Id_Extended)
       {
         printf("\r\n Extended ID= %02X  ",RxMessage.ExtId);
       }

       if(RxMessage.RTR== CAN_RTR_DATA)
       {
         printf("\r\ndata= ");
         for(i=0;i<RxMessage.DLC;i++)
         {
           printf("0x%02X  ",RxMessage.Data[i]);
         }
       }
       else if(RxMessage.IDE == CAN_RTR_Remote)
       {
         printf("\r\nCAN_RTR_Remote  no data!");
       }
       printf("\r\n");
    }
    /*发送中断*/
    else if (( status  & CAN_IR_TI) == CAN_IR_TI) 
    {
       printf("\r\ncan0 send success! \r\n");
    }
}  

void ls1c_can1_irqhandler(int irq, void *param)  
{  
    CAN_TypeDef* CANx;
    int i;
    unsigned char status;
    CANx =  (CAN_TypeDef* )LS1C_REG_BASE_CAN1;
    /*读寄存器清除中断*/
   status = CANx->IR;
   printf("\r\ncan1 int happened!\r\n");
    /*接收中断*/
    if (( status & CAN_IR_RI) == CAN_IR_RI) 
    {
        /*清除RI 中断*/
       CAN_Receive(CANx, &RxMessage);
       CANx->CMR |= CAN_CMR_RRB; 
       CANx->CMR |= CAN_CMR_CDO; 
       printf("\r\ncan1 receive:\r\n");
       printf(" IDE=%d   RTR = %d DLC=%d  ",RxMessage.IDE, RxMessage.RTR ,RxMessage.DLC);
       if(RxMessage.IDE == CAN_Id_Standard)
       {
         printf("\r\n Standard ID= %02X  ",RxMessage.StdId);
       }
       else if(RxMessage.IDE == CAN_Id_Extended)
       {
         printf("\r\n Extended ID= %02X  ",RxMessage.ExtId);
       }

       if(RxMessage.RTR== CAN_RTR_DATA)
       {
         printf("\r\ndata= ");
         for(i=0;i<RxMessage.DLC;i++)
         {
           printf("0x%02X  ",RxMessage.Data[i]);
         }
       }
       else if(RxMessage.IDE == CAN_RTR_Remote)
       {
         printf("\r\nCAN_RTR_Remote  no data!");
       }
       printf("\r\n");
    }
    /*发送中断*/
    else if (( status  & CAN_IR_TI) == CAN_IR_TI) 
    {
       printf("\r\ncan1 send success! \r\n");
    }
}  

void Can_Config(CAN_TypeDef* CANx, Ls1c_CanBPS_t bps)
{
    unsigned char initresult;

    pin_set_purpose(54, PIN_PURPOSE_OTHER);
    pin_set_purpose(55, PIN_PURPOSE_OTHER);
    pin_set_remap(54, PIN_REMAP_THIRD);
    pin_set_remap(55, PIN_REMAP_THIRD);
    
    CAN_InitTypeDef        CAN_InitStructure;
  
    CAN_InitStructure.CAN_Mode = CAN_Mode_STM;
    CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;

    /* BaudRate= f(APB)/((1+BS1+BS2)(SJW*2*Prescaler))=126000000/[(1+7+2)*1*2*63]=100000=100K*/
    /* BPS     PRE   BS1   BS2   最低40K
       1M      9       4       2   
       800K    8       7       2   
       500K    9       11      2   
       250K    36      4       2   
       125K    36      11      2   
       100K    63      7       2   
       50K     63      16      3`  
       40K     63     
STM32F103 CAN通讯注意事项 STM32F103 CAN通讯注意事项: stm32有3个发送邮箱 2个三级深度的接受FIFO 发送数据注意事项: 需要首先设置CanTxMsg结构体,每次最多发送8个字节数据 之后调用CAN_Transmit(CANx, &TxMessage);函数真正发送,同时可以根据返回值判断是否发送成功 接收数据注意事项 接收需要调用 void CAN_Receive(CAN_TypeDef* CANx, uint8_t FIFONumber, CanRxMsg* RxMessage); 阅读详情

相关推荐

GD32通过CAN回环模式实现串口数据回显功能

通过上位机与UART连接,将接收到的100个字节数据通过CAN进行发送并接收 (使用回环模式)接收的数据通过对应串口再发送到上位机进行显示;CAN总线的参数为500K波特率,80%采样点,发送周期为100ms。就是电脑 串口助手发100个数据到串口 DMA接收,经过can 回环模式,再用串口DMA发回电脑。在这里插入图片描述发送600个字节数据,经过CAN,输出600个字节数据。等待USART0 RX DMA1信道传输完成。

qq_27091657的博客 1237

DBC文件导入MATLAB快速生成C代码:一站式CAN协议解析与模型开发工具,DBC文件导入MATLAB快速生成C代码:一站式CAN协议解析与模型开发工具,DBC文件生成MATLAB模型生成C代码CA

DBC文件导入MATLAB快速生成C代码:一站式CAN协议解析与模型开发工具,DBC文件导入MATLAB快速生成C代码:一站式CAN协议解析与模型开发工具,DBC文件生成MATLAB模型生成C代码CAN协议解析 DBC文件生成MATLAB模型生成C代码CAN协议解析 直接可以将DBC文件 导入MATLAB 然后下一步生成模型,模型编译后 一键生成C代码 CAN网络开发 加速工具 ,DBC文件; MATLAB模型生成; C代码生成; CAN协议解析; DBC文件导入; 模型编译; 加速工具,MATLAB辅助DBC文件转C代码:CAN网络开发加速工具

龙芯3B6000平台AnolisOS 23.4部署Docker容器创建失败解决方案

最近在龙芯 3B6000 平台上部署 AnolisOS 23.4 时,遇到了一个典型问题:通过系统默认仓安装 Docker 后,容器无法正常创建。这并非个例,而是国产化平台迁移中可能遇到的兼容性挑战。本文将系统性地拆解此问题的完整解决方案,从环境准备、Docker 安装、问题诊断到最终修复,提供一套可复现的操作流程。无论你是初次接触龙芯平台的开发者,还是正在将应用向国产化环境迁移的运维人员,都能从中找到清晰的指引避坑指南。 1. 背景与核心概念 在深入问题之前,我们有必要理解几个关键概念及其在当前场景下

dielucuan8830的博客 515

vector DBC文件转换为C结构体

导入Vector can DBC文件,自动生成程序使用的结构体,生成.h文件

STM32中CanRxMsg结构体各成员变量含义详解

结构体定义如下: typedef struct { uint32_t StdId; uint32_t ExtId; uint8_t IDE; uint8_t RTR; uint8_t DLC; uint8_t Data[8]; uint8_t FMI; } CanRxMsg; uint32_t StdId; 标准帧的ID,按照CAN协议,标准帧ID占...

格物穷理 9689

STM32个人笔记-CAN总线通讯

大四实习那年记忆颇深,进入一家船载通讯的公司当嵌入式软件工程师实习生,学习的内容一部分正是CANJ1939。虽然实习期间匆匆忙忙缝缝补补,但现在还是按着流程学一遍。CAN协议广泛用于汽车控制服务行业。

weixin_47077788的博客 6943

[嵌入式系统-4]:龙芯1B 开发学习套件-1-开发版硬件介绍

龙芯 1B 开发学习套件学习过程与步骤:(1龙芯 1B 开发版 (本文)-》(2)SOC 龙芯1B芯片手册 =》(3)LS232 MIP32 CPU内核 =》(4)MIP32汇编语言 =》(5)龙芯 1 系列芯片的IDE集成开发环境 =》(6)裸机启动 =》(7)裸机应用程序 =》(8)轻量级实时嵌入式操作系统 =》(9)驱动程序 =》(10)应用程序龙芯 1B 芯片是龙芯中科技术股份有限公司研发的 SoC 芯片,具有完全意义上的自主知识产权。该芯片使用LS232 内核。

文火冰糖(王文兵)的博客 3942

龙芯可以运行linux吗,开源的龙芯主板可顺利启动Linux系统

软件开源很常见,但是你见过硬件开源吗?国内也有。据了解,龙芯俱乐部广州龙芯经过3个版本的研发,龙芯1C开源主板已经调试成功,可以顺利启动Linux系统了。开源龙芯主板是一款以开源方式推广的龙芯嵌入式主板,在“树莓派”(RaspberryPi)一样尺寸的小电路板上(火柴盒大小)集成了龙芯1CSOC处理器、RTC时钟等主要部件,以及RJ-45、USB、串口(最多12路)、SPI、PWM、CAN...

weixin_35512156的博客 1019

龙芯各系列芯片详细介绍

龙芯 1C103 片上集成 Flash、ATIM、GTIM、ADC、SPI、I2C、UART、RTC 等功能模块,可输出带有死区的互补 PWM 信号,具备驱动舵机、有刷电机、无刷电机的原生支持,同时具备常见的通讯模块。龙芯 1C103 采用 QFN32 封装形式,芯片尺寸 4.0mm×4.0mm。芯片尺寸小,各引脚可根据需求进行复用,应用场景灵活,可以满足高性价比的常见电机应用。产品主要应用于筋膜枪、修枝机、电锯、电扳手、跳绳机、风扇、汽车电子等。

weixin_50519878的博客 312

新年芯事 | 龙芯中科通用SOC芯片龙芯2K2000流片成功

前言2022年12月中,龙芯2K2000完成初步功能调试及性能测试,达到设计目标,已全面展开解决方案调试,近期将推出试用。龙芯2K2000▋龙架构平台龙芯2K2000芯片中集成两个LA364处理器核,2MB共享二级缓存,典型工作频率1.5GHz。在1.5GHz时SPEC2006INT(base)单核定/浮点分值达到13.5/14.9分。▋集成自研GPU核龙芯2K2000芯片集成了龙芯自主研发的LG...

dotNET跨平台 1311

龙芯2k0300 - 久久派开发环境搭建及内核升级

龙芯2K0300处理器官网地址:《https://www.loongson.cn/index.php/product/show?id=33龙芯2K0300数据手册;龙芯2K0300处理器用户手册。久久派2K0300核心板默认配套的是PMON固件以及linux 4.19的内核,PMON是一个兼有BIOS部分功能的开放源码软件,多用于嵌入式系统。基于龙芯的系统采用PMON作为类BIOS兼,并在其基础上做了很多完善的工作,支持BIOS启动配置,内核加载,程序调试,内存寄存器显示、设置以及内存反汇编等。

Graceful_scenery的博客 1054

龙芯2k0300 - 久久派核心板开发环境搭建

龙芯2K0300处理器官网地址:《https://www.loongson.cn/index.php/product/show?id=33龙芯2K0300数据手册;龙芯2K0300处理器用户手册。

Graceful_scenery的博客 999

迅为龙芯全系列开发板:全国产化嵌入式开发实战指南

在嵌入式系统与工控领域,处理器选型是项目成功的基础,它直接关系到系统的性能、功耗与长期可维护性。随着供应链安全与自主可控成为行业刚需,基于自主指令集的全国产平台正成为关键基础设施、网络安全等场景的重要选项。龙芯处理器家族覆盖了从低功耗嵌入式到高性能计算的完整谱系,其生态围绕LoongArch指令集与Linux软件栈构建,为开发者提供了从芯片到系统的全栈可控环境。这种技术路径的价值在于,它不仅能满足特定行业的国产化替代要求,更能通过开箱即用的开发板方案,大幅降低从原型验证到产品落地的工程门槛。迅为推出的龙芯

weixin_30731305的博客 479

龙芯2k0300 - 久久派开发环境搭建及内核升级(上)

龙芯2K0300处理器官网地址:《https://www.loongson.cn/index.php/product/show?id=33龙芯2K0300数据手册;龙芯2K0300处理器用户手册。龙芯系统有两套不兼容的LoongArch生态,核心差异在底层标准、内核、软件兼容、发行版、使用场景。龙芯的旧世界(ABI 1.0)新世界(ABI 2.0)是两套不兼容的软件生态体系。简单来说,旧世界是龙芯早期仓促推出的、未能完全融入开源主线的“过渡方案”;

Graceful_scenery的博客 553

基于龙芯2K0500的嵌入式Linux开发实战:从硬件选型到工业网关应用

嵌入式Linux系统是连接底层硬件与上层应用的关键软件平台,其核心在于通过内核管理硬件资源,并为应用程序提供统一的系统调用接口。其工作原理基于模块化设计,通过设备树(Device Tree)描述硬件配置,驱动模型实现硬件抽象。该技术的价值在于提供了稳定、开源且高度可定制的操作系统基础,极大地缩短了嵌入式产品的开发周期。在工业控制、边缘计算物联网网关等应用场景中,嵌入式Linux能够有效整合数据采集、协议转换网络通信功能。本文以飞凌嵌入式FET-2K0500-C核心板为例,深入探讨了基于国产龙芯处理器L

weixin_28709715的博客 248

国产化工控机上 C# 上位机适配与部署全流程

龙芯/飞腾 + 统信 UOS / 银河麒麟 的国产化工控机上,C# 上位机已经可以达到与 x86 Windows 接近的开发体验运行稳定性。使用 .NET 8+ AOT + 条件编译处理架构差异串口/工业协议源码编译或国产替代优先用 MQTT / OPC UA 等跨平台协议开发时用 WSL2 + 远程调试,部署时单文件拷贝。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 878

国产工控机上C#上位机真实案例汇总

优先选择 .NET 8 AOT 单文件发布→ 体积小、启动快、无依赖,龙芯/飞腾/鲲鹏/兆芯均可直接运行。通信一律源码编译或找国产替代→ S7.NetPlus、NModbus4、OPC UA基金会、MQTTnet 在 ARM64/LoongArch 上基本都能编译通过,耗时1–2天。串口、CAN、GPIO等底层交互必须封装跨平台层→ 写 PlatformHelper + 条件编译,Windows用COMx,Linux用/dev/ttySx。UI框架选Avalonia(最稳)

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 790

全国产硬件通信平台:工业自动化多协议集成与实时性优化实践

在工业自动化与物联网领域,通信协议是实现设备互联与数据交换的核心技术基础。从原理层面看,通信协议定义了设备间数据传输的格式、时序与规则,其稳定性实时性直接决定了控制系统的可靠性。在技术价值上,多协议兼容与转换能力是构建异构设备网络的关键,尤其在当前强调自主可控的背景下,基于国产硬件平台(如龙芯、飞腾等CPU)的通信中间件成为保障供应链安全与长期技术发展的战略选择。应用场景广泛覆盖智能制造、边缘计算等对实时性要求苛刻的领域,例如在EtherCAT主站优化中,通过CPU亲性绑定与内核实时化,可将通信周期稳定

weixin_34166472的博客 352
上一篇: 【龙芯1c库】封装串口接口和使用示例
下一篇: 在龙芯1c单片机上获取MPU6050的原始数据
勤为本
博客等级 码龄15年 215粉丝 60原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值