请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
andey 发布时间:2021-6-8 15:38
本文基于rtt的iic驱动框架来实现加速度传感器数据的读取测试,废话不多说开启正文。7 f& ~/ l" p9 J

; U7 T6 O/ V0 ~8 \1.编译RT-thread加入I2c框架相关代码本实验使用的是官方代码中已经值支持bsp(\rt-thread\bsp\stm32\stm32l476-st-nucleo),默认的配置是没有组入软件IIC的软件框架。使用RTT 的ENV 工具很容易就可以将IIC软件框架代码组入系统,组入方法如下,在BSP目录下使用env工具,输入menuconfig。; r9 |, q' {9 I: w1 p

( }9 `$ ^0 Q+ C+ u( U
menuconfig.png

; j' X% f3 \0 G4 b% m/ O+ A: `. J% ^3 u. Z' R
配置路径如下:

- \! U+ U$ j- A/ F9 ]1 o

+ d0 L& M2 a# q+ t, z
/ J0 t& q# x% G/ q
i2c1.png

, P& Q% N, d* [
. f; W0 q" i% |2 R, z" ?) ~; N1 G
即可开启I2C,并配置SCL,SDA对应的引脚ID即可。配置完成后,运行SCONS即可发现相关的IIC代码文件已经参与编译了,我的配置如下。
3 k: U+ T! V$ w5 t, _+ ~/ d; o# d" ]
config.png

. }' W1 i1 m4 |( k. b) B" w1 f0 h
. Y0 S3 [* T1 ]3 T2 c7 C
2.适配加速度传感器,按照上一篇IIC驱动框架的理解,使用的时只要使用rt_i2c_bus_device_find查找对应的I2C设备,试验配置的名称为“i2c1”,找到相应的设备后调用rt_i2c_transfer 函数即可操作i2c总线的读和写操作了,所有的基于I2C总线的操作驱动框架已经集成,只需要用户实现芯片相关的配置即可而不用关心IIC协议的具体细节。适配过程中遇到两个问题。
8 t. P; @( B0 g①i2c的地址问题,发送结合接收时地址设置为芯片手册对应的7bit地址值即可,开始的时候读和写操做设置的地址为实际的8位地址,总是应答NACK,跟了下代码发现底层代码会根据读写操做自动设定地址,自己的操作存粹是多此一举。% b$ j7 }) Y! D
②因硬件上未配置总线上拉电阻,造作总线的时候总是失败,默认的IO配置的开漏输出是没有配置内部上拉的,所以总是失败,配置成内部上拉后总线就可以正常通信了。

4 t7 y' ~8 s4 w+ d

