STM32-Arduino编程 CAN总线通信

  • 环境说明
  • 使用Arduino开发STM32原因
  • 直接开始操作

环境说明

开发软件:vscode+PlatformIO
操作系统:win10
开发板:STM32F103C8T6
CAN总线通信模块:TJA1050

使用Arduino开发STM32原因

STM32开发比较常用的软件有Keil和STM32Cube,但是用过的同学都应该发现这两款软件对于新手不怎么友好,需要花费很长的时间才能做到入门。特别是在开发一些比较复杂的程序时,比如植入freertos,安排几个任务,能把人给折磨死。与Keil和STM32Cube相同的的是,STM32-Arduino也是采用的库函数开发,并不存在低人一等的说法。当然需要承认的是相比于寄存器开发的程序还是要差一点的。STM32-Arduino在库函数得到基础上进一步的封装,可以大大的降低程序中出现的配置出错的问题,让新手的同学可以更快的开发出高质量的STM32的程序。

直接开始操作

首先打开platformIO,创建工程。

工程名称随便,要设定好对应的开发板。我这里使用的是开发板STM32F103C8T6,至于为什么要用这个开发板,主要是因为穷。如果需要使用其他的板子,在创建工程时设定好对应的板子即可。

工程创建好之后,在Libraries中搜索TJA1050,便可以找到eXoCAN库,将其加入到STM32CAN的工程中。

eXoCAN的库中找到example文件夹中找到例程,将其中一个例程复制到main.cpp中,我复制的是bpCanBlink.ino中的例程。加入串口通信的程序将CAN总线通信的信息通过串口输出出来,最终程序如下。

#include <Arduino.h>/* bpCanBlink.ino                                                                     4/24/20C:\Users\jhe\Documents\PlatformIO\mySTM32LIBS\eXoCAN\bpCanBlink.cppThis simple example requires two STM32f103 boards.  One of the boards is loadedwith the 'frame' using txMsg = 0x069.  The second board gets loaded with the secondframe where tsMsgID = 0x005 by uncommenting that section.On each board connect CAN default RX and TX pins(11,12) together.  Then connectthe boards together: +5V, Gnd., and Can TX/RX.When a board receives a CAN message it toggles its LED.  One board sends a messageevery second and the other every five seconds.RAM:   904 bytes Flash: 12988 bytes  working                                                                            4/25*/
#include <arduino.h>
#include <eXoCAN.h>#define bluePillLED PC13int txMsgID = 0x069;
uint8_t txData[8]{0x00, 0x01, 0x23, 0x45, 0xab, 0xcd, 0xef, 0xff};
uint8_t txDataLen = 8;
uint32_t txDly = 5000; // mSecint id, fltIdx;
uint8_t rxbytes[8];
eXoCAN can;void setup()
{Serial.begin(115200);can.begin(STD_ID_LEN, BR250K, PORTA_11_12_WIRE_PULLUP); // 11b IDs, 250k bit rate, no transceiver chip, portA pins 11,12can.filterMask16Init(0, 0, 0x7ff, 0, 0);                // filter bank 0, filter 0: don't pass any, flt 1: pass all msgspinMode(bluePillLED, OUTPUT);
}uint32_t last = 0;
void loop()
{if (millis() / txDly != last)             // tx every txDly{last = millis() / txDly;can.transmit(txMsgID, txData, txDataLen);}if (can.receive(id, fltIdx, rxbytes) > -1) // poll for rx{digitalToggle(bluePillLED);Serial.println(id);}}

测试硬件,两单片机的程序相同,其中TJA1050的RX接PA11,TX接PA12,不要想当然的把TJA1050接到一般的串口上。

测试结果,可见串口接收的程序将CAN总线通信的Id打印出来,而发送的Id为0x069,转成10进制便是105,与串口打印的结果一致。

下面说一下感受,CAN总线通信相比于串口通信和SPi通信是具有明显的优势的,其在构建网络的过程中不需要一个主机来进行数据的交换,但发送的数据是共享的容易出现信息的泄露。所以使用前综合考虑它的利弊。

STM32-Arduino编程 CAN总线通信相关推荐

  1. STM32+MCP2515多路CAN总线通信电路板(三路、四路、五路)

    基于STM32的多路CAN总线通信软件程序和硬件设计 STM32F407自带两路CAN,按照客户要求,需要定制一款5路CAN的电路板,选择三片MCP2515另外扩展出三路CAN通信电路,实测五路CAN ...

  2. STM32自学笔记-7-CAN总线通信

    STM32F103有1个CAN控制器,可以配合逻辑分析仪来测试CAN和PC的通信.在此之前先学习一下CAN的基础知识. CAN 控制器根据两根线上的电位差来判断总线电平.总线电平分为显性电平(0),C ...

  3. STM32 CAN总线通信学习笔记(一)

    STM32 CAN总线通信学习笔记(一) 一.CAN总线简介 CAN 是控制器局域网络(Controller Area Network, CAN)的简称.CAN采用数据块编码的方式,数据块根据帧的类型 ...

  4. 基于STM32的CAN总线通信学习笔记

    转自:https://blog.csdn.net/ludaoyi88/article/details/53350077 基于STM32的CAN总线通信学习笔记 本文主要简单介绍CAN总线的相关概念,以 ...

  5. 第十四篇,STM32的CAN总线通信

    1.CAN总线的概念 CAN指的是控制器局域网网络(Controller Area Network),由德国博世汽车电子厂商开发出来. CAN使用差分信号,具有较强的抗干扰能力和传输稳定性 CAN属于 ...

  6. 三菱FX5U系列PLC使用FX5-CCL-MS模块无需编程即可实现CC-Link总线通信的具体步骤

    三菱FX5U系列PLC使用FX5-CCL-MS模块无需编程即可实现CC-Link总线通信的具体步骤 以前FX3U系列的PLC使用CC-LINK组网通信时还要编写程序,这样的话使用起来不是太方便,而现在 ...

  7. 基于串口助手的STM32与计算机进行串口通信

    基于串口助手的STM32与计算机进行串口通信 序 言 一. 串口通信概述 二.项目说明 三.实战过程 1)实现stm32向上位机发送字符 2)实现stm32发和收 3)Keil中针对stm32系统进行 ...

  8. python can总线_MicroPython教程之TPYBoard v102 CAN总线通信

    原标题:MicroPython教程之TPYBoard v102 CAN总线通信 0x00前言 CAN是控制器局域网络(ControllerAreaNetwork,CAN)的简称,是ISO国际标准化的串 ...

  9. CAN总线通信原理分析

    摘要:介绍了控制器局域网总线(CAN总线)的应用特性以及将其应用于具体的工程项目时CAN总线系统的分层结构及各层的主要功能.基于CAN总线系统结构构成,通过工程实践的具体应用以及对CAN控制器及收发器 ...

