历史上的今天
返回首页

历史上的今天

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

正在发生

2019年09月30日 | STM32 CAN 通讯发送不能连续,不能接收

2019-09-30 来源:eefocus

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. 折腾了一天的问题,终于解决了。

推荐阅读

史海拾趣

E-Switch公司的发展小趣事

在E-Switch的发展历程中,品质一直是公司最为重视的方面之一。公司始终坚持严格的质量管理体系,从原材料采购到生产流程控制,再到产品出厂检验,每一个环节都严格把关。正是这种对品质的执着追求,让E-Switch的产品在市场上赢得了良好的口碑。

EQCOLOGIC公司的发展小趣事

随着环保意识的日益增强,电子行业对环保的要求也越来越高。EQCOLOGIC公司积极响应环保号召,将环保理念贯穿于产品研发、生产和销售的各个环节。公司采用环保的生产工艺和材料,减少污染物的排放;同时,还开展了一系列环保宣传活动,提高员工和消费者的环保意识。这些举措不仅提升了公司的社会形象,也为公司的可持续发展奠定了基础。

芯联(CHIPLINK)公司的发展小趣事

面对激烈的市场竞争和不断上升的成本压力,芯联集成通过优化成本结构、提高生产效率等措施,成功降低了生产成本。同时,公司还加强了与供应商的合作,实现了供应链的优化管理。这些努力使芯联集成在保持产品质量的同时,降低了产品售价,提升了盈利能力。

DESOUTTER公司的发展小趣事

2001年,Desoutter公司与CP(Chicago Pneumatic)和GR(Grorges Renault)合并,成立了CPDI公司。这次合并使Desoutter公司获得了更强大的技术实力和市场资源,进一步巩固了其在气动工具领域的领先地位。合并后,CPDI公司继续致力于气动工具的研发和生产,并推出了一系列创新产品,以满足市场的不断变化和升级需求。

Edsun Laboratories Inc公司的发展小趣事

在竞争激烈的电子行业中,品质是企业生存和发展的关键。ECM Electronics Limited.深知这一点,始终将产品质量放在首位。公司建立了严格的质量管理体系,从原材料采购到产品生产、检测、包装等各个环节都严格把关,确保每一件产品都符合高标准的质量要求。正是凭借过硬的产品品质,ECM赢得了客户的信赖和市场的认可。

ETI Systems公司的发展小趣事

ETI Systems深知在电子行业中,单打独斗很难取得长远的发展。因此,公司积极寻求与行业内外的合作伙伴建立战略合作关系。通过与多家知名企业和研究机构的合作,ETI Systems不仅获得了宝贵的技术支持,还拓展了市场渠道和客户资源。这种合作与共赢的伙伴关系,为ETI Systems的快速发展奠定了坚实的基础。

问答坊 | AI 解惑

嵌入式开发入门之经典 ZIGBEE之开发系统

嵌入式开发入门之经典 开始进入嵌入式世界,真是一头雾水,不知道如何入手!也不知道该如何学习,学习什么,最近从网上转载这篇文章,对我启发很大,对于初始进入嵌入式的人们很有帮组,好多嵌入式大侠都说这是入门的最好文章. 1、抓住51开发ARM   这 ...…

查看全部问答>

ce/mobile6驱动开发需要什么环境?

最近要做ce5和mobile6驱动开发,不知道必须什么环境才可以开发,有没有什么驱动工具包作为基础?请提供下载地址。 请高手指点…

查看全部问答>

我想自己做一个播放器(包括硬件和软件),请大家参考一下

我想自己做一个播放器,大致功能如下 功能 1、通过VGA(主要接液晶电视)或者AV输出,能够顺畅播放realplay所支持的影视格式。 2、通过无线网络访问其他计算机的文件。 大致列了如下配置单: 硬件配置表 1、CPU主频400MHz 以上 2、64MBtyes SD ...…

查看全部问答>

懂MDB/IP协议的进

我最近做一个项目,关于自动售货机掉货检测的。 其中自动售货机的主控系统与其他从设备之间的通信是基于MDB协议的 在掉货检测这个从设备中,我使用的AT89C51单片机 我想问下 如何设计这个通信协议才能使自动售货机的主控系统和掉货检测这个从设 ...…

查看全部问答>

关于Prime Time的一个常见问题

运行结果提示:the arc between pins \'CK\' and \'D\' is negative, which is not allowed. To make it positive, the maximum hold value has been adjusted from 0.729405 to 0.782819.请问:1. 修改那里,才能保证是正值。     ...…

查看全部问答>

有玩过CSTN液晶的吗,看看这个函数

今天看到一个定义窗口的函数windows(x1,x2,y1,y2), void Define_Window(unsigned char data X0, unsigned char data Y0, unsigned char data X1, unsigned char data Y1) { Write_Cmd(0x2A); Write_CMD_Data(X0); Write_CMD_Data(X ...…

查看全部问答>

请版本帮忙确定一下STR710BGA封装的CAN引脚

710手册Rev.6版本(2005.4)上: H8:P1.12/CANTX G12:P1.11/CANRX F12:NC 710手册Rev.12版本(2008.2)上: H8:P1.12/CANTX G12:NC F12:P1.11/CANRX 请版主确定一下,哪一个是正确的,我设计时用户是Rev6,PCB板的F12没引出,无法测 ...…

查看全部问答>

中断函数中调用fft库的问题

本帖最后由 dontium 于 2015-1-23 13:27 编辑 我要做一个语音端点检测的程序,用的vpm642的开发板,aic23b语音芯片,用EDMA输入和输出采集的语音信号,使用了输出和输出两个pingpong缓存,在输入ping或pong缓存接受完数据后产生中断,将数据做fft ...…

查看全部问答>

大赛D题赐教

本帖最后由 paulhyde 于 2014-9-15 03:28 编辑 D题采用什么芯片?AD603达不到所需的增益,都要崩溃了    …

查看全部问答>

求购 瑞萨RL78/G14 Demo板

由于学习需要,求购瑞萨RL78/G14 Demo板一块。  …

查看全部问答>