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

【年中粉丝节】STM32L476开发板-基于rtthread读取加速度传感器KX224数据

[复制链接]
andey 发布时间:2021-6-8 15:38
本文基于rtt的iic驱动框架来实现加速度传感器数据的读取测试,废话不多说开启正文。
6 y# H2 x/ w: ~1 s, u& P

: `4 c7 m4 E# q* L: v' Q+ v1.编译RT-thread加入I2c框架相关代码本实验使用的是官方代码中已经值支持bsp(\rt-thread\bsp\stm32\stm32l476-st-nucleo),默认的配置是没有组入软件IIC的软件框架。使用RTT 的ENV 工具很容易就可以将IIC软件框架代码组入系统,组入方法如下,在BSP目录下使用env工具,输入menuconfig。
/ e% @# X) k# K3 J
5 d* ^! Y! U: p5 t, ^
menuconfig.png

! f0 @9 u4 S- h2 c' \) C. O; E4 |" ^8 E: k* l
配置路径如下:
5 [9 x$ p- r: P& I

! e& d' @1 x5 v

" V. q1 f' U7 }6 S
i2c1.png

$ G  V8 Z% Y7 |, L( [! ]$ s' b0 O7 C: l8 O! |
即可开启I2C,并配置SCL,SDA对应的引脚ID即可。配置完成后,运行SCONS即可发现相关的IIC代码文件已经参与编译了,我的配置如下。
: L  j5 I4 [& a4 [1 o* K
config.png

2 _/ [2 ?8 u4 c5 J
  ^8 D" t. ^: a. }2 j" M% T9 m
2.适配加速度传感器,按照上一篇IIC驱动框架的理解,使用的时只要使用rt_i2c_bus_device_find查找对应的I2C设备,试验配置的名称为“i2c1”,找到相应的设备后调用rt_i2c_transfer 函数即可操作i2c总线的读和写操作了,所有的基于I2C总线的操作驱动框架已经集成,只需要用户实现芯片相关的配置即可而不用关心IIC协议的具体细节。适配过程中遇到两个问题。
$ l+ V. H! S8 Y  h$ U①i2c的地址问题,发送结合接收时地址设置为芯片手册对应的7bit地址值即可,开始的时候读和写操做设置的地址为实际的8位地址,总是应答NACK,跟了下代码发现底层代码会根据读写操做自动设定地址,自己的操作存粹是多此一举。
) E6 P, f) g! n3 `1 b9 P②因硬件上未配置总线上拉电阻,造作总线的时候总是失败,默认的IO配置的开漏输出是没有配置内部上拉的,所以总是失败,配置成内部上拉后总线就可以正常通信了。