最新文章

  1. C++实现int与string之间的相互转换
  2. DFS:图的联通块 AOJ-0118 Property Distribution
  3. 查表法的CRC8和CRC16程序
  4. java 函数参数 返回值_java中如何用函数返回值作为post提交的参数?
  5. 利用python同步windows和linux文件
  6. 计算机对英语口语考试成绩,英语口语考试人机对话得分技巧
  7. MySQL小误区:关于set global sql_slave_skip_counter=N 命令的一些点
  8. [Windows驱动开发](四)内存管理
  9. 剑指 Offer 10- I. 斐波那契数列 (从重叠子问题到备忘录到dp数组迭代解法)
  10. Linux如何搭建服务器eb,Linux下CRMEB环境搭建
  11. Spring 集成 mybatisPlus
  12. 黑客高手是这样上网的!Vimer是如何用快捷键浏览网页的?
  13. Java:一步步带你深入了解神秘的Java反射机制
  14. vue 后台翻译_vue - 实战项目 - 在线翻译
  15. 鸡兔同笼:35个头,94只脚,问鸡、兔各多少只?
  16. TDTX云笔记--TDTX个人简历
  17. 3.字体样式,分隔线与段落
  18. 两个自然数互素(relatively prime)
  19. 任务调度:开源大数据调度框架Taier(太阿)
  20. 正态分布某一点的概率怎么算_统计基础篇之十三:怎么理解正态分布(二)

热门文章

  1. 51单片机(四)定时器中断(+数码管——24小时制钟表)
  2. 如何使用Tensorboard一张图显示多条曲线
  3. Android 代理自动配置PAC研究
  4. PD快充协议诱骗芯片XSP01 支持 iPhone无线充电9V或12V
  5. 孙荣辛|大数据穿针引线进阶必看——Google经典大数据知识
  6. H桥驱动芯片TLE7182EM 故障分析小结
  7. 多级放大电路具体学习
  8. 计算机网络【UDP与TCP协议(三次握手、四次挥手)】
  9. Python小白的进阶之路---Day2
  10. 财务管理基础 第13章 实物期权和资本预算中的其他课题