北京赛车pk10开奖

STM32-F407 CAN的双机通讯

2019-09-30来源: eefocus关键字:STM32-F407  CAN  双机通讯

直奔主题,我是在原子哥F407例程的基础上想实现双机CAN通讯

我用的核心板为STM32-F407ZGT6,原理图上看到PA11、PA12引脚可以复用为CAN1_RX和CAN1_TX,在与CAN收发器接线时不要接错,PA11与收发器TXD相连,PA12与收发器RXD相连。收发器建议用HVP230,可以用板子3.3V供电;TJA1050也可以,不过需要5V供电,这点需要注意。


CAN的初始化:


u8 CAN1_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)

{

 

  GPIO_InitTypeDef       GPIO_InitStructure; 

CAN_InitTypeDef        CAN_InitStructure;

  CAN_FilterInitTypeDef  CAN_FilterInitStructure;

    //时钟使能

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//PORTA时钟使能                   

 

北京赛车pk10开奖  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//CAN1时钟使能

    //GPIO初始化

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11| GPIO_Pin_12;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能

        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz

        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉

        GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化PA11,PA12

//CAN引脚复用

        GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_CAN1);   

        GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_CAN1);

  

北京赛车pk10开奖  //CAN单元设置

    CAN_InitStructure.CAN_TTCM=DISABLE;

  CAN_InitStructure.CAN_ABOM=DISABLE;   

  CAN_InitStructure.CAN_AWUM=DISABLE;

  CAN_InitStructure。CAN_NART=ENABLE;

  CAN_InitStructure.CAN_RFLM=DISABLE;

  CAN_InitStructure。CAN_TXFP=DISABLE;

  CAN_InitStructure.CAN_Mode= mode; //CAN模式设置

  CAN_InitStructure。CAN_SJW=tsjw;

  CAN_InitStructure。CAN_BS1=tbs1;

北京赛车pk10开奖  CAN_InitStructure.CAN_BS2=tbs2;

  CAN_InitStructure。CAN_Prescaler=brp; 

  CAN_Init(CAN1, &CAN_InitStructure);   // 初始化CAN1

    

//配置过滤器

  CAN_FilterInitStructure.CAN_FilterNumber=0;  

  CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; 

  CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; 

  CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;

  CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;

  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32位MASK

  CAN_FilterInitStructure。CAN_FilterMaskIdLow=0x0000;

    CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;

  CAN_FilterInitStructure。CAN_FilterActivation=ENABLE; //激活过滤器

  CAN_FilterInit(&CAN_FilterInitStructure);//过滤器初始化,此处设置接收所有报文

 

CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0消息挂号中断允许     

  

  NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     // 主优先级为1

  NVIC_InitStructure。NVIC_IRQChannelSubPriority = 0;            // 次优先级为0

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

return 0;

}   

北京赛车pk10开奖中断处理函数为: 


void CAN1_RX0_IRQHandler(void)

{

  CanRxMsg RxMessage;

int i=0;

        CAN_Receive(CAN1, 0, &RxMessage);

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

北京赛车pk10开奖 printf("DATA[%d]:%drn",i,RxMessage.Data[i]);

LED1=!LED1;

}

发送函数就根据自己的需求设置ID,数据等,此处不表,例程里都有。


重点:主函数中两个板子的模式初始化不同!!!


CAN1_Mode_Init(CAN_SJW_1tq,CAN_BS2_6tq,CAN_BS1_7tq,6,Mode);

CAN1模式初始化中,前4位设置总线波特率为500Kbps,重点在于最后的Mode。原子哥例程和我看到的其他例程相同,都是可以选择自发自收或者普通模式。实际操作程序下到两块板子里,检查各自报文的自发自收也确实没有问题,但就是不能互相通讯。


查看STM32F4中文参考手册,CAN_Mode可以设置为静默、环回、环回与静默组合、正常模式。于是试着将其中一块板子的CAN模式改为静默模式(即只接收而不发送),另一块仍然是正常模式,结果接收消息没有问题!