9 z1 {( i4 v3 \3 O. c2 `

4 c6 u; J1 R4 K5 {+ _) w" a
0 d* T* d0 q/ C' E& V& H
iicSHIXU.png

1 E3 Z+ ~0 \+ w8 o* ]  Z, p8 C3 X) x8 H; ^( D  j/ C
iictime.png

5 e4 T$ N1 q  @( g
3.相关的测试代码如下:4 ]  ?0 f8 x# A$ Z0 n6 g0 e
①初始化KX224
1 q$ t/ O5 K/ h/ E2 m% m$ i
  1. static rt_uint32_t _g_sens;
    4 X+ _' ]/ o* L
  2. struct rt_i2c_bus_device* bus = NULL;
    ' q2 P7 b7 k; l' g6 C) \. b4 l" o

  3. - I3 f: w0 f+ P5 Z+ w5 y
  4. static void kx224_init(void). y8 S9 o6 k' F& }9 R  H. }* f
  5. {
    7 @6 z/ o, g1 `% E4 T! }* |
  6.         rt_uint8_t deviceid = 0,reg = 0,gsel = 0;
    & t3 k& c) D; q! P$ }4 s6 g
  7.         
    " E$ r% a; z) v/ g6 D$ {7 g
  8.     bus = rt_i2c_bus_device_find("i2c1");
    : [  U( @; e6 u* c
  9.         if(!bus)! }5 S" [8 y4 y4 E6 p6 v* c
  10.         {& a  ^! f% l3 @6 n5 W3 X# C
  11.                 rt_kprintf("can't find i2c device\n");
    ' d* _5 E* ^# R/ f# u1 V# S8 e
  12.                 return;
    . \# y1 u! }6 ^- x* Q& y
  13.         }! C1 {4 y. ]+ o1 i+ m8 t# J' k% b
  14.         write_cmd(bus,KX224_WHO_AM_I);
    6 ~$ z- T2 h+ y" Q4 ]2 i5 a2 E
  15.         red_reg(bus,1,&deviceid);* Y/ s8 ^3 t, J( d
  16.         if(deviceid != KX224_WAI_VAL)
    1 T) w2 X: {$ @; k& o0 }1 @
  17.         {
      x  Z( a( B# d+ q7 v9 b
  18.                 rt_kprintf("can't find device\n");! M; M+ e) O. h
  19.                 return; " J5 @- j$ h( ~; g' B- i, h. H
  20.         }
    ) ]9 v9 p) c: q! F- C
  21.           write_reg(bus,KX224_CNTL1,KX224_CNTL1_VAL);
    . X5 N! p( Q. ~2 s$ g% Y  t  X
  22.         write_reg(bus,KX224_ODCNTL,KX224_ODCNTL_VAL);
    * I6 E2 [0 F6 ?8 @) [- a
  23.         write_cmd(bus,KX224_CNTL1);
    , U' @0 N# n( x5 e3 Z
  24.         red_reg(bus,1,®);
    ! O  h; v; k( {1 d0 R  }
  25.         gsel = reg & KX224_CNTL1_GSELMASK;
    4 v9 X+ I0 O% M, ]1 C% ]
  26.         rt_kprintf("reg is 0x%02x gsel is 0x%02x\n",reg,gsel);
    + n1 C$ Q! C: N. V0 O; Z0 {
  27.         reg |= KX224_CNTL1_PC1;
    0 c9 l! B4 J' o( k* D! m* }  Z) G
  28.         write_reg(bus,KX224_CNTL1, reg);
    2 M3 H7 a; L( f1 b
  29.         switch(gsel) {
    / s. j3 h; @/ X* L) {
  30.     case KX224_CNTL1_GSEL_8G :. F1 l; `4 F: t. w: a3 r( Z2 @
  31.       // (Equivalent counts) / (Range) = (32768 / 8)
    ! c+ |! @0 S2 H3 ~9 P, u& g
  32.       _g_sens = 4096;
    " @1 V  w# c5 K# l# B  q
  33.     break;
    ! w) A; ?1 ?/ L+ ]; a

  34. % y$ p% k9 T' T  ^& f7 {9 i: d
  35.     case KX224_CNTL1_GSEL_16G :
    ! ?7 ^) c* U$ G9 d& B
  36.       // (Equivalent counts) / (Range) = (32768 / 16)
    / U0 p" V" B7 C" c. Z9 Y) w
  37.       _g_sens = 2048;/ u! k+ B; `" n& g- K% K
  38.     break;
    1 t6 D' H2 W0 x' j0 Z

  39. 8 L, ^4 `2 y, h1 n) {8 B3 t6 s4 u
  40.     case KX224_CNTL1_GSEL_32G :( T3 o" k3 ^  c6 \9 {
  41.       // (Equivalent counts) / (Range) = (32768 / 32)$ b& m- X4 M" J, H( ~
  42.       _g_sens = 1024;
    8 T/ P  E2 ?. s6 G' A8 V8 _
  43.     break;3 L. Y; O) \( }% T" W& a
  44. ) i' d$ _3 S6 Y$ S1 q
  45.     default:& m3 Y$ m* a( B: f) \
  46.     break;
    " Z4 M. z9 N9 r! U
  47.   }
    , p* t7 }2 d8 R- S6 y
  48.   rt_kprintf("_g_sens is <%d>\n",_g_sens);        1 q7 e1 U5 t# p1 Z$ k; q
  49. }
复制代码
) h2 m) ^* P8 ?$ @* Y$ ]

9 p$ }1 T  S/ ]* Y2 \6 ~# L
②i2c总线的读写操
! {$ _, T1 I7 r" w2 W% a
  1. static rt_err_t write_reg(struct rt_i2c_bus_device *bus,rt_uint8_t reg,rt_uint8_t data)& p0 }/ o  `+ ?. [) ^! v. S& U
  2. {- b6 _% x9 O% h+ X# a
  3.         struct rt_i2c_msg msgs;8 d& r8 x9 \0 z( S/ h
  4.         rt_uint8_t buff[2];
      v+ P1 p8 _( P% ~8 a" g1 X- j4 O
  5.         rt_size_t size = 0;+ O5 Q# i' W8 I( F8 @
  6.         . Z5 v3 E. ~) _7 Z8 h9 C6 f- B, w8 j
  7.         buff[0] = reg;
    3 h8 H1 s7 s" o  [$ q; X  M) M
  8.         buff[1] = data;" a) {! S# b" v0 n) ]
  9. + h' y2 O' r) A
  10.         msgs.addr = KX224_DEVICE_ADDRESS_1E;
    8 B# R7 r8 D: p4 ?9 G% E+ t
  11.         msgs.flags = RT_I2C_WR;
    2 R/ L0 m8 e2 {5 H6 w1 n
  12.         msgs.buf = buff;- W) j: E% U- s: i! j% G2 B
  13.         msgs.len = 2;
    / Z% g- ~- b% h+ ~; O; n# T, }

  14. 2 R' q- Z' ~( f
  15.         if( rt_i2c_transfer(bus, &msgs, 1))
    4 O7 }' X! y1 R+ C1 {$ e
  16.         {
    / \6 i4 U3 a. ~& o1 ~) j# j
  17.                 return RT_EOK;
    4 K( y. c8 ]9 u1 E$ d
  18.         }
    8 U( n2 V* o! b+ P# w
  19.         else
    . \) W& O, r4 a. y6 y5 X3 D& {
  20.         {# Q# V" z0 a1 R) T
  21.                 return -RT_ERROR;
    6 f; m' D- s3 B( y
  22.         }
    , X( `* ^# c! ?, w& b
  23. }- ?  m2 k+ R' w3 f0 b6 S8 P
  24.   R5 b8 n3 G3 R7 X
  25. static rt_err_t write_cmd(struct rt_i2c_bus_device *bus,rt_uint8_t reg)6 g, d4 b9 j1 w$ Z. t7 [
  26. {
    2 B6 P  k/ X: B$ r' m& K3 Q; J
  27.         struct rt_i2c_msg msgs;& s' z/ p, g  f( y3 N0 M' _: S
  28.         rt_uint8_t buff[2];
    # V9 n) M, W7 B, O9 C* _
  29.         rt_size_t size = 0;( o- l- w$ _! c) S& p8 C, G
  30.         - S! E  Q4 h& K7 t# m
  31.         buff[0] = reg;, H) s' T6 N  N* c8 |  T
  32. ) n# Q0 d( H" L$ V: @
  33.         msgs.addr = KX224_DEVICE_ADDRESS_1E;$ R: c5 X0 |; B/ v
  34.         msgs.flags = RT_I2C_WR;( F. D) m/ ?5 i# M: a- B
  35.         msgs.buf = buff;" {! `* P$ j  N0 C
  36.         msgs.len = 1;
    2 e0 f1 y; E) B- e) M& e

  37. 6 m# w* E9 f' ]3 `1 j8 k& \
  38.         if(rt_i2c_transfer(bus, &msgs, 1))
    7 o  f5 R# ~( E8 `& ~" E
  39.         {- N/ s; d( N" S: B1 N: R4 Z2 p* a
  40.                 return RT_EOK;7 i4 j- ]+ ?: X2 I, y
  41.         }
    : Q. `5 T, X# O2 U0 r6 g
  42.         else
    9 |- r& r; z( q- O
  43.         {
    & U5 t! T0 B5 A1 y% y8 C) i: M; K1 Q, b
  44.                 return -RT_ERROR;1 R) S, W2 L) d2 g* }
  45.         }
    $ D  l! K4 d" l  f3 G, G
  46. }' h1 `, G, J% G# B6 M

  47. ; J0 |, z6 P( J+ O. B) r( c

  48. 5 e9 X1 D8 J  ^
  49. static rt_err_t red_reg(struct rt_i2c_bus_device *bus,rt_uint8_t len,rt_uint8_t * buf)  |: G" o) G+ q9 S- ^
  50. {5 x* \  z6 B2 F7 ^0 j1 g
  51.         struct rt_i2c_msg msgs;
    $ P% g" n+ b7 \7 y% |
  52.         rt_size_t size = 0;, V5 s: B0 ^' P% N# Q; C7 I8 B
  53.         $ V- ]( U% ?% x  H! K* E
  54.         msgs.addr = KX224_DEVICE_ADDRESS_1E;& t$ I3 v6 F6 M3 U5 v% O
  55.         msgs.flags = RT_I2C_RD;: Q7 L7 r. G' Y: ]) [. H4 T
  56.         msgs.buf = buf;) H; M6 U+ t+ I
  57.         msgs.len = len;
    % {0 d( v9 r# R0 G

  58. 9 E7 r# i% B6 j; ?1 Z
  59.         if(rt_i2c_transfer(bus, &msgs, 1))& k: f6 s  y2 w6 b- p
  60.         {
    : P! M: x2 l0 T' q  C5 }+ a
  61.                 return RT_EOK;! \$ n6 d. j2 ~7 i2 Q5 J$ z" K  l
  62.         }
    + l, {6 X& B" y: c8 u& q
  63.         else1 Y% b' h8 ?3 C/ c; E6 F
  64.         {3 v. y& N- X% k4 [" G6 H2 Q
  65.                 return -RT_ERROR;6 ^' _( N; U, G. x$ L6 T
  66.         }' `& a0 b6 p' d: `1 r/ S
  67. }
复制代码

4 a# ^$ n) g+ {$ ?6 h% r

5 n1 p: V8 a: X
下载运行后发现能够获得数据了,数据的准确性后续在进行研究。

6 ~6 u. S% F- Z1 O
/ q$ Q4 O: Z$ r% H# Q1 G, \

( ^7 w# z. k: M% {
board_iic.jpg

; r5 b. s* _# ]2 F0 B* @
/ N" h. C! x1 j* G
acc.png

, t( q8 ?3 O; V
* d; a4 n6 @9 F0 v, b
: b& R, C: O. D& u+ `: |; y% S
赞 收藏 评论2 发布时间:2021-6-8 15:38

举报

2个回答
STMCU-管管 回答时间:2021-6-8 17:43:05
感谢分享,金币已增加
7 ~4 v" K  R6 D7 B
andey 回答时间:2021-6-9 16:04:29
STMCU-管管 发表于 2021-6-8 17:43
2 G* G3 g4 ^/ p. H$ o5 ^4 @! `2 B感谢分享,金币已增加
! k  ^: K$ `4 }2 n; d: |( A
金币追加的速度啊1 J, T) T' q8 d. L

所属标签

相似技术帖

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