|
<
目次
CAN和谈引见
物理层
闭环总线收集
开环总线收集
通信节面
好分旌旗灯号
和谈层简介
CAN的波特率
位时序
帧范例、感化及格式
数据帧
STM32CAN中设
CAN 收收邮箱
CAN 吸取 FIFO
有用动静
吸取处置
上溢
标识符挑选
CAN1取CAN2团体逻辑
HAL库函数
CAN和谈引见
物理层
CAN 通信并非以时钟旌旗灯号去停止同步的,它是一种同步通信,只具有 CAN_High 战 CAN_Low 两条旌旗灯号线,配合组成一组好分旌旗灯号线,以好分旌旗灯号的情势停止通信。
CAN的物理层有两种拓扑构造,闭环总线收集战开环总线收集,我们将顺次引见他们。
闭环总线收集
闭环收集的特性是:下速、远间隔。
它的总线最年夜少度为 40m,通信速率最下为1Mbps,总线的两头各请求有一个“120 欧”的电阻。
CAN闭环总线收集拓扑构造 开环总线收集
闭环收集的特性是:低速、近间隔。
它的最年夜传输间隔为1km,最下通信速度为 125kbps,两根总线是自力的、没有构成闭环,请求每根总线上各串连有一个“2.2 千欧”的电阻。
CAN闭环总线收集拓扑构造 通信节面
CAN 总线上能够挂载多个通信节面,节面之间的旌旗灯号 颠末总线传输,完成节面间通信。
因为 CAN 通信和谈不合错误节面停止地点编码,而是对数据内乱容停止编码的,以是收集中的节面个数实际上没有受限定,只需总线的背载充足便可,能够经由过程中继器加强背载。
CAN 通信节面由一个 CAN 掌握器及 CAN 支收器构成,掌握器取支收器之间经由过程 CAN_Tx 及 CAN_Rx 旌旗灯号线相连,支收器取 CAN 总线之间利用 CAN_High 及 CAN_Low 旌旗灯号线相连。而 CAN_High 及 CAN_Low 是一对好分旌旗灯号线,利用好分旌旗灯号。
好分旌旗灯号
取传统利用单根旌旗灯号线电压暗示逻辑的方法有区分,利用好分旌旗灯号传输时,需求两根旌旗灯号线,那两个旌旗灯号线的振幅相称,相位相反,经由过程两根旌旗灯号线 的电压好值去暗示逻辑 0 战逻辑 1。
好分旌旗灯号传输具有以下长处:
- 抗滋扰才能强,当中界存正在噪声滋扰时,险些会同时耦开到两条旌旗灯号线上。以是中界的共模噪声能够被完整抵消。
- 能有用抑止它对内部的电磁滋扰,一样的原理,因为两根旌旗灯号的极性相反,他们对中辐射的电磁场能够互相抵消,耦开的越精细,鼓放到中界的电磁能量越少。
- 时序定位精确,因为好分旌旗灯号的开闭变革是位于两个旌旗灯号的交面,而没有像一般单端旌旗灯号依托上下两个阈值电压断定,因此受工艺,温度的影响小,能降低时序上的偏差,同时也更合适于低幅度旌旗灯号的电路。
CAN旌旗灯号下速CAN低速CAN电仄隐性隐性隐性隐性CAN_H 3.50
2.504.001.75CAN_L1.502.501.003.25电位好2.0003.00-1.50 因为CAN总线的仲裁机造采纳“线取”的方法对总线上的旌旗灯号停止仲裁。因而,假设有两个 CAN 通信节面,正在统一工夫,一个输出隐性电仄,另外一个输出隐性电仄,“线取”的总线仲裁机造将使它处于隐性电仄形态。因而低电仄“0”被成为隐性电仄。
物理层特征总结 和谈层简介
CAN的波特率
因为 CAN 属于同步通信,出偶然钟旌旗灯号线,毗连正在统一个总线收集中的各个节面会像串心同步通信那样,节面间利用商定好的波特率停止通信
总线上的各个通信节面只需商定好 1 个 Tq 的工夫少度和每个数据位占有几个Tq,就能够肯定 CAN 通信的波特率。
位时序
为了完成位同步,正在STM32数据脚册中经由过程将标称位工夫别离为以下三段
- 同步段 (SYNC_SEG):位变革该当正在此工夫段内乱发作。它只要一个工夫片的牢固少度 (1 x tCAN)
- 位段 1 (BS1):界说采样面的地位。它包罗 CAN 尺度的 PROP_SEG 战 PHASE_SEG1。 其连续少度能够正在 1 到 16 个工夫片之间调解,但也能够主动减少,以补偿差别收集节 面的频次差别所招致的正相位漂移。
- 位段 2 (BS2):界说收收面的地位。它代表 CAN 尺度的 PHASE_SEG2。其连续少度可 以正在 1 到 8 个工夫片之间调解,但也能够主动收缩,以补偿背相位漂移。
闭于同步,还有硬件同步、再同步等操纵。更多闭于位时序的内乱容能够参看 ISO 11898 尺度。
帧范例、感化及格式
为了更有用天掌握通信,CAN 一共划定了 5 品种型的帧:
我们正在那里次要引见一下数据帧
数据帧
数据帧由 7 个段组成:
- 帧肇端:暗示数据帧开端的段.
- 仲裁段:暗示该帧劣先级的段。
- 掌握段:暗示数据的字节数及保存位的段。
- 数据段:数据的内乱容,可收收 0~8 个字节的数据。
- CRC段:查抄帧的传输毛病的段。
- ACK段:暗示确认一般吸取的段。
- 帧完毕:暗示数据帧完毕的段。
帧肇端
暗示帧开端的段。1 个位的隐性位。
仲裁段
暗示数据的劣先级的段。
尺度格局战扩大格局正在此的组成有所差别。
掌握段
掌握段由 6 个位组成,暗示数据段的字节数。尺度格局战扩大格局的组成有所差别。
数据段
数据段可包含 0~8 个字节的数据。从 MSB(最下位)开端输出。
CRC段
CRC 段是查抄帧传输毛病的帧。由 15 个位的 CRC 挨次战 1 个位的 CRC 界定符(用于分开的位)组成。
ACK段
ACK 段用去确认能否一般吸取。由 ACK 槽(ACK Slot)战 ACK 界定符 2 个位组成。
帧完毕
帧完毕是暗示该该帧的完毕的段。由 7 个位的隐性位组成。
STM32CAN中设
从图上我们能够看到,CAN 1取CAN 2为主从干系,CAN 1为Master ( 主 ) ,CAN 2为Slave ( 从 ) 。CAN 1战CAN 2有各自的3个收收邮箱,2个FIFO Buffer缓冲,6个吸取邮箱。可是,28个Filter 过滤器倒是共用的,我们能够划定,哪些Filter给谁人CAN用,以致能够正在法式运转的时分调控。
● CAN1:主 bxCAN,用于办理 bxCAN 取 512 字节 SRAM 存储器之间的通信。
● CAN2:从 bxCAN,没法间接会见 SRAM 存储器。
● 两个 bxCAN 单元同享 512 字节 SRAM 存储器
CAN 收收邮箱
CAN 1战CAN 2有各自的3个收收邮箱,最多能够缓存 3 个待收收的报文。
为了收收动静,法式必需正在恳求收收之前挑选一个空的收收邮箱,使邮箱退出空的形态,进进挂起形态。此时,关于挂起的邮箱,硬件没法再对其会见。进进挂起形态后,劣先级下的邮箱将劣先收收。收收后的邮箱将规复到空的形态。
CAN 吸取 FIFO
为了吸取 CAN 动静,供给了组成 FIFO 的三个邮箱。为了节流 CPU 背载,FIFO 完整由硬件停止办理。使用法式经由过程 FIFO 输出邮箱会见 FIFO 中所存储的动静。
有用动静
当动静根据 CAN 和谈准确吸取而且成功经由过程标识符挑选后,该动静将视为有用。
吸取处置
当吸取到报文时,FIFO 的报文计数器会自删,而 STM32 内乱部读与 FIFO 数据以后,报文计数器会自加,我们经由过程形态存放器可获知报文计数器的值
上溢
标识符挑选
正在 CAN 和谈中,动静的标识符取节面地点无闭,但取动静内乱容有闭。因而,收收器将动静播送给局部吸取器。正在吸取到动静时,吸取器节面会按照标识符的值去肯定硬件能否需求该动静。STM32 的 CAN 中设吸取报文前会先利用验支挑选器查抄,只吸取需求的报文到 FIFO 中。
CAN1取CAN2团体逻辑
CAN2 中设的构造取 CAN1 中设是一样的,他们共用挑选器且因为存储会见掌握器由 CAN1 掌握,以是要利用 CAN2 的时分必需要使能 CAN1 的时钟。
HAL库函数
- HAL_StatusTypeDef HAL_CAN_ActivateNotification(CAN_HandleTypeDef *hcan, uint32_t ActiveITs);
复造代码
- 参数
- hcan:指背CAN设置构造体
- ActiveITs:表白哪一个中止会被启动,开启改中止的动静提醒
- 返回值
- HAL_StatusTypeDef:假设开启成功,返回HAL_OK;假设失利,返回HAL_ERROR
- HAL_StatusTypeDef HAL_CAN_Start(CAN_HandleTypeDef *hcan);
复造代码
- 参数
- 返回值
- HAL_StatusTypeDef:假设开启成功,返回HAL_OK;假设失利,返回HAL_ERROR
- HAL_StatusTypeDef HAL_CAN_ConfigFilter(CAN_HandleTypeDef *hcan, CAN_FilterTypeDef *sFilterConfig);
复造代码
- 参数
- hcan:指背CAN设置构造体
- sFilterConfig:指背Filter过滤器设置构造体
- 返回值
- HAL_StatusTypeDef:假设开启成功,返回HAL_OK;假设失利,返回HAL_ERROR
- HAL_StatusTypeDef HAL_CAN_AddTxMessage(CAN_HandleTypeDef *hcan, CAN_TxHeaderTypeDef *pHeader, uint8_t aData[], uint32_t *pTxMailbox);
复造代码
- 参数
- hcan:指背CAN设置构造体
- pHeader:指背收收数据的设置构造体
- aData[]:指背需求收收的数据
- pTxMailbox:该函数会返回用于贮存收收数据的收收邮箱编号到该变量
- 返回值
- HAL_StatusTypeDef:假设增加成功,返回HAL_OK;假设失利,返回HAL_ERROR
- uint32_t HAL_CAN_IsTxMessagePending(CAN_HandleTypeDef *hcan, uint32_t TxMailboxes);
复造代码
- 参数
- hcan:指背CAN设置构造体
- TxMailboxes:指背收收数据的收收邮箱
- 返回值
- uint32_t:假设有收收数据正正在等候收收,返回1;假设出有,返回0
- void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan);
复造代码
- 正在写代码的时分,正在main.c中创立HAL_CAN_RxFifo0MsgPendingCallback函数
- 正在该函数中挖写正在FIFO 0中曾经出有正正在等候吸取的数据的时分开启中止,需求施行的代码
- HAL_StatusTypeDef HAL_CAN_GetRxMessage(CAN_HandleTypeDef *hcan, uint32_t RxFifo, CAN_RxHeaderTypeDef *pHeader, uint8_t aData[]);
复造代码
- 参数
- hcan:指背CAN设置构造体
- RxFifo:指背卖力吸取的FIFO
- pHeader:指背吸取数据的设置构造体
- aData[]:指背需求吸取的数据
- 返回值
- HAL_StatusTypeDef:假设吸取成功,返回HAL_OK;假设失利,返回HAL_ERROR
免责声明:假如进犯了您的权益,请联络站少,我们会实时删除侵权内乱容,感谢协作! |
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,按照目前互联网开放的原则,我们将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话,请您发送邮箱:Cdnjson@163.com提供相关证明,我们将积极配合您!
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。
|