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

can串行接口之简单测试

[复制链接]
eefishing 发布时间:2019-12-20 00:08
can接口相对是一种常用的串行接口,但是不像spi、i2c、uart等接口都有主从的关系,can可以任何一个节点主动发送数据,并且假如出现总线冲突会有硬件来处理。
9 r: J* \) D7 Y' ^! x* g
can和rs485又有些类似,都是把ttl信号转换成了差分信号。所以在stm32 使用can的时候会有一个can收发器。
5 S! F2 h0 @2 u  R$ D8 W

& i' B7 s; s. y0 S: v

* x& [9 b  K- f/ P6 \  Q
从电路上看起来也很简单,stm32也是通过can tx、rx两根线和收发器相连。所以假如我们要测试can的发送,是不是只接can tx脚就可以了?
& \) n) ^' l8 L4 @2 k
我最开始也以为这样就可以,但是深究can的总线冲突检测原理就会发现这样行不通的。因为can 在发送数据的时候也会同时接收发送的数据,通过把接收的数据和内部发送寄存器的数据做对比,是不是一致就知道总线有没有冲突。所以在正常情况(这里意味着非正常情况下也可以)下can rx不接就到这发送出去的数据无法收到从而硬件自动判断为发送失败。

8 x9 }/ Q/ @; P2 x6 w
所以要保证发送数据成功,can tx脚和can rx脚要都接上,并且确保can收发器供电正常。
" @" }' U% |- A6 R% ]& _
硬件上就这些主要注意点,接下来就主要是软件的配置了。
0 d% I3 I  ~  d% Y- D7 a  C7 }' _
一般stm32 配置can有以下几大步骤:
$ A; s& @4 M" S* [
  • can的初始化(cubemx直接可以生成代码)
  • can的启动
  • can滤波器的设置(用来接收的,发送的时候可以不用配置它)
  • can执行发送数据请求
  • 我们只测试can的发送,所以就只用关系1、2、4步骤就可以了。
    ' s& l0 N5 Z; M, q3 K9 C6 C

: u6 C8 Q& b$ o& S+ ^
第一步,配置stm32cubemx(基于stm32f072cb)% C, K$ f( g) d" Q% F1 U
3 n; c) J- G* h* k& @0 n  Y
1 U8 H( `; m. X# b9 R( x
如上图所示,最关键主要配置如下三个参数,分频数我这里配置48,下面的time Quantum值就会自动计算出来。因为can时钟是48mhz经过48分频后,一个单位时间就是1us=1000ns。
/ a8 w3 X7 H* ?; {0 P% i8 k) L, S
因为我想要100k波特率,然后填写下面的Time segment1(简称 Tbs1 )和Time segment2 (简称 Tbs2) 为5和4。那么具体波特率该怎么计算还是要看看官方手册的描述:
+ ?% w- t$ R. f7 g0 W$ t  w- b1 Z% w
. k1 ?3 b% o) Y& H" I
根据如上描述,能决定波特率的也就是三个参数:分频值、Tbs1、Tbs2。需要注意的是,这个SYNC_SEG的1tq是固定值。和stm32cubemx中的jump width不要弄混淆了。jump width这个时间参数是作为补偿时间的上线,当时间有偏差的时候,就会自动补偿,最长时间不能超过该参数设定值。
7 b" @. U9 [) y
配置完以后就可以生成MDK工程了。

/ y0 q7 e8 R( [8 f6 P$ |; S( w
第二步:启动can
$ s* F# ?- `) S" h
通过stm32cubemx生成的工程就已经配置好了can参数,我们直接调用一条语句就可以启动can。

/ e0 i) Z! p( [
HAL_CAN_Start(&hcan);
' o' B9 M' ]7 e# Y  v$ l: _  C0 {& q
第三步:发送数据
7 f, T- q5 ]# i- f' r+ c
6 d) A( H) ^9 ~6 O2 q  W3 ]
can数据和串口数据不同,你写0x55就发送0x55。而can的数据都是以包为单位的,所以要发送数据我们就要填充包,在程序里面就是填充结构体,填充完以后进行发送请求。

5 }# M) ~& {- v4 F: U' j
CAN_TxHeaderTypeDef   TxHeader;0 D$ Y. `! U3 y' i- B# {5 ]! L
uint8_t               TxData[8]="12345678";
3 y0 m3 ]2 B( y0 cuint32_t              TxMailbox;TxHeader.StdId = 0x321;* e  P7 d6 h# |- D
TxHeader.RTR = CAN_RTR_DATA;TxHeader.IDE = CAN_ID_STD;( C% h* Z. L2 L! M
TxHeader.DLC = 8;
0 b, x  x% T5 |" W- r4 b$ x: eTxHeader.TransmitGlobalTime = DISABLE;
' u, E$ `1 }& N0 G8 |6 zif(HAL_CAN_AddTxMessage(&hcan, &TxHeader, TxData, &TxMailbox)==HAL_OK)
* q+ _$ K5 [5 T; k; L) |+ D/ r0 R{
0 }" u& c9 B7 p. y$ k    HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
6 q- B0 b1 v3 w* h" a}
' W* a% `" _9 s# a
  l  M6 C: l' Z9 `
如果硬件没问题,这时候通过can总线就可以接收到发送的数据。(这个要通过pc接收就需要一个usb can接收的硬件工具)。
莫慌,还没完……
: [" V6 r+ Q8 |  g) u- g$ v
记不记得在前面,我们提到过在正常情况下can rx和can tx引脚都需要连接到can 收发器。那么实际上stm32 除了正常模式还有几种特殊模式:

- g: h# j$ W2 R  r7 [9 u' P" B
  • slient mode(静音模式)
  • Loopback mode(回环模式)
  • Loopback and slient mode
    ' G* s6 F6 b* s: r
5 X4 f# O, P/ \: E" t" v
6 D0 s* d" w: u' V
通过上图可以很容易明白这几种模式区别:
3 k0 |4 ^" h+ Y
正常模式:内部的tx和外部TX引脚相连,内部rx和外部RX引脚相连;内部rx和tx是不相连的。

* c) @3 O5 |% S) V; ^
静音模式:can可以接收外部的数据但是发送不出去,同时内部tx和rx相通
& s9 ^9 {; H. T9 C) {+ J3 q
回环模式:can可以发送出去数据但是接收不到外部的数据,同时内核tx和rx相通

  C* p) _4 }% I$ z3 t
所以在回环模式下就可以实现CAN RX引脚不接收发器也能发送出来数据。

- M( y' f. ?; c* R) ?: t0 c5 V
/ o* A, g0 d: [6 |
赞 收藏 评论0 发布时间:2019-12-20 00:08

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版