北京赛车pk10开奖

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={

北京赛车pk10开奖        .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,          //上拉

北京赛车pk10开奖    };

    

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

    

北京赛车pk10开奖    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,        //禁止报文自动传送 

北京赛车pk10开奖        。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,

北京赛车pk10开奖        .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);    //滤波器初始化

    

北京赛车pk10开奖    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,

北京赛车pk10开奖    };

    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,

    };

北京赛车pk10开奖    NVIC_Init(&NVIC_InitStructure1);

北京赛车pk10开奖    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;                // 发送两帧信息

北京赛车pk10开奖    //拷贝数据

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

    //传输数据

北京赛车pk10开奖    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服务号
享受更多官方福利

推荐阅读

STM8L低功耗调试总结
STM8L低功耗调试资料准备功耗数据目标实现低功耗资料准备在调试STM单片机相关功能时,习惯性的进入到STM官方论坛进行资料下载。调试STM8功耗也不例外,找到STM8L的应用笔记,选择最热,先看看官方提供的STM8入门文档,入门资料可以选择中文或者英文(STM8L和STM8AL入门)。资料里面有一段话,对功耗调试相当重要:6.6 不使用的 I/O 和特性微控制器都是为多种应用设计的,通常一个应用不会使用 100 % 的微控制器资源。为了避免不必要的功率消耗 (对电池供电应用特别重要),同时提高 EMC 性能,闲置时钟、计数器或 I/O 都不应浮空。 I/O 应该外部强制 (上拉或者下拉到闲置 I/O 引脚),并且不使用的功能应
发表于 2019-11-14
STM8L低功耗调试总结
STM8的停机模式
首先,STM8有三种低功耗模式,即等待、活跃停机和停机。具体它们三者有什么区别自己看官方手册去吧,这里只讲停机模式的应用,其他的一笔带过!一、进入的方式:等待模式进入用的指令是WFI,而活跃停机和停机用的都是halt(),所不同的是,在执行halt指令之前,如果开启了AWU,则是活跃停机,反之则是停机。还有一点要说明的是,在停机模式下独立看门狗是不能养的,而只能养窗口看门狗。二、具体进入的步骤:1、首先,你声明一个标志位,名字自己取。这个标志位是用来判断系统是该处于运行模式还是处于停机模式的。我这里用fPowerOn_flag,如下:bool fPowerOn_flag = FALSE;有了这个标志位以后就写下面的部分了:int
发表于 2019-11-14
halt低功耗模式
1. stm8l152有5种低功耗模式,wait mode, low power run mode, low power wait mode, active-halt mode, halt mode.2. 在halt模式下,cpu和外设时钟停止,可以通过外部中断或者复位来唤醒。3. 本实验设计为:led灯亮,紧接着进入halt模式,有按键时,中断,快速唤醒,led灯灭。     PWR_FastWakeUpCmd(ENABLE);  //快速唤醒使能     //所有IO输出低电平    GPIO_Init(GPIOA
发表于 2019-11-14
STM8L051低功耗模式测试文档
STM8L051的五种低功耗模式wait ,low power run mode,low power wait mode,Ative-Halt mode,Halt mode。WAIT  mode  在等待模式,CPU的时钟是停止的,被选择的外设继续运行。WAIT mode 分为两种方式:WFE,WFI。WFE是等待事件发生,才从等待模式中唤醒。WFI是等待中断发生,才从等待模式中唤醒。low power run mode  在低功耗运行模式下,CPU和被选择的外设在工作,程序执行在LSI或者LSE下,从RAM中执行程序,Flash和EEPROM都要停止运行。电压被配置成Ultra Low Power
发表于 2019-11-14
stm8l 低功耗 halt_active模式
第一次尝试做低功耗,芯片stm8l,用的半halt模式1、关于唤醒,可以用外部中断和RTC(stm8l不同的模式用的唤醒方式均不同)2、关于省电,如果没达到理想的电流,一般都是gpio口问题,没用到的都悬浮输入或输出低都是可以的,用到的统一量一下电平,看看哪个状态不对
发表于 2019-11-14
STM8L EXITB一个端口两个中断的实现
void EXTI_Config(void){     EXTI_DeInit();       EXTI_SetPinSensitivity(EXTI_Pin_5,EXTI_Trigger_Falling);     ITC_SetSoftwarePriority(EXTI5_IRQn, ITC_PriorityLevel_1);    GPIO_Init(KEY_PORT, KEY_RT_PIN, GPIO_Mode_In_PU_IT);    EXTI_SetPinSensitivity(
发表于 2019-11-14
小广播
何立民专栏 单片机及嵌入式宝典

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

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD。com。cn, Inc。 All rights reserved
北京赛车pk10计划 微彩彩票投注计划官网 北京赛车pk10开奖 北京赛车pk10计划 永利赛车机器人 北京赛车pk10开奖 天音彩票网 天音彩票平台 澳彩网彩票注册开户平台 北京赛车pk10计划