你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

can串行接口之简单测试

[复制链接]
eefishing 发布时间:2019-12-20 00:08
can接口相对是一种常用的串行接口,但是不像spi、i2c、uart等接口都有主从的关系,can可以任何一个节点主动发送数据,并且假如出现总线冲突会有硬件来处理。
4 A  p4 G' i1 D8 v1 F
can和rs485又有些类似,都是把ttl信号转换成了差分信号。所以在stm32 使用can的时候会有一个can收发器。

. R/ c' n2 T4 d; ]: s
7 z- J; w( `+ ^7 ]5 U0 ~
8 n/ l% Z. s4 \; r1 e4 ~
从电路上看起来也很简单,stm32也是通过can tx、rx两根线和收发器相连。所以假如我们要测试can的发送,是不是只接can tx脚就可以了?

' a& S. A/ K3 V# ~/ \( w
我最开始也以为这样就可以,但是深究can的总线冲突检测原理就会发现这样行不通的。因为can 在发送数据的时候也会同时接收发送的数据,通过把接收的数据和内部发送寄存器的数据做对比,是不是一致就知道总线有没有冲突。所以在正常情况(这里意味着非正常情况下也可以)下can rx不接就到这发送出去的数据无法收到从而硬件自动判断为发送失败。
: L; I1 l- i  p0 x0 |4 p
所以要保证发送数据成功,can tx脚和can rx脚要都接上,并且确保can收发器供电正常。
& R0 D& ~3 D9 y6 T
硬件上就这些主要注意点,接下来就主要是软件的配置了。
3 `& S" B/ X% o- C+ ~3 y/ H4 a- B. f
一般stm32 配置can有以下几大步骤:
4 e5 C6 ~8 y0 q
  • can的初始化(cubemx直接可以生成代码)
  • can的启动
  • can滤波器的设置(用来接收的,发送的时候可以不用配置它)
  • can执行发送数据请求
  • 我们只测试can的发送,所以就只用关系1、2、4步骤就可以了。
    8 k5 K. ~5 ?8 I' j/ W' t+ z

) G. I& p/ |, r
第一步,配置stm32cubemx(基于stm32f072cb)
  b& Y0 W1 o, B) e) D
5 v% J2 n5 Y. I7 U& j  ]' }- E; e( }
5 K  L: y- z% f1 S7 {. L: b
如上图所示,最关键主要配置如下三个参数,分频数我这里配置48,下面的time Quantum值就会自动计算出来。因为can时钟是48mhz经过48分频后,一个单位时间就是1us=1000ns。
# [5 l. e: |4 b" C) [4 ?
因为我想要100k波特率,然后填写下面的Time segment1(简称 Tbs1 )和Time segment2 (简称 Tbs2) 为5和4。那么具体波特率该怎么计算还是要看看官方手册的描述:

! [0 a" m5 C) z5 G) o* c
! M) M8 P* ?* R+ j8 s; u/ S7 _, q
根据如上描述,能决定波特率的也就是三个参数:分频值、Tbs1、Tbs2。需要注意的是,这个SYNC_SEG的1tq是固定值。和stm32cubemx中的jump width不要弄混淆了。jump width这个时间参数是作为补偿时间的上线,当时间有偏差的时候,就会自动补偿,最长时间不能超过该参数设定值。
0 X# |  y# V* j8 k6 D: w* S: f
配置完以后就可以生成MDK工程了。

! X" F, |$ x8 T6 U/ s5 g
第二步:启动can
' C$ S, ~6 |( n
通过stm32cubemx生成的工程就已经配置好了can参数,我们直接调用一条语句就可以启动can。

, @6 X# N4 W: y* Y
HAL_CAN_Start(&hcan);' a4 d6 i. M* o3 [
8 B3 N- K2 Y) O) r  u. @- |
第三步:发送数据$ K, n# I5 W' \- Y

7 J5 w" A! L3 K
can数据和串口数据不同,你写0x55就发送0x55。而can的数据都是以包为单位的,所以要发送数据我们就要填充包,在程序里面就是填充结构体,填充完以后进行发送请求。

2 N& K8 Q; w4 n9 V" ^
CAN_TxHeaderTypeDef   TxHeader;
, I' [0 L0 n, w7 y. r, b3 Iuint8_t               TxData[8]="12345678";
+ F/ m) X* W$ N# T$ o( \uint32_t              TxMailbox;TxHeader.StdId = 0x321;
# O! h; u2 ?! v9 B3 S9 `TxHeader.RTR = CAN_RTR_DATA;TxHeader.IDE = CAN_ID_STD;
) _$ g- d" B2 S& {, fTxHeader.DLC = 8;
9 v5 T: M+ Y+ a1 g2 t5 n3 p0 R" cTxHeader.TransmitGlobalTime = DISABLE;2 F1 |  H6 y; D
if(HAL_CAN_AddTxMessage(&hcan, &TxHeader, TxData, &TxMailbox)==HAL_OK)( _, v9 X2 M! Z6 c- R6 P6 ~
{( m" b! j" M. o1 V+ V
    HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);- K/ _0 v  T' o, i6 P5 M1 f0 r
}
, P' I5 v% J" h9 S* I5 d5 Q5 W) I( w4 D0 M9 f
如果硬件没问题,这时候通过can总线就可以接收到发送的数据。(这个要通过pc接收就需要一个usb can接收的硬件工具)。
莫慌,还没完……3 y4 ~3 J% [5 O3 d+ I
记不记得在前面,我们提到过在正常情况下can rx和can tx引脚都需要连接到can 收发器。那么实际上stm32 除了正常模式还有几种特殊模式:
0 ~3 w+ F9 L5 y- b
  • slient mode(静音模式)
  • Loopback mode(回环模式)
  • Loopback and slient mode
    3 c* r" E4 `0 U0 y- g
" d  R* h% F( L2 C4 ]
% x- L" y8 R8 I5 q% L
通过上图可以很容易明白这几种模式区别:
0 @* p# G' j2 ]7 r3 u- d  T& _
正常模式:内部的tx和外部TX引脚相连,内部rx和外部RX引脚相连;内部rx和tx是不相连的。

) d9 P3 L  j6 S8 f+ ~
静音模式:can可以接收外部的数据但是发送不出去,同时内部tx和rx相通
8 D" i$ f: U4 Q5 W
回环模式:can可以发送出去数据但是接收不到外部的数据,同时内核tx和rx相通

$ m- Q6 b* V, I3 ]: N
所以在回环模式下就可以实现CAN RX引脚不接收发器也能发送出来数据。

; A) ?1 m$ q0 p( w' N7 {! `7 @6 h8 I
0 F+ @; f4 \! i* v" O
收藏 评论0 发布时间:2019-12-20 00:08

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版