历史上的今天

今天是:2024年09月30日(星期一)

正在发生

2019年09月30日 | STM32-F407 CAN的双机通讯

发布者:泉地水无痕 来源: 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时钟使能                   

 

  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);

  

  //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;

  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;

}   

中断处理函数为: 


void CAN1_RX0_IRQHandler(void)

{

  CanRxMsg RxMessage;

int i=0;

        CAN_Receive(CAN1, 0, &RxMessage);

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

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  双机通讯 引用地址:STM32-F407 CAN的双机通讯

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

推荐阅读

为什么三星、台积电、英特尔,这三家直接竞争对手企业争相投资ASML?EUV堪称半导体设备发展以来最昂贵的设备,一台售价高达9,000 万欧元。中芯国际也向阿斯麦下单了一台价值高达1.2亿美元的EUV(极紫外线)光刻机。看看如何修炼这台设备的。
是德科技公司日前宣布与高通公司(Qualcomm Incorporated)旗下全资子公司高通科技扩大合作,协力加速 DSS(动态频谱共享)技术的商用化进程,支持移动运营商经济高效地快速推出 5G 新空口(NR)业务。是德科技是一家领先的技术公司,致力于帮助企业、服务提供商和政府客户加速创新,创造一个安全互联的世界。 在双方合作下,将会使用是德科技的 5G 网络...
华为云与计算消息显示,9月29日,成都高新区管委会与华为签署了人工智能大数据中心项目合作框架协议,并宣布携手共建蓉城智能体。据悉,华为将发挥在5G、云、AI、计算等方面的技术优势,帮助成都市建设成都智慧城市数字底座和城市智能中枢,通过打造蓉城智能体实现全场景智慧,提升城市治理能力,让企业和市民享受无所不在的智能、高效和贴心服务。此外,...
随着我国工业的不断发展,在生产过程中也产生了各种易燃易爆、有毒有害的气体。频繁发生的燃气爆炸、气体中毒事故让工厂企业意识到了气体检测仪的重要性。气体检测仪为精密机械,可实时检测厂区内的气体环境,保护厂区人员的生命安全。但气体检测仪需要得到妥善的保养和维护才能正常使用,那么气体检测仪的维护保养要怎么做呢?接下来霍尼艾格小编就为大家...

史海拾趣

问答坊 | AI 解惑

哪位朋友有基于单片机测坡度(倾角)传感器的资料

RT 小弟要设计个车载测动态坡度的。基于51单片机系统的好:$ …

查看全部问答∨

Freescale 的 VPU 视频解码后怎么显示到指定的窗口控件上

我用Freescale Mx27 中的VPU进行 视频的编解码 ,解码后如何将视频帧显示到指定的窗口控件中呢,          …

查看全部问答∨

s3c2410的nand flash在烧写后,启动出错,求救

s3c2410上烧wince的bootloader,烧写过程没错,但重启后出错 超级终端启动后,屏幕出现如下信息: WinCE NAND Boot v1.00 Mar 22 2007 00:02:34 Picture Boot WinCE NAND Boot v1.00 Mar 22 2007 12:25:45 dwEntry is 0x00000001 ECC ERROR ...…

查看全部问答∨

keil全局变量初始化值改变的问题

正在用keil for arm学习LPC2312,用proteus联调 我在main.c中定义了一个全局变量led_flag和led_taber[16]的数组, 我主要是要完成用LPC2312的p0.0-p0.6这7个口作为输出来控制7段数码管显示0 1 2 …E F十六个数字 用p0.7,p0.9作为外部中断输入, ...…

查看全部问答∨

我设计的测试的电路图,,哪个可以帮我分析下有没有问题??

我已经给了一定的解释,,哪个朋友可以帮我分析下电路可以应用不??这个电路肯定要改进的…

查看全部问答∨

TIM4重映射功能有问题?

    GPIO_PinRemapConfig(GPIO_Remap_TIM4, ENABLE);    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);   这个两句,不管用不用,PB6-PB9都有信号输出,而PD12-PD1 ...…

查看全部问答∨

新人来学习

我是菜鸟,我进来和大家一起学习…

查看全部问答∨

实在搞不懂TI的ARM怎么和ST竞争?

价格贵,bug多,真是后悔选了LM3S。…

查看全部问答∨

Launchpad和俄罗斯方块的故事~

视频: $(\'swf_JnJ\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encodeURI(\'http://player.youku.com/player.php/sid/XNDE5Nzc2M ...…

查看全部问答∨

有没有贴片的2SK30场管

请教诸位:像2SK30,2SK241这样的小功率场管有没有贴片封装的?…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved