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

can串行接口之简单测试

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

( H( K6 {: w, a2 t, i$ f, }7 `
can和rs485又有些类似,都是把ttl信号转换成了差分信号。所以在stm32 使用can的时候会有一个can收发器。

4 s4 G) G6 M7 r3 H& a3 m: M5 ]0 f) W! Y0 u

3 c# i& D8 V8 u% Y0 l* r
从电路上看起来也很简单,stm32也是通过can tx、rx两根线和收发器相连。所以假如我们要测试can的发送,是不是只接can tx脚就可以了?
' Y" `; v9 Y: x$ U# ?) [- o  l
我最开始也以为这样就可以,但是深究can的总线冲突检测原理就会发现这样行不通的。因为can 在发送数据的时候也会同时接收发送的数据,通过把接收的数据和内部发送寄存器的数据做对比,是不是一致就知道总线有没有冲突。所以在正常情况(这里意味着非正常情况下也可以)下can rx不接就到这发送出去的数据无法收到从而硬件自动判断为发送失败。
1 l" t0 W( T5 k
所以要保证发送数据成功,can tx脚和can rx脚要都接上,并且确保can收发器供电正常。

( t: u  x8 A) W5 B5 a' G+ g
硬件上就这些主要注意点,接下来就主要是软件的配置了。
1 l. J; q' f! a' z) g- N6 i$ S
一般stm32 配置can有以下几大步骤:
+ _; q2 [8 h/ ~7 Q# U8 J& `
  • can的初始化(cubemx直接可以生成代码)
  • can的启动
  • can滤波器的设置(用来接收的,发送的时候可以不用配置它)
  • can执行发送数据请求
  • 我们只测试can的发送,所以就只用关系1、2、4步骤就可以了。. j0 j; K, d4 I' H3 n8 `

- A8 }* Z3 [+ n: q5 J3 [2 z
第一步,配置stm32cubemx(基于stm32f072cb)
7 U6 @0 N, E1 U/ {3 }. j) ]" ^) j9 [' K# u' e1 I3 r% ?
1 p' V: Q9 n3 t6 N) n, T6 z
如上图所示,最关键主要配置如下三个参数,分频数我这里配置48,下面的time Quantum值就会自动计算出来。因为can时钟是48mhz经过48分频后,一个单位时间就是1us=1000ns。
4 M( V; y$ k9 E& h' y
因为我想要100k波特率,然后填写下面的Time segment1(简称 Tbs1 )和Time segment2 (简称 Tbs2) 为5和4。那么具体波特率该怎么计算还是要看看官方手册的描述:
1 K7 k$ |: e3 i8 q$ F* b
; c9 p4 D% u8 ?! z  e
根据如上描述,能决定波特率的也就是三个参数:分频值、Tbs1、Tbs2。需要注意的是,这个SYNC_SEG的1tq是固定值。和stm32cubemx中的jump width不要弄混淆了。jump width这个时间参数是作为补偿时间的上线,当时间有偏差的时候,就会自动补偿,最长时间不能超过该参数设定值。
4 f2 o: U% u; W# Y; Y
配置完以后就可以生成MDK工程了。

2 f& W! Y7 }. I
第二步:启动can7 g. V5 G, _4 y2 n, V% p
通过stm32cubemx生成的工程就已经配置好了can参数,我们直接调用一条语句就可以启动can。
7 @. |7 d' {1 s! Q( l5 x9 C
HAL_CAN_Start(&hcan);* p. W% T; f3 X

% f, H) C5 s& h1 X$ x第三步:发送数据9 F! t+ z, v& l' P, m  A) f
  U) B' y9 V$ u! Q& b
can数据和串口数据不同,你写0x55就发送0x55。而can的数据都是以包为单位的,所以要发送数据我们就要填充包,在程序里面就是填充结构体,填充完以后进行发送请求。

! T. I- ?) f' a+ b
CAN_TxHeaderTypeDef   TxHeader;) C$ N- P0 b; A, t" B
uint8_t               TxData[8]="12345678";
' v) i6 w9 Y! t* C. g4 ]' Ruint32_t              TxMailbox;TxHeader.StdId = 0x321;. j4 p) j6 m: b" B8 z) \  E" r
TxHeader.RTR = CAN_RTR_DATA;TxHeader.IDE = CAN_ID_STD;
: R! P0 l1 `' I: L* ]TxHeader.DLC = 8;
$ u. Z1 f' f2 B+ V, YTxHeader.TransmitGlobalTime = DISABLE;& i: t$ L) ?% i; D( }1 U
if(HAL_CAN_AddTxMessage(&hcan, &TxHeader, TxData, &TxMailbox)==HAL_OK)! z- T+ o/ }. J$ v) q* \7 g! B
{
$ h  z* `7 P$ `3 H5 p3 K% p. h    HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
! W; {! y8 a3 a% v/ q3 t# V}: V/ E+ t  D8 l5 G5 P) n/ C

  x/ t$ b) S1 s* A0 S- q( P
如果硬件没问题,这时候通过can总线就可以接收到发送的数据。(这个要通过pc接收就需要一个usb can接收的硬件工具)。
莫慌,还没完……, H2 F% v0 T# Y+ V
记不记得在前面,我们提到过在正常情况下can rx和can tx引脚都需要连接到can 收发器。那么实际上stm32 除了正常模式还有几种特殊模式:

/ t; f5 F( Z7 S$ u8 @& d3 \( N
  • slient mode(静音模式)
  • Loopback mode(回环模式)
  • Loopback and slient mode
    . ~3 H* [) U1 o" ^6 o6 Q& u! y
1 b2 Y! ]. h/ s1 t# a. }& U

6 A' c# z( g2 k7 L- y6 c
通过上图可以很容易明白这几种模式区别:

- I3 E/ r2 @4 e- b: S
正常模式:内部的tx和外部TX引脚相连,内部rx和外部RX引脚相连;内部rx和tx是不相连的。
% S$ m; G$ h; _2 m4 `8 Q
静音模式:can可以接收外部的数据但是发送不出去,同时内部tx和rx相通
, S& y, D, S/ ?8 X$ K( f
回环模式:can可以发送出去数据但是接收不到外部的数据,同时内核tx和rx相通

  {! u( r% M$ _$ Q6 Y0 C
所以在回环模式下就可以实现CAN RX引脚不接收发器也能发送出来数据。
  C+ x+ r+ k6 H' y" T4 w" C
" T" \. Z* [1 h3 P" C* d6 g
收藏 评论0 发布时间:2019-12-20 00:08

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版