泪流满面,仰天长啸啊,折腾了几天的问题原来这么简单。细细思考,自己一开始就没有仔细想过CAN报文ID冲突的问题,一套例程下到两块板子里,同时发送相同ID的CAN报文,总线上的仲裁机制失效,当然就不能够正常通讯了。如果想要实现两块板子的互发互收,就要设置不同ID的CAN报文。


以此为鉴,以后对待别人的东西,不仅要会用,还要能懂,最重要的是实践。否则就会像上文这样,因为小细节耽误很长时间。

关键字:STM32-F407  CAN  双机通讯 编辑:什么鱼 引用地址:http://news.2689mr.com/mcu/ic476227.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:关于由CubeMx 生成stm32f4+freertos,不正常分析之堆栈大小设置
下一篇:STM32的CAN总线的接收双FIFO使用方法

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

stm32f103串口1串口2收发程序
#include "stm32f10x.h"  #include "string.h"#include "stdio.h"  void delay(void);  void GPIO_Configuration(void); void uart_init();extern void USART_OUT(USART_TypeDef* USARTx, uint16_t *Data,...);void RCC_Configuration(void)  { &nbs
发表于 2019-10-23
stm32f103之串口实验
stm32f103之串口实验,串口相互通讯即用同一个单片机的串口1与串口3相互通讯串口1,串口3都接到电脑上,选上”Use MicroLIB”这是KEIL自带的一个简易的库,例如你用printf函数的时候,就会从串口1 输出字符串,直接默认定向到串口1。(此程序中两个波特率不匹配,接受会出错,在实践中要设置串口一致的波特率)以下是程序#ifndef __USART_H//头文件 #define __USART_H#include "stdio.h" #include "sys.h"   void usart3_init(u32 bound);//如果想
发表于 2019-10-23
stm32f103之串口实验
stm32f103双串口收发(调试通过)
p;                   //ʹÄÜ´®¿Ú} void usart2_init(u32 bound) { //GPIO¶Ë¿ÚÉèÖà   GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure;  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO
发表于 2019-10-23
stm32f103双串口收发(调试通过)
STM32F103C8T6学习笔记_串口USART的使用
的复用TXD    Transmit(tx)  Data    发送数据RXD    Receive(rx)  Data     接受数据USART1_TX    PA.9    设置成复用推挽输出      GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;USART1_RX    PA.10  设置成浮空输入        &nbs
发表于 2019-10-23
STM32F103之USB(一)
p; Ø系统总线供电:可提供5V/500mA电源。    Ø支持设备众多:例如鼠标,键盘,打印机,显示器等。    Ø扩展容易,通过Hub可以连接多个设备只PC机    Ø高速数据传输:USB1.1是12Mb/s,USB2.0高达480Mb/S(ps210Mb/s/并口8Mb/s、R-                    23220Kb/s)    Ø方便的设备互连:USBOTG支持点对点通信,例如数码相机和打印机直接互连,无  &nbs
发表于 2019-10-22
STM32F103之USB(一)
stm32入门——跑马灯(基于stm32f103zet6)
的驱动都要使能相应的时钟,首先看stm32系统的时钟框图经查阅资料可知,GPIO的时钟在APB2的外设时钟使能寄存器上,相关函数的定义在stm32f10x_rcc.h中 void   RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)其源代码为:void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState){  /* Check the parameters */ //检查值的有效性&nbs
发表于 2019-10-21
stm32入门——跑马灯(基于stm32f103zet6)
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 2689mr.com, Inc. All rights reserved
北京赛车 天音彩票注册 北京赛车pk10计划 北京赛车pk10开奖 北京赛车 北京赛车pk10开奖 北京赛车pk10计划 北京赛车 北京赛车pk10计划 万客彩票注册投注代理