3512|10

186

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

对STM32的CAN通信的概念模糊 [复制链接]

本帖最后由 liufengjing9 于 2015-5-2 23:37 编辑

诸位好!
在编写以及调试STM32CAN通信程序时,哪些是用户做的,可编的。我所知的是,对CAN模块的初始化设定,波特率,报文ID,以及对报文的设置。试问一下,用户还可以设置哪些程序?

而哪些又是硬件设定好的,也就是各种各样的协议。这一点不是太明白。(下面是复制的一些CAN各个层面概念)望大神点化一下。

另外,对于位时序问题,用户仅仅就是设定一下SJW,BS1,BS2,就可以了吗?其他都是交给硬件与协议了吗?

还有,CAN通信的错误类型CRC报错。大概是哪些情况?一旦出错,就彻底迷茫。愿大神分享一下经验!

提前谢谢了!




备注:CAN各个层面概念
ISO/OSI 基本参照模型各层定义的主要项目:
软件控制
7 层:应用层由实际应用程序提供可利用的服务。
6 层:表示层进行数据表现形式的转换。
如:文字设定、数据压缩、加密等的控制
5 层:会话层为建立会话式的通信,控制数据正确地接收和发送。
4 层:传输层控制数据传输的顺序、传送错误的恢复等,保证通信的品质。
如:错误修正、再传输控制。
3 层:网络层进行数据传送的路由选择或中继。
如:单元间的数据交换、地址管理。

硬件控制
2 层:数据链路层将物理层收到的信号(位序列)组成有意义的数据,提供传输错误控制
等数据传输控制流程。
如:访问的方法、数据的形式。
通信方式、连接控制方式、同步方式、检错方式。
应答方式、通信方式、包(帧)的构成。
位的调制方式(包括位时序条件)。
1 层:物理层规定了通信时使用的电缆、连接器等的媒体、电气信号规格等,以实现
设备间的信号传送。
如:信号电平、收发器、电缆、连接器等的形态。
此帖出自stm32/stm8论坛

最新回复

这个讨论有意义。  详情 回复 发表于 2016-12-21 08:32
点赞 关注
 

回复
举报

186

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
期待大家的多多指教!
此帖出自stm32/stm8论坛
 
 

回复

3243

帖子

0

TA的资源

纯净的硅(高级)

板凳
 
还要写发送和接收吧。
此帖出自stm32/stm8论坛

点评

是的! 不过有时感觉就是如果CAN通信一旦出问题, 无论是发送还是接收方面的,就不知该如何去查找问题?  详情 回复 发表于 2015-5-3 09:25
 
个人签名为江山踏坏了乌骓马,为社稷拉断了宝雕弓。
 

回复

186

帖子

0

TA的资源

一粒金砂(中级)

4
 
chenbingjy 发表于 2015-5-3 03:36
还要写发送和接收吧。

是的!
不过有时感觉就是如果CAN通信一旦出问题,
无论是发送还是接收方面的,就不知该如何去查找问题?
此帖出自stm32/stm8论坛
 
 
 

回复

186

帖子

0

TA的资源

一粒金砂(中级)

5
 
自顶一下!
此帖出自stm32/stm8论坛
 
 
 

回复

1803

帖子

0

TA的资源

五彩晶圆(高级)

6
 
多看文档,多看代码,多做实验,没有什么捷径。
此帖出自stm32/stm8论坛

点评

好的!记住了!非常感谢!  详情 回复 发表于 2015-5-9 01:34
 
 
 

回复

186

帖子

0

TA的资源

一粒金砂(中级)

7
 
Study_Stellaris 发表于 2015-5-6 09:10
多看文档,多看代码,多做实验,没有什么捷径。

好的!记住了!非常感谢!
此帖出自stm32/stm8论坛
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

8
 
我只想说无论我怎么修改SJW,BS1,BS2都没用,示波器显示它任然在用原始例程给的波特率进行
此帖出自stm32/stm8论坛
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

9
 
Study_Stellaris 发表于 2015-5-6 09:10
多看文档,多看代码,多做实验,没有什么捷径。