8 \$ B% {2 Z8 A5 J
5 \, G3 a5 y! r; v% ~
iicSHIXU.png

: E1 X. S+ R- h# M" m" Z6 w* _: k& j* n: ?
iictime.png
6 t; ]5 ]  ^: m9 Q$ x" t
3.相关的测试代码如下:0 H0 a0 v3 ~- c# O, l( c8 q, W3 |
①初始化KX224
7 A( t% q& E, k  |% `# k
  1. static rt_uint32_t _g_sens;
    & c  ?$ j/ _% i5 ]! G' Y; O. H
  2. struct rt_i2c_bus_device* bus = NULL;
    ! q5 X8 k  n+ N8 t% o' e
  3. # a- v* h6 i) x7 Y1 C' l' B
  4. static void kx224_init(void)
    ! q" A" R6 S+ v  K( a
  5. {
    $ _8 B) T3 d  k. r' s6 [" K
  6.         rt_uint8_t deviceid = 0,reg = 0,gsel = 0;" d# T' j; n% s: f7 J' k! [
  7.         
    4 ]# t# g. p3 C& g4 M6 F, @0 g" Q
  8.     bus = rt_i2c_bus_device_find("i2c1");
    ( i2 e$ l9 }7 {$ b
  9.         if(!bus)1 l( {+ T/ J! {% I( l
  10.         {
    * o, T, P9 ?0 }- V( M
  11.                 rt_kprintf("can't find i2c device\n");
    9 x% A1 X' \- M$ G8 K5 ?
  12.                 return;
    / a$ O% ~# m9 h) ?
  13.         }1 X" \) s. X. v; }* e0 A! Y
  14.         write_cmd(bus,KX224_WHO_AM_I);
    7 B; H1 r% z. A' i
  15.         red_reg(bus,1,&deviceid);# Q7 x9 ?! l) h3 B7 H# f; g+ P
  16.         if(deviceid != KX224_WAI_VAL)
    ' @$ y0 h5 o; R8 A9 _! j- S  Z
  17.         {* T4 _- W; [5 H! k$ s, N
  18.                 rt_kprintf("can't find device\n");
    $ `2 X+ ^5 ^  R7 Q1 ?9 V: p
  19.                 return; - p  G' p" n; |  v0 B  K' ~
  20.         }8 o' `/ N) c" W- M* m0 M$ c
  21.           write_reg(bus,KX224_CNTL1,KX224_CNTL1_VAL);
    # L4 J1 p% ?9 E# s# x
  22.         write_reg(bus,KX224_ODCNTL,KX224_ODCNTL_VAL);
    . Q6 x! x7 z. S9 n
  23.         write_cmd(bus,KX224_CNTL1);: E7 l1 r4 M, I4 w  u; f
  24.         red_reg(bus,1,®);- e2 n7 d) B2 G" _$ z
  25.         gsel = reg & KX224_CNTL1_GSELMASK;- A! _0 m& Z7 D9 v6 j4 c. `# E
  26.         rt_kprintf("reg is 0x%02x gsel is 0x%02x\n",reg,gsel);9 h7 u2 }0 o* h: s2 H- a* ]* s
  27.         reg |= KX224_CNTL1_PC1;, d7 X9 r' @/ f- ?
  28.         write_reg(bus,KX224_CNTL1, reg);2 `/ ^) X6 H7 r9 h
  29.         switch(gsel) {
    $ x8 B: g, |) L; @
  30.     case KX224_CNTL1_GSEL_8G :
    & ^6 w, B3 A1 G/ L9 x) @+ d
  31.       // (Equivalent counts) / (Range) = (32768 / 8)$ R, Y) a. B+ C+ u. S/ `. S
  32.       _g_sens = 4096;8 I% ]. g& }. u0 S& O
  33.     break;. R. Z& w8 j6 K9 S6 `
  34. # T/ e+ l8 ]. U5 O
  35.     case KX224_CNTL1_GSEL_16G :6 D& |/ j' Y5 c9 D6 z
  36.       // (Equivalent counts) / (Range) = (32768 / 16)
    ) l/ ?: ?( t1 }
  37.       _g_sens = 2048;
    : o+ s  }# `* P6 B5 Y# h: n7 c
  38.     break;
    2 H9 v0 I% g/ J3 M0 @6 }

  39. + l9 C1 p4 }' ]7 Z3 [
  40.     case KX224_CNTL1_GSEL_32G :
    / M; C! G- D0 s# ?7 P( }8 k
  41.       // (Equivalent counts) / (Range) = (32768 / 32)
    & w6 ^$ s  }' g6 j/ z' J; I" {
  42.       _g_sens = 1024;
    $ g) z$ l, J7 M* }
  43.     break;
    " Q9 I9 d4 @& M" j; h/ J  v

  44. 6 T7 [1 ?3 l( b8 m( x1 {  I; C
  45.     default:. z. b9 ]" K$ ?4 X" Q% V
  46.     break;2 X+ T  Z( ~( @7 y2 T/ i9 M8 p5 k
  47.   }
    , }+ H3 E0 E9 V, X& z! E
  48.   rt_kprintf("_g_sens is <%d>\n",_g_sens);        2 B( ?2 A2 p% b4 s% W' S
  49. }
复制代码

1 m8 u+ X3 X+ E. l

! Q; |7 K8 _7 I! N+ k5 W0 g% |
②i2c总线的读写操
; ?+ N' K9 b  B* G' ]
  1. static rt_err_t write_reg(struct rt_i2c_bus_device *bus,rt_uint8_t reg,rt_uint8_t data)
    , m- {1 i0 t* H* K" q/ \+ o4 p
  2. {
    1 r# f0 `( q7 o3 K4 b: l" T
  3.         struct rt_i2c_msg msgs;
    ; S( n3 s& M- V8 C8 f4 N, N
  4.         rt_uint8_t buff[2];, C  q3 P- T/ q, H
  5.         rt_size_t size = 0;" ~: |4 `; A1 K" u+ y; b5 [$ L; d
  6.         $ E& I+ V) v. l
  7.         buff[0] = reg;. n( d8 H& _- q
  8.         buff[1] = data;
    3 J0 ^  X2 Y" g7 S  f( k  @

  9. & O" w4 D( `  l* @$ {# w$ E0 x
  10.         msgs.addr = KX224_DEVICE_ADDRESS_1E;
    # a* ]4 |5 p- g/ e/ \$ Z6 x8 y
  11.         msgs.flags = RT_I2C_WR;
    0 g9 [1 p% `* J  Z& }6 B- n
  12.         msgs.buf = buff;) O  Y. a0 a9 O( N! F0 ^& g4 ]
  13.         msgs.len = 2;" w" w$ d, O4 E0 g
  14. 1 d4 S; p1 e- v* ^' U
  15.         if( rt_i2c_transfer(bus, &msgs, 1))4 }5 \& b6 V- H9 n: u1 g
  16.         {6 z4 [9 O- y1 T0 q, Z9 n4 f
  17.                 return RT_EOK;9 V; ]6 z) d. _# R
  18.         }
    7 _; [- X1 M8 {
  19.         else
    1 y9 Y4 K6 q% q/ n2 z1 B9 ~  v
  20.         {
    # e. N0 l# e- K, ^. X4 |: r
  21.                 return -RT_ERROR;
    7 I, R% ]; ~/ e1 j7 e* ~$ ]+ q
  22.         }9 w' Z5 `/ Z: x0 Z  X; \. g( H' K
  23. }7 d; a, O$ {0 D# T, H

  24. 6 f& x6 X+ ?. p* m- o. E$ s
  25. static rt_err_t write_cmd(struct rt_i2c_bus_device *bus,rt_uint8_t reg)+ j' r! L2 h8 i& l. f
  26. {
    3 s, n3 S1 i+ k! w3 b/ c+ A
  27.         struct rt_i2c_msg msgs;% o* ^% ^4 h; g; n! V
  28.         rt_uint8_t buff[2];& I( \1 q8 Z! @7 s3 t2 y
  29.         rt_size_t size = 0;/ t  q, N( M6 R" _
  30.         
    % }6 C! m8 Z" L1 B0 {
  31.         buff[0] = reg;
    2 l+ D( G2 J! l( {9 P

  32. 9 }7 I( z! G  g1 u) o* M
  33.         msgs.addr = KX224_DEVICE_ADDRESS_1E;
    " A" _3 O8 M7 ?
  34.         msgs.flags = RT_I2C_WR;
    4 r- I  ?& P( S6 e) _0 A
  35.         msgs.buf = buff;  N$ ^8 m/ r" ^5 C2 q2 P
  36.         msgs.len = 1;
    - l& ^, g8 L/ g& k' Z
  37. / x/ A% v! c* i, h9 b
  38.         if(rt_i2c_transfer(bus, &msgs, 1))& x. b9 G2 `7 o3 A
  39.         {
    , s) z2 T& N8 Q3 J; a) X
  40.                 return RT_EOK;7 W- }* P# t3 j% {2 Q6 L3 d
  41.         }
    - M, a4 C4 v7 u
  42.         else
    $ f2 K7 `! X$ p- y& M  J# `* y
  43.         {" ?3 u/ a# m, L9 Y0 G
  44.                 return -RT_ERROR;7 o, N* U4 f7 I$ Z* m
  45.         }5 {3 D8 l1 L& [. g: _& @6 G' [7 `, W
  46. }
    / a( U+ V: b0 A# U5 |  v5 g

  47. ; g- }0 O  N6 E
  48. , K, z( P  Q" w
  49. static rt_err_t red_reg(struct rt_i2c_bus_device *bus,rt_uint8_t len,rt_uint8_t * buf)& c1 Z7 K, h) E: E  a# W
  50. {  C5 o  H# f2 j% N- u
  51.         struct rt_i2c_msg msgs;9 a9 \1 B2 e" J0 [5 O  Y4 G0 }  `- A3 }
  52.         rt_size_t size = 0;
    $ _8 j& J- D& D3 S6 }- k4 ]
  53.         
    5 y, f, Q% s1 E. ~& W( h! a
  54.         msgs.addr = KX224_DEVICE_ADDRESS_1E;
    # c4 P; c" L5 h8 C; d0 {8 {
  55.         msgs.flags = RT_I2C_RD;
    . x7 X& c2 Q2 Y: A6 U: b
  56.         msgs.buf = buf;' e+ K* f) l+ y7 K3 }
  57.         msgs.len = len;8 R( I& |0 ~' S9 ~' Q3 {. S' X

  58. $ F: ~& |" ~, \
  59.         if(rt_i2c_transfer(bus, &msgs, 1))
    0 \% u% m. T- C. C0 V# ~) I% [0 H
  60.         {' F$ n5 }; X, r! h
  61.                 return RT_EOK;! x- a- j+ O# E' R- @1 c
  62.         }
    6 K; b! S8 k/ p, Y
  63.         else
    - T# r  y; K$ h1 x) W9 c; ~
  64.         {
    2 u' S9 i! R; e& h6 K0 @
  65.                 return -RT_ERROR;+ ?' I0 t  o. M8 S. M
  66.         }" ?& l$ K7 R  N' [3 X3 y; V& X
  67. }
复制代码
: F! s* s, B8 v! v

4 v8 |$ i( F& y; e# O1 b9 ^, m
下载运行后发现能够获得数据了,数据的准确性后续在进行研究。
. Z5 u) H9 r% |5 K1 ]/ `9 W
0 i- L1 o6 I. N* l& K
/ y3 i' g' J$ M* U+ a, Q7 ^" \0 c
board_iic.jpg

" |* B: r$ `6 V- r. ?6 r& y; ]( f* g# O; ]. C* b1 Z9 n* h+ T
acc.png
0 U% n1 u5 N! D% r" a' I+ X
) f3 N. I% R" Q" S8 ^( ]; v4 S8 v' [" g
6 K6 a% w  o0 K& J: ^
收藏 评论2 发布时间:2021-6-8 15:38

举报

2个回答
STMCU-管管 回答时间:2021-6-8 17:43:05
感谢分享,金币已增加
( q4 i% H! Z8 `+ i4 z0 H
andey 回答时间:2021-6-9 16:04:29
STMCU-管管 发表于 2021-6-8 17:43
4 o4 z8 u( \5 T; Q% n  w感谢分享,金币已增加

+ t0 f6 h* A. c/ k( u" L金币追加的速度啊
) z5 o8 T* D% m
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版