玩转X-CTR100 l STM32F4 l CAN通信-程序员宅基地

技术标签: 人工智能  嵌入式  

我造轮子,你造车,创客一起造起来!塔克创新资讯【塔克社区 www.xtark.cn 】【塔克博客 www.cnblogs.com/xtark/

X-CTR100控制器STM32F4处理器内置CAN控制器,实现CAN通信功能,需要外扩CAN接口模块,本例程使用NXP的JTA1050模块。

原理

CAN 是Controller Area Network 的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。在汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很多,线束的数量也随之增加。为适应"减少线束的数量"、"通过多个LAN,进行大量数据的高速通信"的需要,1986 年德国电气商博世公司开发出面向汽车的CAN 通信协议。此后,CAN 通过ISO11898 及ISO11519 进行了标准化,在欧洲已是汽车网络的标准协议。

CAN 的高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。现场总线是当今自动化领域技术发展的热点之一,被誉为自动化领域的计算机局域网。它的出现为分布式控制系统实现各节点之间实时、可靠的数据通信提供了强有力的技术支持。关于CAN协议详细介绍,请参考资料文件夹相关文档。

X-CTR100控制器STM32F4处理器内置CAN控制器,支持 CAN 协议 2.0A 和 2.0B,特性如下。

  • 支持 CAN 协议 2.0A 和 2.0B 主动模式
  • 波特率 最高达 1Mbps 1Mbps
  • 支持时间触发通信
  • 具有 3个发送邮箱 个发送邮箱
  • 具有 3级深度的 级深度的 2个接收 个接收 FIFO
  • 可变的过滤器组( 28 个)

STM42F4内部CAN框图。

使用CAN功能,需要增加CAN通信接口芯片,本文使用TJA1050,该芯片兼容PCA82C250。

例程

使用CAN接口模块TJA1050进行CAN通信操作,实现了数据循环发送和数据接收显示功能,可通过2块X-CTR100控制器通信,或者使用1块X-CTR100和CAN分析仪通信,本例程以2套X-CTR100通信为例进行说明。

硬件说明

硬件资源:

  • 串口UART1
  • LED灯
  • CAN扩展接口(LH)
  • CAN接口模块TJA1050(需自备)

连接关系如图所示

连接实物图

软件生态

X-SOFT软件生态,X-API扩展文件如下。

ax_can.c—— CAN通信源文件

ax_can.h——CAN通信接口头文件

接口函数

void AX_CAN1_Init(uint8_t tsjw,uint8_t tbs2,uint8_t tbs1,uint16_t brp,uint8_t mode); //CAN1初始化

uint8_t AX_CAN1_SendMsg(uint8_t* msg,uint8_t num); //CAN1发送数据

uint8_t AX_CAN1_ReceiveMsg(uint8_t *msg); //CAN1接收数据

特殊说明,1.8固件 PLL_N 默认为360,通信时频率错误,之前固件版本为336,改为336后,通信正常。

修改位置为,system_stm32f4xx.c,400行位置。

#if defined (STM32F40_41xxx)

#define PLL_N 336 //360

/* SYSCLK = PLL_VCO / PLL_P */

#define PLL_P 2

#endif /* STM32F40_41xxx */

例程代码主要包括两部分,主程序负责数据定时发送,CAN接收中断负责数据接收和显示。

CAN1接收中断程序代码如下。

//中断服务函数            

void CAN1_RX0_IRQHandler(void)

{

    CanRxMsg RxMessage;

    uint8_t i=0;

    

CAN_Receive(CAN1, 0, &RxMessage);

    

    printf("RX");    

    

    for(i=0;i<8;i++)

    printf("%d ",RxMessage.Data[i]);

    

    printf("\r\n");    

    

}

软件说明

主程序代码如下。

int main(void)

{    

    u8 i=0;

    u8 canbuf[8];

    u8 res;

    

    //XRT1初始化

    AX_Init(115200);

    printf("***X-CTR100 CAN通信例程***\r\n\r\n");    

 

    //CAN初始化,正常模式,波特率500Kbps

    AX_CAN1_Init(CAN_SJW_1tq,CAN_BS2_6tq,CAN_BS1_7tq,6,CAN_Mode_Normal);

    

    //设置CAN接收中断

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2    

    NVIC_Config();

    

    //初始化发送数据

    for(i=0;i<8;i++)

    {

        canbuf[i] = 0; //填充发送缓冲区

    }

    

    while (1)

    {

        canbuf[0]++;

        

        res=AX_CAN1_SendMsg(canbuf,8);//发送8个字节

        

        AX_Delayms(100);

        AX_LEDG_Toggle();

    }

}

为了显示每帧数据差异,发送的第一个字节进行加1操作。

实现效果

两个X-CTR100控制器互相发送接收,打开串口助手即可查看接收的数据。

转载于:https://www.cnblogs.com/xtark/p/9252141.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34121282/article/details/94705227

智能推荐

动态可订制属性的 PropertyGrid-程序员宅基地

文章转载,原文来自:http://blog.csdn.net/akron/article/details/2750566在VB6, VC++, C#.net 里都可以见到一个属性设计器,用来编辑修改 object 的属性。C# 下提供了一个属性设计器 PropertyGrid, 其使用极其简单,只要 grid.SelectedObject = myOjbect;

token工具类-程序员宅基地