我想请教一个问题,为什么我用下面这个函数修改SJW,BS1,BS2的值都没有用?
CAN1_Mode_Init(CAN_SJW_1tq,CAN_BS2_6tq,CAN_BS1_7tq,6,CAN_Mode_LoopBack);

/**************************/




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;

#if CAN1_RX0_INT_ENABLE

           NVIC_InitTypeDef  NVIC_InitStructure;

#endif

    //ê1ÄüÏà1Øê±Öó

          RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//ê1ÄüPORTAê±Öó                                                                                                                    



          RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//ê1ÄüCAN1ê±Öó       

       

    //3õê¼»ˉGPIO

          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11| GPIO_Pin_12;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//¸′óÃ1|Äü

    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//íÆíìêä3ö

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//éÏà-

    GPIO_Init(GPIOA, &GPIO_InitStructure);//3õê¼»ˉPA11,PA12

       

          //òy½Å¸′óÃó3éäÅäÖÃ

          GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_CAN1); //GPIOA11¸′óÃÎaCAN1

          GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_CAN1); //GPIOA12¸′óÃÎaCAN1

          

          //CANμ¥ÔaéèÖÃ

           CAN_InitStructure.CAN_TTCM=DISABLE;        //·Çê±¼ä′¥·¢í¨DÅģ꽠  

          CAN_InitStructure.CAN_ABOM=DISABLE;        //èí¼t×Ô¶ˉàëÏß1üàí          

          CAN_InitStructure.CAN_AWUM=DISABLE;//ËˉÃßÄ£ê½í¨1yèí¼t»½DÑ(Çå3yCAN->MCRμÄSLEEPλ)

          CAN_InitStructure.CAN_NART=ENABLE;        //½ûÖ1±¨ÎÄ×Ô¶ˉ′«Ëí

          CAN_InitStructure.CAN_RFLM=DISABLE;        //±¨ÎÄ2»Ëø¶¨,DÂμĸ2¸Ç¾éμÄ  

          CAN_InitStructure.CAN_TXFP=DISABLE;        //óÅÏ輶ó鱨Îıê궷û¾ö¶¨

          CAN_InitStructure.CAN_Mode= mode;         //Ä£ê½éèÖÃ

          CAN_InitStructure.CAN_SJW=tsjw;        //ÖØDÂí¬2½ìøÔ¾¿í¶è(Tsjw)Îatsjw+1¸öê±¼äμ¥λ CAN_SJW_1tq~CAN_SJW_4tq

          CAN_InitStructure.CAN_BS1=tbs1; //Tbs1·¶Î§CAN_BS1_1tq ~CAN_BS1_16tq

          CAN_InitStructure.CAN_BS2=tbs2;//Tbs2·¶Î§CAN_BS2_1tq ~        CAN_BS2_8tq

          CAN_InitStructure.CAN_Prescaler=brp;  //·ÖÆμÏμêy(Fdiv)Îabrp+1       

          CAN_Init(CAN1, &CAN_InitStructure);   // 3õê¼»ˉCAN1



                //ÅäÖÃ1yÂËÆ÷

          CAN_FilterInitStructure.CAN_FilterNumber=0;          //1yÂËÆ÷0

          CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;

          CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32λ

          CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;////32λID

          CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;

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

          CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;

           CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//1yÂËÆ÷01Øáaμ½FIFO0

          CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //¼¤»î1yÂËÆ÷0

          CAN_FilterInit(&CAN_FilterInitStructure);//ÂË2¨Æ÷3õê¼»ˉ

               

#if CAN1_RX0_INT_ENABLE

       

          CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0ÏûÏ¢1òoÅÖD¶ÏÔêDí.                    



          NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;

          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     // Ö÷óÅÏ輶Îa1

          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            // ′ÎóÅÏ輶Îa0

          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

          NVIC_Init(&NVIC_InitStructure);

#endif

        return 0;

}   




此帖出自stm32/stm8论坛

点评

我认为,如果那个函数是库里面的函数的话,看看你的形式参数有没有问题? 如果没有报错的话,你的参数没问题,我感觉是能用的!  详情 回复 发表于 2015-5-19 22:46
 
 
 

回复

186

帖子

0

TA的资源

一粒金砂(中级)

10
 
