本篇文章介绍一下stm32F103C8T6的can总线通信实验

需要两块stm32F103C8T6板子

can通信主要是用于两块板子之间的通信,简而言之就是用一块板子发指令,另一块板子接收指令并发出动作。之前搜索了好多例程,但是应用于stm32F103C8T6的例程很少,所以决定写一篇博客,也算是记录一下自己的学习过程。本人第一次写博客,如有错误,欢迎在评论区指出。话不多说,下面是我的发送端stm32的main.c的程序。

发送端的main.c

#include "stm32f10x.h"
#include "can.h"
#include "led.h"
#include "delay.h"
#include "oled.h"
#include "ds18b20.h"
int main(void)
{   u8 Buff[8];u8 ShowBuff[8];int Temp=0;int Count=0;SystemInit(); //设置系统时钟为72MLED_GPIO_Config();//LED管脚初始化CAN_GPIO_Config();//CAN管脚初始化CAN_NVIC_Configuration(); //CAN中断初始化   CAN_INIT();//CAN模块初始化   delay_init();DS18B20_Init();delay_ms(500);Temp=DS18B20_Get_Temp();while(1){Temp=DS18B20_Get_Temp();/*ShowBuff[0]='Y';if(Temp>=0){ShowBuff[1]='+';}else{Temp=-Temp;                    //数据转为正数ShowBuff[1]='-';//变为负号}ShowBuff[2]=Temp/100+'0';ShowBuff[3]=Temp%100/10+'0';ShowBuff[4]='.';ShowBuff[5]=Temp%100%10+'0';ShowBuff[6]='L';*/          ShowBuff[0]='Y';ShowBuff[1]='9';ShowBuff[2]='7';ShowBuff[3]='8';ShowBuff[4]='6';ShowBuff[5]='1';ShowBuff[6]='L';Can_TxByte(ShowBuff,7);LEDx=~LEDx;delay_ms(500);}
}
  1. 定义一个ShowBuff数组 ,用来储存要发送的字节。例程本来是采用DS18B20做数据采集的传感器,这里为了测试是否可以通信,随意写了一段,发送“97861”,看看在另一块板子上是否可以显示;
  2. 用库函数**Can_TxByte(ShowBuff,7);**发送ShowBuff数组中的东西;

下面是can.c

定义了CAN_GPIO_Config();//CAN管脚初始化
CAN_NVIC_Configuration(); //CAN中断初始化
Can_TxByte(ShowBuff,7)几个库函数。