token工具类内置解析token方法public class JwtUtils { //签名密钥 private static String key = "userlogin"; //签名失效时间// private static Long failureTime = Long.valueOf(604800000); /** * 设置认证token * * @Author: * @Date: 10:10 2020/12_token工具类

OpenGL知识点汇总-程序员宅基地

博客转自:https://blog.csdn.net/ShareUs/article/details/80007236openGL中文版- https://learnopengl-cn.readthedocs.io/zh/latest/OpenGL各版本的规范和扩展。- https://www.khronos.org/registry/OpenGL/index_gl.phpOpenGL3....

暴力求解系列之简单枚举-程序员宅基地

来自刘汝佳的《算法竞赛入门经典(第二版)》,下面实现代码均为Java简单枚举问题1:  输入正整数nnn, 按从小到大的顺序输出所有形如abcde/fghij=nabcde/fghij = nabcde/fghij=n的表达式, 其中a~ja~ ja~j恰好为数字0~90~ 90~9的一个排列(可以有前导0),其中2≤n≤792≤n≤792≤n≤79解题思路:直接枚举所有0~90~ 9...

python怎么调用类中的函数_类中的python函数调用-程序员宅基地

通过阅读您的评论,您的实际问题似乎是:您有一个方法可以打印一些输出。如果用户调用代码,那么您希望将输出打印到终端。如果代码由另一个方法在内部调用,则不希望输出被打印。在@mgilson建议的debug参数是一个不错的选择,但是您希望用户不知道这个选项,无论出于什么原因。在另一种方法是在函数调用期间创建一个函数包装器来重定向stdout,然后再恢复它。像这样:import osimport sysd...

学习参考《零基础入门学习Python》电子书PDF+笔记+课后题及答案-程序员宅基地

国内编写的关于python入门的书,初学者可以看看。参考:《零基础入门学习Python》电子书PDF+笔记+课后题及答案Python3入门必备;小甲鱼手把手教授Python;包含电子书PDF和笔记资料。网盘下载:http://106.13.73.98转载于:https://www.cnblogs.com/zyk01/p/10975426.html..._零基础入门学python实战答案

随便推点

SQL应用·:用SQL分析供应商营业额_多供方分析报表.sql-程序员宅基地

实战案例:重点掌握如何细化分析目标以及如何拆解案例的问题学习目标:掌握复杂问题逐步拆解的思维和能力,让解题思路有迹可循模拟真实工作案例,让数据分析真正落地、有效分析目的:了解合作的供应商产品的销售情况提高采购效率,增进与大供应商的合作关系增加公司销售额与利润分析指标:供应商的商品总营业额总销售额越高,供应商的规模越大问题驱动:找出总销售额最高的10个供应商信息..._多供方分析报表.sql

Python机器学习:Scikit-learn和TensorFlow的应用和模型设计_tensorflow和scikitlearn-程序员宅基地

本文介绍了Python机器学习中的一些常用算法和技术,包括Scikit-learn和TensorFlow的应用、数据预处理、模型训练和评估、模型设计等。Scikit-learn和TensorFlow是Python中应用最广泛的两个机器学习库,它们提供了丰富的机器学习算法和工具,帮助开发人员轻松地构建和训练机器学习模型。数据增强是一种通过对原始数据进行一系列变换来生成新的训练数据的方法,它可以扩充数据集的规模,从而提高模型的性能。一个好的模型可以提高算法的性能,而一个不好的模型则会影响算法的表现。_tensorflow和scikitlearn

HDU1237-简单计算器-程序员宅基地

简单计算器 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)

揭秘数极客Android无埋点数据采集原理_无埋点采集是怎么实现的-程序员宅基地

采集数据柯林斯基本分为代码埋点状语从句:无埋点。近年来无埋点的数据采集方案越来越普及,而无埋点的实现方案也有多种,我们今天讨论的问题是数据采集的一种方案,是无需开发人员重复进行采集事件的代码埋点就能达到采集客户端所需数据的解决方案,也就是无埋点数据采集方案。介绍无埋点数据采集方案之前,需要大家对以下几个知识点非常了解:1. view的事件分发机制2.使用gradle编译And..._无埋点采集是怎么实现的

当ORACLE归档日志满后如何正确删除归档日志-程序员宅基地

当ORACLE 归档日志满了后,将无法正常登入ORACLE,需要删除一部分归档日志才能正常登入ORACLE。一、首先删除归档日志物理文件,归档日志一般都是位于archive目录下,AIX系统下文件格式为“1_17884_667758186.dbf”,建议操作前先对数据库进行备份,删除时至少保留最近几天的日志用于数据库恢复。二、把归档日志的物理文件删除后,我们就可以正常登入ORACL

c或c++的数组和二维数组_c++二维数组后移一位实验报告-程序员宅基地

数组名细节: 1)数组首元素的地址和数组地址是两个不同的概念 2)数组名代表数组首元素的地址,它是个常量。 解释如下:变量本质是内存空间的别名,一定义数组,就分配内存,内存就固定了。所以数组名起名以后就不能被修改了。 3)数组首元素的地址和数组的地址值相等 4、怎么样得到整个一维数组的地址?C语言规定:Int a[10];printf(“得到整个数组的地址a: %d ..._c++二维数组后移一位实验报告

推荐文章

热门文章

相关标签