天空不丢色 发表于 2015-5-15 16:50
我想请教一个问题,为什么我用下面这个函数修改SJW,BS1,BS2的值都没有用?
CAN1_Mode_Init(CAN_SJW_1tq,CAN_BS2_6tq,CAN_BS1_7tq,6,CAN_Mode_LoopBack);

/**************************/




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;

#if CAN1_RX0_INT_ENABLE

           NVIC_InitTypeDef  NVIC_InitStructure;

#endif

    //ê1ÄüÏà1Øê±Öó

          RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//ê1ÄüPORTAê±Öó                                                                                                                    



          RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//ê1ÄüCAN1ê±Öó       

       

    //3õê¼»ˉGPIO

          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11| GPIO_Pin_12;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//¸′óÃ1|Äü

    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//íÆíìêä3ö

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//éÏà-

    GPIO_Init(GPIOA, &GPIO_InitStructure);//3õê¼»ˉPA11,PA12

       

          //òy½Å¸′óÃó3éäÅäÖÃ

          GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_CAN1); //GPIOA11¸′óÃÎaCAN1

          GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_CAN1); //GPIOA12¸′óÃÎaCAN1

          

          //CANμ¥ÔaéèÖÃ

           CAN_InitStructure.CAN_TTCM=DISABLE;        //·Çê±¼ä′¥·¢í¨DÅģ꽠  

          CAN_InitStructure.CAN_ABOM=DISABLE;        //èí¼t×Ô¶ˉàëÏß1üàí          

          CAN_InitStructure.CAN_AWUM=DISABLE;//ËˉÃßÄ£ê½í¨1yèí¼t»½DÑ(Çå3yCAN->MCRμÄSLEEPλ)

          CAN_InitStructure.CAN_NART=ENABLE;        //½ûÖ1±¨ÎÄ×Ô¶ˉ′«Ëí

          CAN_InitStructure.CAN_RFLM=DISABLE;        //±¨ÎÄ2»Ëø¶¨,DÂμĸ2¸Ç¾éμÄ  

          CAN_InitStructure.CAN_TXFP=DISABLE;        //óÅÏ輶ó鱨Îıê궷û¾ö¶¨

          CAN_InitStructure.CAN_Mode= mode;         //Ä£ê½éèÖÃ

          CAN_InitStructure.CAN_SJW=tsjw;        //ÖØDÂí¬2½ìøÔ¾¿í¶è(Tsjw)Îatsjw+1¸öê±¼äμ¥λ CAN_SJW_1tq~CAN_SJW_4tq

          CAN_InitStructure.CAN_BS1=tbs1; //Tbs1·¶Î§CAN_BS1_1tq ~CAN_BS1_16tq

          CAN_InitStructure.CAN_BS2=tbs2;//Tbs2·¶Î§CAN_BS2_1tq ~        CAN_BS2_8tq

          CAN_InitStructure.CAN_Prescaler=brp;  //·ÖÆμÏμêy(Fdiv)Îabrp+1       

          CAN_Init(CAN1, &CAN_InitStructure);   // 3õê¼»ˉCAN1



                //ÅäÖÃ1yÂËÆ÷

          CAN_FilterInitStructure.CAN_FilterNumber=0;          //1yÂËÆ÷0

          CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;

          CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32λ

          CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;////32λID

          CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;

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

          CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;

           CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//1yÂËÆ÷01Øáaμ½FIFO0

          CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //¼¤»î1yÂËÆ÷0

          CAN_FilterInit(&CAN_FilterInitStructure);//ÂË2¨Æ÷3õê¼»ˉ

               

#if CAN1_RX0_INT_ENABLE

       

          CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0ÏûÏ¢1òoÅÖD¶ÏÔêDí.                    



          NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;

          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     // Ö÷óÅÏ輶Îa1

          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            // ′ÎóÅÏ輶Îa0

          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

          NVIC_Init(&NVIC_InitStructure);

#endif

        return 0;

}

我认为,如果那个函数是库里面的函数的话,看看你的形式参数有没有问题?
如果没有报错的话,你的参数没问题,我感觉是能用的!
此帖出自stm32/stm8论坛
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

11
 
这个讨论有意义。
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表