历史上的今天
返回首页

历史上的今天

今天是:2024年12月16日(星期一)

正在发生

2020年12月16日 | STM32F7xx —— CAN通信

2020-12-16 来源:eefocus

一、CAN基础

差分信号:显性电平对应逻辑0,CAN_H和CAN_L差为2.5V;隐形电平对应逻辑1,CAN_H和CAN_L差为0V。


CAN总线的开始和结束都有一个120Ω的终端电阻。


数据帧:标准帧11位,  扩展帧29位。


其他的一些理论知识就不再赘述了,可以参考维基百科对于CAN的描述。


STM32F7xx的bxCAN主要特点:支持CAN2.0A和CAN2.0B,波特率高达1Mbps,支持时间触发,具有3个发送邮箱,2个接收邮箱,可变的过滤器组等。


 


二、几个重要的CAN函数

HAL_StatusTypeDef HAL_CAN_Init(CAN_HandleTypeDef* hcan); // CAN初始化

 

HAL_StatusTypeDef HAL_CAN_Transmit(CAN_HandleTypeDef *hcan, uint32_t Timeout); // CAN发送

 

HAL_StatusTypeDef HAL_CAN_Receive(CAN_HandleTypeDef *hcan, uint8_t FIFONumber, uint32_t Timeout); // CAN接收


三、几个重要的结构

// CAN操作句柄 包含CAN基地址(CAN1/CAN2/CAN3) 初始化结构 发送接收结构体 其余三个是过程变量

typedef struct

{

  CAN_TypeDef                 *Instance;  /*!< Register base address          */

 

  CAN_InitTypeDef             Init;       /*!< CAN required parameters        */

 

  CanTxMsgTypeDef*            pTxMsg;     /*!< Pointer to transmit structure  */

 

  CanRxMsgTypeDef*            pRxMsg;     /*!< Pointer to reception structure */

 

  __IO HAL_CAN_StateTypeDef   State;      /*!< CAN communication state        */

 

  HAL_LockTypeDef             Lock;       /*!< CAN locking object             */

 

  __IO uint32_t               ErrorCode;  /*!< CAN Error code                 */

 

}CAN_HandleTypeDef;

// CAN配置结构体 

// 前5个参数来设置 CAN_BTR —— 波特率

// 后6个参数用来设置 CAN_MCR —— 通信相关的控制位

typedef struct

{

  uint32_t Prescaler;  /*!< Specifies the length of a time quantum.

                            This parameter must be a number between Min_Data = 1 and Max_Data = 1024 */

 

  uint32_t Mode;       /*!< Specifies the CAN operating mode.

                            This parameter can be a value of @ref CAN_operating_mode */

 

  uint32_t SJW;        /*!< Specifies the maximum number of time quanta

                            the CAN hardware is allowed to lengthen or

                            shorten a bit to perform resynchronization.

                            This parameter can be a value of @ref CAN_synchronisation_jump_width */

 

  uint32_t BS1;        /*!< Specifies the number of time quanta in Bit Segment 1.

                            This parameter can be a value of @ref CAN_time_quantum_in_bit_segment_1 */

 

  uint32_t BS2;        /*!< Specifies the number of time quanta in Bit Segment 2.

                            This parameter can be a value of @ref CAN_time_quantum_in_bit_segment_2 */

 

  uint32_t TTCM;       /*!< Enable or disable the time triggered communication mode.

                            This parameter can be set to ENABLE or DISABLE. */

 

  uint32_t ABOM;       /*!< Enable or disable the automatic bus-off management.

                            This parameter can be set to ENABLE or DISABLE */

 

  uint32_t AWUM;       /*!< Enable or disable the automatic wake-up mode.

                            This parameter can be set to ENABLE or DISABLE */

 

  uint32_t NART;       /*!< Enable or disable the non-automatic retransmission mode.

                            This parameter can be set to ENABLE or DISABLE */

 

  uint32_t RFLM;       /*!< Enable or disable the receive FIFO Locked mode.

                            This parameter can be set to ENABLE or DISABLE */

 

  uint32_t TXFP;       /*!< Enable or disable the transmit FIFO priority.

                            This parameter can be set to ENABLE or DISABLE */

}CAN_InitTypeDef;

