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

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

[复制链接]
andey 发布时间:2021-6-8 15:38
本文基于rtt的iic驱动框架来实现加速度传感器数据的读取测试,废话不多说开启正文。8 M- G0 b! ^- S+ N" s2 t2 E0 s

, Z3 ^+ {4 t. Q+ d1.编译RT-thread加入I2c框架相关代码本实验使用的是官方代码中已经值支持bsp(\rt-thread\bsp\stm32\stm32l476-st-nucleo),默认的配置是没有组入软件IIC的软件框架。使用RTT 的ENV 工具很容易就可以将IIC软件框架代码组入系统,组入方法如下,在BSP目录下使用env工具,输入menuconfig。# V% j& k# \8 z7 [/ `' |4 |

* R# t# y: [* {! l5 F; J
menuconfig.png

# ]  P  x% m8 N9 c; t6 ^  O8 o: q3 C
配置路径如下:

7 G- s5 P; [0 _9 a
- F! U) L+ W  b7 n  Y
9 {7 g# t% s2 V& w7 g7 o
i2c1.png

6 D" B* @% ^: |6 y7 X4 z5 x" w* W
/ {9 j- f: q  j. o
即可开启I2C,并配置SCL,SDA对应的引脚ID即可。配置完成后,运行SCONS即可发现相关的IIC代码文件已经参与编译了,我的配置如下。
$ G4 t) `6 K3 n4 w0 i
config.png

' ]: y, z) k  z7 Y
7 s+ `# g- s- E
2.适配加速度传感器,按照上一篇IIC驱动框架的理解,使用的时只要使用rt_i2c_bus_device_find查找对应的I2C设备,试验配置的名称为“i2c1”,找到相应的设备后调用rt_i2c_transfer 函数即可操作i2c总线的读和写操作了,所有的基于I2C总线的操作驱动框架已经集成,只需要用户实现芯片相关的配置即可而不用关心IIC协议的具体细节。适配过程中遇到两个问题。
2 a, z' M! I# {①i2c的地址问题,发送结合接收时地址设置为芯片手册对应的7bit地址值即可,开始的时候读和写操做设置的地址为实际的8位地址,总是应答NACK,跟了下代码发现底层代码会根据读写操做自动设定地址,自己的操作存粹是多此一举。/ }; X7 R8 v  a( `+ M
②因硬件上未配置总线上拉电阻,造作总线的时候总是失败,默认的IO配置的开漏输出是没有配置内部上拉的,所以总是失败,配置成内部上拉后总线就可以正常通信了。

( L- l# }3 @/ }- ^

1 h3 k# H/ r, a7 K8 O' u; t% w
# w7 j+ p; }( D! l
iicSHIXU.png

" B8 }) b. M$ j
, z: {0 V- f+ Z: K/ u
iictime.png

4 G  ~* N- q8 I; X
3.相关的测试代码如下:2 B; {( g' ?+ I8 T" l% f
①初始化KX224

7 J. ~& Z3 ^: B1 K+ s
  1. static rt_uint32_t _g_sens;2 z% c% F: Z# W+ a( [. c2 e/ O
  2. struct rt_i2c_bus_device* bus = NULL;8 D( r+ I1 B( ^- F9 _; s) s  V- g1 _

  3. * a1 W2 [+ O: o2 W
  4. static void kx224_init(void)
    ' m: b! |# W: h; P+ D. S- _5 |
  5. {- V% |& E9 I9 b; q
  6.         rt_uint8_t deviceid = 0,reg = 0,gsel = 0;8 w: s. H, u3 b
  7.         
    % a9 S% a0 n, B7 J3 |
  8.     bus = rt_i2c_bus_device_find("i2c1");
    1 y- h/ Y" ^. U9 B
  9.         if(!bus)3 y( M$ S# Q. z" L" p2 s/ k- L
  10.         {
    + a0 N$ @. p* D7 n; w4 N6 f8 \9 u+ j- w
  11.                 rt_kprintf("can't find i2c device\n");+ T4 Q. j, s, i& `0 M! {
  12.                 return;" I- D5 k9 C2 u9 d  W5 O/ t
  13.         }% o0 n+ I' W% K0 c
  14.         write_cmd(bus,KX224_WHO_AM_I);7 Q( R! Z/ }- g- J
  15.         red_reg(bus,1,&deviceid);( r3 |  C. x% E$ V
  16.         if(deviceid != KX224_WAI_VAL)4 t4 d/ {+ u6 C# D; v6 e5 e
  17.         {
    5 r" g/ @9 l( y! q* Q- {
  18.                 rt_kprintf("can't find device\n");' Y  f5 k+ d2 [# i4 c
  19.                 return;
    / l( {9 Q8 X% G# g& }
  20.         }' O( m! a* f0 N$ n& l& Y7 M
  21.           write_reg(bus,KX224_CNTL1,KX224_CNTL1_VAL);
    , Q. R2 W  O# q, h2 H" c$ y: J( Z
  22.         write_reg(bus,KX224_ODCNTL,KX224_ODCNTL_VAL);+ [0 L/ |7 C$ H' Z) {5 e
  23.         write_cmd(bus,KX224_CNTL1);) W$ M7 u, ]( k& w' p! J
  24.         red_reg(bus,1,®);
    $ a( k* e- v6 Q. R* G/ g, Z
  25.         gsel = reg & KX224_CNTL1_GSELMASK;' _( J2 a& z% S# O/ Y4 |
  26.         rt_kprintf("reg is 0x%02x gsel is 0x%02x\n",reg,gsel);5 X2 _. j# @6 Y$ K' c3 R% t
  27.         reg |= KX224_CNTL1_PC1;. b& J9 p! o; g3 |5 V7 n' I! {
  28.         write_reg(bus,KX224_CNTL1, reg);, |* W- t6 h/ U7 z
  29.         switch(gsel) {
    ) {& `8 {' Y* T1 h0 ]* E. y: X  J# W
  30.     case KX224_CNTL1_GSEL_8G :
    & ^, p) B+ j+ R8 V5 V1 ^% i
  31.       // (Equivalent counts) / (Range) = (32768 / 8)
    ; a! O0 }$ O; P; k/ Q# v
  32.       _g_sens = 4096;7 O/ O3 L5 c% [% E2 `; j
  33.     break;
    & k) x+ i" C3 q/ C& G8 D$ T! n
  34. ! j2 S: `& w4 ?) r, F4 g  o
  35.     case KX224_CNTL1_GSEL_16G :
    3 A, S4 F. D$ f1 \0 u' c8 _3 o
  36.       // (Equivalent counts) / (Range) = (32768 / 16); c, M5 c" x& O- }& ^
  37.       _g_sens = 2048;5 O: u' K& S& v( N6 b6 t7 Z
  38.     break;( S4 }+ S9 O5 B1 e+ C# t$ M
  39. 5 k, z  i$ [4 r. Y
  40.     case KX224_CNTL1_GSEL_32G :# c; h- H5 T' t$ Q
  41.       // (Equivalent counts) / (Range) = (32768 / 32)7 o0 D2 ~+ C2 n3 l/ S- R) h% D
  42.       _g_sens = 1024;9 }1 _% m/ _3 X& W* G1 n/ _4 p0 h. i1 P
  43.     break;
    * U) y: P/ y: t# X# I

  44. + C$ i7 Z+ Y5 P% `1 E" v2 v
  45.     default:
    ' i+ j& D. \' W* @% n1 e# [- ]
  46.     break;" G* K9 m: q" P2 F2 @; t# \8 E  a! n
  47.   }* Z! t- n9 G( l! S) F
  48.   rt_kprintf("_g_sens is <%d>\n",_g_sens);        2 I$ @5 n, k9 c; z
  49. }
复制代码

# f5 Q0 c" b# w# k2 ]* U

+ N) O' Y- n6 x$ ^$ Q
②i2c总线的读写操

  t. n. g& c) r
  1. static rt_err_t write_reg(struct rt_i2c_bus_device *bus,rt_uint8_t reg,rt_uint8_t data)- [* w9 h6 }2 D& m! ~! X
  2. {, l* y! \$ e1 u4 D# z' D
  3.         struct rt_i2c_msg msgs;
    " W3 d  F5 T  L4 k3 q
  4.         rt_uint8_t buff[2];- a, t% m' d) G- P) R  R0 a
  5.         rt_size_t size = 0;" e$ r. f/ j% T# g, w$ P& O& ~& s
  6.         
    9 x. ?0 P+ D! F
  7.         buff[0] = reg;
    + L, f5 K. H1 w) y: j) t$ A
  8.         buff[1] = data;
    # o9 v2 L, \& v/ f' ?6 A
  9. 4 e( F% o1 C9 g( u
  10.         msgs.addr = KX224_DEVICE_ADDRESS_1E;
    * e+ t* g- I1 q5 k1 I" ^* B
  11.         msgs.flags = RT_I2C_WR;& n: N1 n: n( D, h2 u- }, J$ M8 H
  12.         msgs.buf = buff;' B6 i& }& a' k2 R" S
  13.         msgs.len = 2;( a9 T$ n- I" |6 W9 m$ X
  14. - B0 h$ w+ [) J2 X. ~
  15.         if( rt_i2c_transfer(bus, &msgs, 1))
    . L( e: X! o  E
  16.         {/ z2 {6 `" D6 q  Y6 Y+ }1 x
  17.                 return RT_EOK;
      n, k/ x2 C% c8 P7 d5 P
  18.         }0 H- v% ?$ Z4 X; a0 F1 M
  19.         else
    # F, A7 j" K3 f, y9 y2 r4 D
  20.         {
    5 O* G4 L  s6 {+ [$ {
  21.                 return -RT_ERROR;
    # [) E, H8 `+ h9 `% d2 ~( v' F
  22.         }
    0 N, ?) |( Z8 ]' q
  23. }
    3 C* G4 Y; }# a7 W, f3 L

  24. 3 |  D' O/ Z) q, i$ }7 g# \. d* L
  25. static rt_err_t write_cmd(struct rt_i2c_bus_device *bus,rt_uint8_t reg)
    8 X2 g4 ^8 B6 c9 N8 B; ~: Q
  26. {
    9 S% G( Q+ T! z! n
  27.         struct rt_i2c_msg msgs;% x  p! b6 Z! Y+ a' d- s; W
  28.         rt_uint8_t buff[2];" ?. k6 }9 Y$ A+ v+ w4 \
  29.         rt_size_t size = 0;
    5 n& W& |0 A) T/ L- R2 R; J) S+ }: y
  30.         
    0 A6 n) S* a% p9 A
  31.         buff[0] = reg;- [. L/ h/ P; H! P
  32. ' `0 W2 n1 U  X0 W1 d3 ^# t1 B
  33.         msgs.addr = KX224_DEVICE_ADDRESS_1E;
    % T" {  s* T$ U7 W5 M2 H
  34.         msgs.flags = RT_I2C_WR;& X  b$ h/ `- i  P/ ~
  35.         msgs.buf = buff;
    ( ]2 X9 L5 f  b, O" Q6 N
  36.         msgs.len = 1;# `" I6 c0 E) ]# D4 o9 o! k1 a

  37. 0 Y" c- V2 `% c- ~5 o, w
  38.         if(rt_i2c_transfer(bus, &msgs, 1))
    , A( e! J% Y/ E: P6 Q
  39.         {
    # S3 V9 z6 ?3 X
  40.                 return RT_EOK;
    & L; @7 J' c2 ?0 |% H5 z& Y1 P, ~
  41.         }2 I: r: Y& b" U6 ]9 I
  42.         else  \7 j3 d/ _4 k9 M% S/ A
  43.         {
      D0 u. K9 G6 F0 \% G- _
  44.                 return -RT_ERROR;- \& |1 `. n! {/ P3 L4 l0 v+ Q+ h
  45.         }
    4 T/ K7 q6 K" @$ F4 z# V
  46. }
    0 e0 q' y4 t0 K* N' r! ]" p/ L
  47. 7 X4 l" C1 @! V, _0 H# {) v2 u4 c8 k
  48. 4 c$ G# x" f" d0 D; a
  49. static rt_err_t red_reg(struct rt_i2c_bus_device *bus,rt_uint8_t len,rt_uint8_t * buf)* f7 R9 v; N4 z' Q6 \
  50. {
    * I9 o$ \% f, S) F- g. s6 h, [8 M
  51.         struct rt_i2c_msg msgs;
    ! C% b) d) C' [& |( s3 H
  52.         rt_size_t size = 0;" D; _0 T( Y- h" Z7 {* C, w
  53.         
    2 K% m1 Q- T. T! R
  54.         msgs.addr = KX224_DEVICE_ADDRESS_1E;  j: Z; p* _8 {
  55.         msgs.flags = RT_I2C_RD;
    / N! e7 r- C$ v& S- C4 W! N+ n# \$ _
  56.         msgs.buf = buf;
    2 k$ \3 X( Q* s- u9 r  A
  57.         msgs.len = len;  Y0 a9 c1 Y( m9 A6 \) t8 H

  58. - c, a8 j! b* F
  59.         if(rt_i2c_transfer(bus, &msgs, 1))
    2 N" q- x3 k7 v7 \: V+ N
  60.         {
    ; Q9 u, A. [0 J, Q( C+ n$ j
  61.                 return RT_EOK;
    1 F: y' ^5 `$ w( `4 q1 z; q$ k6 x
  62.         }  `- _; b" Q; k: g: R" m6 R! C
  63.         else
    . f; ]6 C. ]4 Z6 E# p, {
  64.         {
    1 b0 F# i5 Z8 Z& V* e  t/ m" G
  65.                 return -RT_ERROR;0 C! {. ?- x) V' [7 m4 \) g" }
  66.         }
    $ Z+ K5 b4 U! P% M, f
  67. }
复制代码
  j, ~* D% h% S6 Q  [0 p

7 }6 {" ^: I, o* E% H8 W3 `
下载运行后发现能够获得数据了,数据的准确性后续在进行研究。

0 E1 ]/ [; b( [4 w
& d0 ^; Z0 e1 o. T$ T
7 W  V0 p7 w. F* {- e
board_iic.jpg

+ f# `! a* \! I5 s8 a$ o# y7 ^# J0 c+ x1 E& d% j' I! O
acc.png
0 W: r) p8 q+ Q; \! p% }

+ e8 U: H; d4 D  d/ [1 d

! k0 h- v! S9 b/ i3 }) }
赞 收藏 评论2 发布时间:2021-6-8 15:38

举报

2个回答
STMCU-管管 回答时间:2021-6-8 17:43:05
感谢分享,金币已增加
: c; \- t- P- U
andey 回答时间:2021-6-9 16:04:29
STMCU-管管 发表于 2021-6-8 17:43. h* D) |9 `, H0 d5 s! u; h
感谢分享,金币已增加
0 [* c7 i/ S- u! j  t
金币追加的速度啊
& b7 L" X4 e: ?

所属标签

相似技术帖

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