#include "can.h"
#include "led.h"
#include "stdio.h"typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;/* 在中断处理函数中返回 */
__IO uint32_t ret = 0;volatile TestStatus TestRx;  /*CAN RX0 中断优先级配置  */void CAN_NVIC_Configuration(void)
{NVIC_InitTypeDef NVIC_InitStructure;/* Configure the NVIC Preemption Priority Bits */  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);#ifdef  VECT_TAB_RAM  /* Set the Vector Table base location at 0x20000000 */ NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); #else  /* VECT_TAB_FLASH  *//* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   #endif/* enabling interrupt */NVIC_InitStructure.NVIC_IRQChannel=USB_LP_CAN1_RX0_IRQn;;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}/*CAN GPIO 和时钟配置 */void CAN_GPIO_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure; /* 复用功能和GPIOB端口时钟使能*/  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB, ENABLE);                                                                         /* CAN1 模块时钟使能 */RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); /* Configure CAN pin: RX */   // PB8GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  // 上拉输入GPIO_Init(GPIOB, &GPIO_InitStructure);/* Configure CAN pin: TX */   // PB9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出GPIO_Init(GPIOB, &GPIO_InitStructure);//#define GPIO_Remap_CAN    GPIO_Remap1_CAN1 本实验没有用到重映射I/OGPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE);
}/* CAN初始化 */void CAN_INIT(void)
{CAN_InitTypeDef        CAN_InitStructure;CAN_FilterInitTypeDef  CAN_FilterInitStructure;CanTxMsg TxMessage;  /* CAN register init */CAN_DeInit(CAN1);  //将外设CAN的全部寄存器重设为缺省值CAN_StructInit(&CAN_InitStructure);//把CAN_InitStruct中的每一个参数按缺省值填入/* CAN cell init */CAN_InitStructure.CAN_TTCM=DISABLE;//没有使能时间触发模式CAN_InitStructure.CAN_ABOM=DISABLE;//没有使能自动离线管理CAN_InitStructure.CAN_AWUM=DISABLE;//没有使能自动唤醒模式CAN_InitStructure.CAN_NART=DISABLE;//没有使能非自动重传模式CAN_InitStructure.CAN_RFLM=DISABLE;//没有使能接收FIFO锁定模式CAN_InitStructure.CAN_TXFP=DISABLE;//没有使能发送FIFO优先级CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;//CAN设置为正常模式CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; //重新同步跳跃宽度1个时间单位CAN_InitStructure.CAN_BS1=CAN_BS1_3tq; //时间段1为3个时间单位CAN_InitStructure.CAN_BS2=CAN_BS2_2tq; //时间段2为2个时间单位CAN_InitStructure.CAN_Prescaler=60;  //时间单位长度为60 CAN_Init(CAN1,&CAN_InitStructure);//波特率为:72M/2/60(1+3+2)=0.1 即100K/* CAN filter init */CAN_FilterInitStructure.CAN_FilterNumber=1;//指定过滤器为1CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//指定过滤器为标识符屏蔽位模式CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;//过滤器位宽为32位CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;// 过滤器标识符的高16位值CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;//     过滤器标识符的低16位值CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//过滤器屏蔽标识符的高16位值CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;//    过滤器屏蔽标识符的低16位值CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;// 设定了指向过滤器的FIFO为0CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;// 使能过滤器CAN_FilterInit(&CAN_FilterInitStructure);//    按上面的参数初始化过滤器/* CAN FIFO0 message pending interrupt enable */ CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE); //使能FIFO0消息挂号中断}
/* 发送两个字节的数据*/
void can_tx(u8 Data1,u8 Data2)
{ CanTxMsg TxMessage;  TxMessage.StdId=0x00;   //标准标识符为0x00TxMessage.ExtId=0x0000; //扩展标识符0x0000TxMessage.IDE=CAN_ID_EXT;//使用标准标识符TxMessage.RTR=CAN_RTR_DATA;//为数据帧TxMessage.DLC=2;    //  消息的数据长度为2个字节TxMessage.Data[0]=Data1; //第一个字节数据TxMessage.Data[1]=Data2; //第二个字节数据 CAN_Transmit(CAN1,&TxMessage); //发送数据}void Can_TxByte(u8 *Data,u8 len)
{ int ix=0;CanTxMsg TxMessage;  TxMessage.StdId=0x00; //标准标识符为0x00TxMessage.ExtId=0x0000; //扩展标识符0x0000TxMessage.IDE=CAN_ID_EXT;//使用标准标识符TxMessage.RTR=CAN_RTR_DATA;//为数据帧TxMessage.DLC=len;  //  消息的数据长度为2个字节
//  TxMessage.Data[0]=Data1; //第一个字节数据
//  TxMessage.Data[1]=Data2; //第二个字节数据 for(ix=0;ix<len;ix++)TxMessage.Data[ix]=Data[ix];CAN_Transmit(CAN1,&TxMessage); //发送数据}/* USB中断和CAN接收中断服务程序,USB跟CAN公用I/O,这里只用到CAN的中断。 */
void USB_LP_CAN1_RX0_IRQHandler(void)
{int ix=0;CanRxMsg RxMessage;RxMessage.StdId=0x00;RxMessage.ExtId=0x00;RxMessage.IDE=0;RxMessage.DLC=0;RxMessage.FMI=0;RxMessage.Data[0]=0x00;RxMessage.Data[1]=0x00;    for(ix=0;ix<8;ix++)RxMessage.Data[ix]=0;              CAN_Receive(CAN1,CAN_FIFO0, &RxMessage); //接收FIFO0中的数据  if((RxMessage.Data[0]==0x99)&&(RxMessage.Data[1]==0xbb))   { LED1(0);LED2(1);}if((RxMessage.Data[0]==0x55)&&(RxMessage.Data[1]==0x77))   { LED1(1);LED2(0);}}

显示屏端的main.c

#include "stm32f10x.h"
#include "can.h"
#include "led.h"
#include "delay.h"
#include "oled.h"
#include "stdio.h"void Show_log(void)
{OLED_ShowCHinese(27,2,0);OLED_ShowCHinese(45,2,1);OLED_ShowCHinese(63,2,2);OLED_ShowCHinese(81,2,3);//显示"当前温度"几个字OLED_ShowCHinese(81,4,5);//显示 ℃}int main(void)
{   int Tmep=0;char ShowBuff[8]={0};SystemInit(); //设置系统时钟为72MLED_GPIO_Config();//LED管脚初始化CAN_GPIO_Config();//CAN管脚初始化CAN_NVIC_Configuration(); //CAN中断初始化   CAN_INIT();//CAN模块初始化    delay_init();OLED_Init();OLED_Clear();Show_log();while(1){if(Can_RxBuff[0]=='Y'&&Can_RxBuff[6]=='L')//接收到有效数据 {ShowBuff[0]=Can_RxBuff[1];//提取有效数据 ShowBuff[1]=Can_RxBuff[2];ShowBuff[2]=Can_RxBuff[3];ShowBuff[3]=Can_RxBuff[4];ShowBuff[4]=Can_RxBuff[5];OLED_ShowString(36,4,(u8*)ShowBuff,16);//显示当前值 Can_RxBuff[0]=0;Can_RxBuff[6]=0;}SystemInit();  // 配置系统时钟为72M   LED_GPIO_Config(); //LED 端口初始化 LED1( OFF );           // 亮delay_ms(5000);LED1( ON );          // 灭}
}
  1. 显示屏端STM32板子采用ShowBuff做临时数组,当Can_RxBuff[]中接收到以"Y"开头"L"结尾的数据时,认为是有效数据,并放入临时数组ShowBuff中;
    4.用函数OLED_ShowString(36,4,(u8*)ShowBuff,16);将值显示在显示屏端STM32的显示屏上。

stm32F103C8T6的can总线通信实验相关推荐

  1. STM32F103标准库开发----CAN总线通信实验----发送和接收

    STM32F103标准库开发----目录 STM32F103标准库开发----CAN总线通信实验----基本原理 STM32F103标准库开发----CAN总线通信实验----初始化/波特率 STM3 ...

  2. 【iCore4 双核心板_FPGA】例程十一:FSMC总线通信实验——独立地址模式

    实验原理: STM32F767上自带FMC控制器,本实验将通过FMC总线的地址独立模式实现STM32与FPGA 之间通信,FPGA内部建立RAM块,FPGA桥接STM32和RAM块,本实验通过FSMC ...

  3. 米联客 ZYNQ/SOC精品教程 S02-CH13 CAN总线通信实验

    软件版本:VIVADO2017.4 操作系统:WIN10 64bit 硬件平台:适用米联客 ZYNQ系列开发板 米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!! ...

  4. windows通信端口初始化失败_STM32实例——USART串口通信实验(二)

    USART 串口通信配置步骤 在上面的介绍中,可能有的朋友很不理解,不过没有关系,下面我们讲解如何使用库函数对 USART 进行配置.这个也是在编写程序中必须要了解的.具体步骤如下:(USART 相关 ...

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

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

  6. CAN总线通信原理分析

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

  7. 英飞凌-AURIX-TC3XX 片上总线通信架构

    目录 1.英飞凌-AURIX-TC3XX 片上总线通信架构 1.1.SRI-系统资源互连结构 1.1.1.SRI简介 1.1.2.SRI 的特征: 1.1.3.SRI 结构相比于前一代产品主要的区别: ...

  8. 【正点原子FPGA连载】 第十七章 RS485串口通信实验 -摘自【正点原子】领航者ZYNQ之FPGA开发指南_V2.0

    1)实验平台:正点原子领航者ZYNQ开发板 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手册+视频下 ...

  9. 【正点原子FPGA连载】第十四章 串口通信实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...

最新文章

  1. 需要恢复中断状态的一个场景
  2. oracle列名无效字符,案例学习Oracle错误:ORA-00904 invalid column name
  3. 计算机老师用英语应聘,应聘计算机教师个人自荐书(精选6篇)
  4. svm分类代码_当支持向量机遇上神经网络:SVM、GAN距离之间的关系
  5. 1105 Spiral Matrix (25 分)【难度: 一般 / 知识点: 模拟】
  6. 【转】两种方法教你在Ubuntu下轻松关闭触摸板(TinkPad)
  7. 利用一维数组输出杨辉三角
  8. 黑客专用Linux发行版Kali Linux发布滚动更新版2016.1
  9. Flutter项目实战教程分享、基础使用、性能优化、每日积累
  10. jQuery easing 使用方法
  11. FLEX4 在组件中自定义ToolTip样式
  12. linux中vsftpd登陆慢卡问题解决方法
  13. 计算机管理器磁盘清理,win10 磁盘空间清理管理器已停止工作怎么解决
  14. Node.js升级或降低版本
  15. Qt QPushButton水晶按钮样式例子
  16. vue3运行npm run serve报错ERROR Error: Cannot find module ‘babel-plugin-import‘ Require stack:
  17. 攻防世界_mobil_app1
  18. v-for 循环中数据更新子组件视图不更新解决方案
  19. 理解浏览器的多线程,JavaScript的单线程
  20. SQL2000重新装,有文件挂起

热门文章

  1. 【方法分享】通过抓包下载钉钉直播回放(附文中提到的文件)
  2. AcWing 2983. 玩具
  3. java计算机毕业设计中小学教务管理平台源码+mysql数据库+系统+部署+lw文档
  4. 怎么给电话手表安上Android,电话手表安卓版
  5. c++ set unordered_set区别
  6. 使用dw制作登录界面
  7. MP4封装格式详解1
  8. 计算机组成原理实验报告范文,计组实验报告
  9. 双边滤波(Bilateral filter)原理介绍及matlab程序实现
  10. 超1亿人朋友圈“仅三天可见”,背后的真相竟如此残酷