// 过滤器设置

typedef struct

{

  uint32_t FilterIdHigh;          /*!< Specifies the filter identification number (MSBs for a 32-bit

                                       configuration, first one for a 16-bit configuration).

                                       This parameter must be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */

 

  uint32_t FilterIdLow;           /*!< Specifies the filter identification number (LSBs for a 32-bit

                                       configuration, second one for a 16-bit configuration).

                                       This parameter must be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */

 

  uint32_t FilterMaskIdHigh;      /*!< Specifies the filter mask number or identification number,

                                       according to the mode (MSBs for a 32-bit configuration,

                                       first one for a 16-bit configuration).

                                       This parameter must be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */

 

  uint32_t FilterMaskIdLow;       /*!< Specifies the filter mask number or identification number,

                                       according to the mode (LSBs for a 32-bit configuration,

                                       second one for a 16-bit configuration).

                                       This parameter must be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */

 

  uint32_t FilterFIFOAssignment;  /*!< Specifies the FIFO (0 or 1) which will be assigned to the filter.

                                       This parameter can be a value of @ref CAN_filter_FIFO */

 

  uint32_t FilterNumber;          /*!< Specifies the filter which will be initialized.

                                       This parameter must be a number between Min_Data = 0 and Max_Data = 27 */

 

  uint32_t FilterMode;            /*!< Specifies the filter mode to be initialized.

                                       This parameter can be a value of @ref CAN_filter_mode */

 

  uint32_t FilterScale;           /*!< Specifies the filter scale.

                                       This parameter can be a value of @ref CAN_filter_scale */

 

  uint32_t FilterActivation;      /*!< Enable or disable the filter.

                                       This parameter can be set to ENABLE or DISABLE. */

 

  uint32_t BankNumber;            /*!< Select the start slave bank filter.

                                       This parameter must be a number between Min_Data = 0 and Max_Data = 28 */

 

}CAN_FilterConfTypeDef;

// 模式  我们使用普通模式

#define CAN_MODE_NORMAL             ((uint32_t)0x00000000U)                     /*!< Normal mode   */

#define CAN_MODE_LOOPBACK           ((uint32_t)CAN_BTR_LBKM)                   /*!< Loopback mode */

#define CAN_MODE_SILENT             ((uint32_t)CAN_BTR_SILM)                   /*!< Silent mode   */

推荐阅读

史海拾趣

Boundary Devices公司的发展小趣事

为了进一步扩大市场份额,Boundary Devices积极实施国际化战略。公司通过与全球各地的合作伙伴建立合作关系,将产品推向国际市场。同时,公司还积极参加国际电子展会和技术交流活动,与全球同行进行深入的交流与合作,不断提升公司的国际影响力。

ABL Aluminum Components公司的发展小趣事

随着技术的成熟,ABL公司开始积极拓展市场。公司通过与大型电子产品制造商建立合作关系,将其铝合金组件应用于更广泛的领域。同时,ABL公司也注重品牌建设,通过参加行业展会、发布技术白皮书等方式,提升公司在业内的知名度和影响力。随着市场份额的逐步扩大,ABL公司逐渐成为了电子行业铝合金组件领域的领军企业。

Aces Electronics Co Ltd公司的发展小趣事

在发展过程中,Aces也面临过各种挑战和危机。例如,原材料价格波动、市场竞争激烈、贸易壁垒等因素都曾经给公司带来不小的压力。然而,Aces凭借敏锐的市场洞察力和强大的危机管理能力,成功应对了这些挑战。公司及时调整采购策略、优化产品结构、拓展销售渠道等措施,有效缓解了外部压力,保持了稳定的发展态势。

这些故事虽然基于假设和推测,但反映了一个电子企业在发展过程中可能遇到的各种情况。无论面对技术挑战、市场竞争还是行业变革,Aces Electronics Co., Ltd.都展现了坚韧不拔、勇往直前的精神风貌。未来,公司将继续致力于技术创新和市场拓展,为电子行业的发展贡献更多力量。

