STM32 CAN 通讯发送不能连续,不能接收

2019-09-30来源: eefocus关键字:STM32  CAN  通讯  发送  不能连续  不能接收

1。 今天调试CAN, STM32F334C8T6,做一个生物PCR监测的项目,用到CAN,程序写完后,调试,发现发送只能发送16帧,而且不能接收,用的是USB2CAN


2. 检查程序初始化部分如下


u8 CAN1_Init(u16 BaudRate,u8 mode)

{

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);                                                                    

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);    

    //初始化GPIO

    GPIO_InitTypeDef GPIO_InitStructure={

        。GPIO_Pin =  GPIO_Pin_12,

        .GPIO_Mode = GPIO_Mode_AF,              //复用功能

        .GPIO_OType = GPIO_OType_PP,        //推挽输出

        。GPIO_Speed = GPIO_Speed_50MHz,     //100MHz

        .GPIO_PuPd = GPIO_PuPd_NOPULL,          //上拉

    };

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

    

    GPIO_InitTypeDef GPIO_InitStructure11={

        .GPIO_Pin = GPIO_Pin_11,

        。GPIO_Mode = GPIO_Mode_AF,              //复用功能

        。GPIO_OType = GPIO_OType_PP,        //推挽输出

        .GPIO_Speed = GPIO_Speed_50MHz,     //100MHz

        .GPIO_PuPd = GPIO_PuPd_UP,          //上拉

    };

    

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

    

    GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_9); 

    GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_9); 


    

    //CAN单元设置

    CAN_InitTypeDef  CAN_InitStructure={     

        .CAN_TTCM=DISABLE,    //非时间触发通信模式   

        .CAN_ABOM=DISABLE,    //软件自动离线管理      

        .CAN_AWUM=DISABLE,    //睡眠模式通过软件唤醒

        。CAN_NART=ENABLE,        //禁止报文自动传送 

        .CAN_RFLM=DISABLE,    //报文不锁定,新的覆盖旧的  

        .CAN_TXFP=DISABLE,    //优先级由报文标识符决定 

        .CAN_Mode= mode,         //模式设置 

        .CAN_SJW=CAN_SJW_1tq,    //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 

        .CAN_BS1=CAN_BS1_6tq,   //CAN_BS2_5tq,Tbs1范围CAN_BS1_1tq ~CAN_BS1_16tq

        。CAN_BS2=CAN_BS2_5tq,    //CAN_BS1_6tq,Tbs2范围CAN_BS2_1tq ~    CAN_BS2_8tq

        .CAN_Prescaler=BaudRate,     //12,BaudRate,分频系数(Fdiv)为brp+1         

    };

    

    

    CAN_Init(CAN1, &CAN_InitStructure);// 初始化CAN1//配置过滤器 

    

    CAN_FilterInitTypeDef  CAN_FilterInitStructure0={

        。CAN_FilterNumber=CAN_Filter_FIFO0,        //过滤器0

        .CAN_FilterMode=CAN_FilterMode_IdMask, 

        。CAN_FilterScale=CAN_FilterScale_32bit, //32位 

        .CAN_FilterIdHigh=00,                       //16,  32位ID

        .CAN_FilterIdLow=0x0000,

        。CAN_FilterMaskIdHigh=0x0000,               //0xff,32位MASK

        。CAN_FilterMaskIdLow=0x0000,

        .CAN_FilterFIFOAssignment=CAN_Filter_FIFO0,//过滤器0关联到FIFO0

        .CAN_FilterActivation=ENABLE,               //激活过滤器0

    };

    

    CAN_FilterInit(&CAN_FilterInitStructure0);    //滤波器初始化

    

    CAN_FilterInitTypeDef  CAN_FilterInitStructure1={

        .CAN_FilterNumber=CAN_Filter_FIFO1,      //过滤器1

        。CAN_FilterMode=CAN_FilterMode_IdMask, 

        。CAN_FilterScale=CAN_FilterScale_32bit, //32位 

        。CAN_FilterIdHigh=0x00FF,               //网络参数更改

        。CAN_FilterIdLow=0x0000,

        .CAN_FilterMaskIdHigh=0x00FF,               //32位MASK

        。CAN_FilterMaskIdLow=0x0000,

        .CAN_FilterFIFOAssignment=CAN_Filter_FIFO1, //过滤器0关联到FIFO0

        .CAN_FilterActivation=ENABLE,               //激活过滤器0

    };

    CAN_FilterInit(&CAN_FilterInitStructure1);    //滤波器初始化

    

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

    

    NVIC_InitTypeDef  NVIC_InitStructure0={

        .NVIC_IRQChannel = CAN1_RX0_IRQn,

        .NVIC_IRQChannelPreemptionPriority = 1,     // 主优先级为1

        .NVIC_IRQChannelSubPriority = 0,            // 次优先级为0

        .NVIC_IRQChannelCmd = ENABLE,

    };

    NVIC_Init(&NVIC_InitStructure0);

    

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

    NVIC_InitTypeDef  NVIC_InitStructure1={

        .NVIC_IRQChannel = CAN1_RX1_IRQn,

        .NVIC_IRQChannelPreemptionPriority = 1,     // 主优先级为1

        .NVIC_IRQChannelSubPriority = 2,            // 次优先级为0

        .NVIC_IRQChannelCmd = ENABLE,

    };

    NVIC_Init(&NVIC_InitStructure1);

    return 0;

}   


