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

can串行接口之简单测试

[复制链接]
eefishing 发布时间:2019-12-20 00:08
can接口相对是一种常用的串行接口,但是不像spi、i2c、uart等接口都有主从的关系,can可以任何一个节点主动发送数据,并且假如出现总线冲突会有硬件来处理。

& O- ?" M* t+ J
can和rs485又有些类似,都是把ttl信号转换成了差分信号。所以在stm32 使用can的时候会有一个can收发器。

7 ?& f+ t$ T7 V1 ]0 G0 s: p# _* ~! I& N& X
3 u" O- n  O* k" h
从电路上看起来也很简单,stm32也是通过can tx、rx两根线和收发器相连。所以假如我们要测试can的发送,是不是只接can tx脚就可以了?

6 T- _2 [9 Y" C5 A- L# s* O
我最开始也以为这样就可以,但是深究can的总线冲突检测原理就会发现这样行不通的。因为can 在发送数据的时候也会同时接收发送的数据,通过把接收的数据和内部发送寄存器的数据做对比,是不是一致就知道总线有没有冲突。所以在正常情况(这里意味着非正常情况下也可以)下can rx不接就到这发送出去的数据无法收到从而硬件自动判断为发送失败。
" z3 U; n6 Q9 w  i+ m- C6 J
所以要保证发送数据成功,can tx脚和can rx脚要都接上,并且确保can收发器供电正常。
# b8 u( A$ L5 `! A# @/ y$ s
硬件上就这些主要注意点,接下来就主要是软件的配置了。

" I- z/ h: q+ X1 R
一般stm32 配置can有以下几大步骤:

3 A" o; J5 T1 x; x
  • can的初始化(cubemx直接可以生成代码)
  • can的启动
  • can滤波器的设置(用来接收的,发送的时候可以不用配置它)
  • can执行发送数据请求
  • 我们只测试can的发送,所以就只用关系1、2、4步骤就可以了。
    4 {' n) w' f6 m, ]: v5 B: N

1 s+ x* g+ V" M- L2 j8 G" D1 r2 E; Q
第一步,配置stm32cubemx(基于stm32f072cb)1 ?9 Q6 W' ]) @. A2 }) t
; V, {" R* U2 M, m8 Q. \; P
! t9 Y' T) N5 K5 _
如上图所示,最关键主要配置如下三个参数,分频数我这里配置48,下面的time Quantum值就会自动计算出来。因为can时钟是48mhz经过48分频后,一个单位时间就是1us=1000ns。
8 l2 K  j! J' z2 e4 k7 N
因为我想要100k波特率,然后填写下面的Time segment1(简称 Tbs1 )和Time segment2 (简称 Tbs2) 为5和4。那么具体波特率该怎么计算还是要看看官方手册的描述:
$ d' y" P2 _5 N% e4 \
7 {& H! o7 [$ _2 L- I6 w; U
根据如上描述,能决定波特率的也就是三个参数:分频值、Tbs1、Tbs2。需要注意的是,这个SYNC_SEG的1tq是固定值。和stm32cubemx中的jump width不要弄混淆了。jump width这个时间参数是作为补偿时间的上线,当时间有偏差的时候,就会自动补偿,最长时间不能超过该参数设定值。
$ E9 J8 c% \3 l1 J- Q- o. {
配置完以后就可以生成MDK工程了。
, A9 r. j% p5 l
第二步:启动can1 Q; z! |% J+ S( q
通过stm32cubemx生成的工程就已经配置好了can参数,我们直接调用一条语句就可以启动can。
/ i* B5 @. r1 M- x
HAL_CAN_Start(&hcan);  b5 x; e7 i# _  Z
0 X3 y( Q% L  Z
第三步:发送数据
6 L4 a6 Z. i* h6 Y7 t, J. V( D1 U" H# C8 }% a+ Q
can数据和串口数据不同,你写0x55就发送0x55。而can的数据都是以包为单位的,所以要发送数据我们就要填充包,在程序里面就是填充结构体,填充完以后进行发送请求。

" q. p, E8 J: r1 _, ^
CAN_TxHeaderTypeDef   TxHeader;
/ s& h* h7 L% R5 H. R! nuint8_t               TxData[8]="12345678";
  ]; G' H1 c2 Q$ ?3 m' nuint32_t              TxMailbox;TxHeader.StdId = 0x321;
& F3 ^! p- N* v$ F6 TTxHeader.RTR = CAN_RTR_DATA;TxHeader.IDE = CAN_ID_STD;
9 J; f7 k- o, I8 k. CTxHeader.DLC = 8;9 M6 ]0 ^+ S9 t" |% Y; v) R4 i. b
TxHeader.TransmitGlobalTime = DISABLE;
) I0 N3 _  g% aif(HAL_CAN_AddTxMessage(&hcan, &TxHeader, TxData, &TxMailbox)==HAL_OK)
* r' Q3 f% f! V9 ^{
3 ^( P7 x. w& @! ^& }4 q    HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);9 |. w0 H  r/ Q
}: {! c0 D4 q. w9 T/ `
! p& z' R5 G- I4 r$ r; w
如果硬件没问题,这时候通过can总线就可以接收到发送的数据。(这个要通过pc接收就需要一个usb can接收的硬件工具)。
莫慌,还没完……2 h: q/ t' M6 w4 c" d6 K
记不记得在前面,我们提到过在正常情况下can rx和can tx引脚都需要连接到can 收发器。那么实际上stm32 除了正常模式还有几种特殊模式:
" a! f. p2 a% W$ b0 [, N9 d
  • slient mode(静音模式)
  • Loopback mode(回环模式)
  • Loopback and slient mode1 N: m3 t2 X/ N9 @4 Z; k% N/ _9 ~

& C6 w* ]/ E8 \2 ^1 S: \
: ?# R5 @9 s, D5 ^4 v( l3 h. b
通过上图可以很容易明白这几种模式区别:
) _/ r) l# m& m
正常模式:内部的tx和外部TX引脚相连,内部rx和外部RX引脚相连;内部rx和tx是不相连的。

. \, T( B7 ]0 H; d7 @2 b* \0 W& W$ b
静音模式:can可以接收外部的数据但是发送不出去,同时内部tx和rx相通

  Y6 C* E! @" ^% J5 Q9 f
回环模式:can可以发送出去数据但是接收不到外部的数据,同时内核tx和rx相通

/ _! @# s+ B; K8 V# g$ q
所以在回环模式下就可以实现CAN RX引脚不接收发器也能发送出来数据。

  \5 F* y8 W( V& ^. m
+ n/ r  l( Y5 g1 a
赞 收藏 评论0 发布时间:2019-12-20 00:08

举报

0个回答

所属标签

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