Analog Microwave Design公司的发展小趣事

随着通信技术的不断进步,对微波器件的性能要求也越来越高。Analog Microwave Design公司敏锐地捕捉到了这一市场变化,开始致力于研发更高性能的微波器件。经过多次试验和改进,公司成功开发出了一款具有低损耗、高稳定性的微波放大器,这一创新产品在市场上引起了热烈反响。公司凭借这一技术突破,迅速扩大了市场份额,并树立了行业内的技术领先地位。

淩志比高公司的发展小趣事

在追求经济效益的同时,淩志比高公司也积极履行社会责任。公司注重环保和可持续发展,采用环保材料和生产工艺,减少对环境的影响。此外,淩志比高还积极参与社会公益事业,为社会做出贡献。这种负责任的态度赢得了社会各界的认可和尊重。

请注意,以上故事仅为虚构示例,并不代表任何真实公司的实际情况。如果您对淩志比高公司有进一步的了解需求,建议直接访问其官方网站或查阅相关新闻报道以获取准确信息。

光大芯业公司的发展小趣事

面对全球经济的不确定性和市场竞争的加剧,光大芯业始终保持着清醒的头脑和坚定的信念。他们积极应对各种挑战,通过优化管理、提升效率、降低成本等措施,不断提高自身的竞争力。同时,公司还加大了对新技术、新产品的研发投入,以保持在市场上的领先地位。正是这种不断进取的精神和坚定的信念,让光大芯业在电子行业中不断发展壮大。

问答坊 | AI 解惑

介绍RFID技术前沿的一篇文章 很经典

介绍RFID技术前沿的一篇文章 很经典 …

查看全部问答>

大竞争时代 2012年液晶面板将出现供给过剩

本帖最后由 jameswangsynnex 于 2015-3-3 19:58 编辑 在中国,京东方科技集团(BOE Technology Group)及华星光电技术(Shenzhen China Star Optoelectronics Technology)等本土企业将从2011年下半年开始利用第7.5代(底板尺寸为1950mm×2250mm) ...…

查看全部问答>

VirtualAlloc,分配的空间大小可以超过32MB吗?

我的开发板有128M的内存。 OS分配32MB RAM分配32MB 显存分配64MB 这样可以吗? 显存的空间需要用VirtualAlloc来做,我的bsp里是这么做的,但是它限制大小为小于32M。…

查看全部问答>

用SDK还是用MFC开发windows CE应用程序

大家在开发windows CE应用程序时候. 一般是用SDK还是用MFC? 用MFC是否比SDK生成的代码量大很多. 实时性能也会比SDK的差? …

查看全部问答>

请问什么是网络控制器啊?小弟我是新手(在线等)

还有我这里有一个     泓格PISO-730 PCI总线开关量输入/输出卡 买的时候有光盘,但怎么也装不上去 发现新硬件“网络控制器”但是安装驱动以后怎么也装不上 估计我装的方法有问题或者有别的什么问题 请教达人指点,小弟在这 ...…

查看全部问答>

用IAR调试一段程序,出现如下状况,请问是什么意思?

用IAR调试一段程序,出现如下状况,请问是什么意思?   PS:我没设置断点   [ 本帖最后由 zzbaizhi 于 2012-2-24 14:57 编辑 ]…

查看全部问答>

TI冠名全国大学生电赛的培训资料

╮(╯▽╰)╭学了好久的课程,不过已经第四批了,还没有轮上我。好想用用那个触摸板啊。难过之余,发给各位同学一份资料。这是我们培训时,官方给的培训光盘里面的资料。希望对大家的学习有帮助。所以求人品,,,,,,希望下一批的名单里面有我啊 ...…

查看全部问答>

发现 raw os + ucgui+uip+lwip+ fatfs 一整套全部都能在VC 上模拟!

没有开发板的朋友们真是幸福呀,而且debug 功能太丰富了。…

查看全部问答>