波特率是250K,计算一下 36MHZ/分频/(1+6+5),CAN_SJW_1tq,CAN_BS1_6tq,CAN_BS2_5tq,刚好是250K


GPIO看了文档也是OK


滤波器设置也是参照我以前的407的(CAN OK),


3.检查了发送程序


u8 CAN_DataSend(MsgFrame const Msg)

{

    u8             mbox; 

    u16         i=0;

    CanTxMsg     TxMessage;

    BIT32       ExtID;

    

    //源地址

    ExtID。Bit8。Bit8[3] = 16;

    //目的地址

    ExtID.Bit8.Bit8[2] = Msg.MsgInfo.fAddr;

    //指令

    ExtID。Bit8。Bit8[1]  = Msg。Bit8[3];

    ExtID。Bit8。Bit8[0] = 0;

    TxMessage。StdId =  0x0;                // 标准标识符为0

    TxMessage.ExtId = ExtID.Int>>3;        // 设置扩展标示符(29位)

    TxMessage.IDE = CAN_Id_Extended;  // 使用扩展标识符

    TxMessage.RTR = 0;                // 消息类型为数据帧,一帧8位

    TxMessage。DLC = 8;                // 发送两帧信息

    //拷贝数据

    memcpy(&TxMessage.Data[i],&(Msg.Bit8[5]),8);

    //传输数据

    mbox= CAN_Transmit(CAN1, &TxMessage);   

    while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))

        i++;//等待发送结束

    if(i>=0XFFF)return 0;

    return 1;

}


和以前也是一样的,同时,用逻辑分析器,看也有波形。也有数据,但为啥还是不能连续发送呢?有点迷茫


4。 还是再看看电路图吧(不是我画的,我同事画的),发现没有接120R电阻,以前记得要接120R,找同事要几个120R电阻


接上去,测试,发现OK。


5.测试一下接收,也是OK


void CAN1_RX0_IRQHandler(void)

{


    if(CAN_GetFlagStatus(CAN1,CAN_FLAG_FMP0))

    {

        memset(&CANRxBuffer,0,sizeof(CanRxMsg));

        CAN_Receive(CAN1, CAN_FIFO0, &CANRxBuffer);

        if(CAN1FrameHandler!=NULL)

        {

            CAN1FrameHandler();

        }

    }

    CAN_ClearFlag(CAN1,CAN_FLAG_FMP0);

}


6。 折腾了一天的问题,终于解决了。

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

上一篇:stm32与伺服驱动器进行can通信
下一篇:STM32F4的CAN通信讲解

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

推荐阅读

STM32F10X ADC原理详解(STM32F103ZET6)
STM32ADC的工作原理模/数转换器STM32F10x  ADC特点12位逐次逼近型的模拟数字转换器。最多带3个ADC控制器最多支持18个通道,可最多测量16个外部和2个内部信号源。支持单次和连续转换模式转换结束,注入转换结束,和发生模拟看门狗事件时产生中断。通道0到通道n的自动扫描模式自动校准采样间隔可以按通道编程规则通道和注入通道均有外部触发选项转换结果支持左对齐或右对齐方式存储在16位数据寄存器ADC转换时间:最大转换速率 1us。(最大转换速度为1MHz,在ADCCLK=14M,采样周期为1.5个ADC时钟下得到。)ADC供电要求:2.4V-3.6VADC输入范围:VREF- ≤  VIN 
发表于 2020-07-25
<font color='red'>STM32</font>F10X ADC原理详解(<font color='red'>STM32</font>F103ZET6)
STM32控制步进电机程序
、IN3:PC0、IN4:PC13、//步进电机初始化函数void Motor_Init(void){        GPIO_InitTypeDef GPIO_InitStructure;                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//开启时钟                GPIO_InitStructure.GPIO
发表于 2020-07-25
<font color='red'>STM32</font>控制步进电机程序
基于IAR环境下STM32F103单片机读取BME280程序
自己编写的基于IAR环境下STM32F103单片机读取BME280程序,没有太多的寄存器操作,简单易懂,可以直接调用,上电后只要对IO口初始化,调用函数Bme_ReadDigValue()读取校准寄存器参数并保存,再调用函数Bme_Init()初始化之后就可以用函数Bme_ReadStatus()读取传感器状态判断是否读取数据了,也可不判断传感器状态直接读取数据,读取数据直接调用函数ReadBme280()。单片机源程序:void ReadBme280(){        u32 value_ad;        double var1; 
发表于 2020-07-25
STM32步进伺服电机梯形加速源程序 单轴简易运动控制器
步进电机梯形加速程序单片机源程序如下:/*基于STM32的单轴简易运动控制器/脉冲发生器*//*脉冲+方向控制步进伺服电机*//*优化记录:增加急停GPIOC.0、正向极限GPIOC.1、负向极限GPIOC.2等输入IO接点中断修改TIMx_PSC一个寄存器的值,而不是修改TIMx_ARR预加载寄存器+TIMx_CCRx比较值寄存器两个值,缩短中断处理时间定位指令DRVI/DRVA中,目标频率设定过高、而实际输出脉冲数过少时,则不必加速到目标频率即进入减速区*//*DRVI(A);相对定位,输出A(A取绝对值)个脉冲A不能为0若A为正数,则方向为正、GPIOB.0为高电平若A为负数,则方向为负、GPIOB.0为低电平DRVA
发表于 2020-07-25
STM32实现ADS1256进行数据电压采集程序
通过cubeMX配置STM32RCT6的IO口与ads1256ADC模块的连接IO口工作模式SPI,还有接受中断接受状态引脚,最终ADC采集数据经过卡尔曼滤波器滤波输出单片机源程序如下:#include "ads1256.h"int32_t adcVaule = 0x00;float voltage = 0x00;float filterVoltage = 0.0;float filterVoltage2 = 0.0;void delayXus(uint16_t us) {    uint16_t diff = 0xffff - 5 - us;    //设置定时器的计数
发表于 2020-07-25
基于WiFi的网络授时时钟(带实时天气更新)STM32程序设计
本方案采用的是MCU+AT指令的形式开发,MCU是大家比较熟悉的意法半导体公司STM32F103C8T6,WiFi模块使用的是安信可ESP-12F,本方案是一个Demo设计,比较简单,仅实现了功能,算是一个抛砖引玉吧!先上视频演示:https://v.youku.com/v_show/id_XN ... m=a2hzp.8244740.0.0WiFi模块资料链接:wiki点ai-thinker点com/esp8266STM32F103C8芯片资料链接:https://www.stmicroelectronics.c ... 103c8.html#overview硬件部分,由时钟电路+WiFi模块+MCU最小系统+OLED
发表于 2020-07-25
基于WiFi的网络授时时钟(带实时天气更新)<font color='red'>STM32</font>程序设计
小广播
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 2689mr.com, Inc. All rights reserved
北京赛车Pk10全自动下注q群微信群机器人 送彩金信誉娱乐平台 正规官网送彩金 送彩金的娱乐棋牌游戏 彩票大赢家 正规官网送彩金 网上赌场送彩金 博彩送彩金38元 澳客彩票 时时彩平台推荐网站送彩金