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

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

[复制链接]
andey 发布时间:2021-6-8 15:38
本文基于rtt的iic驱动框架来实现加速度传感器数据的读取测试,废话不多说开启正文。/ i- c7 s  U! f5 T3 ]# m! X
: k7 f1 v0 q; {5 p' v
1.编译RT-thread加入I2c框架相关代码本实验使用的是官方代码中已经值支持bsp(\rt-thread\bsp\stm32\stm32l476-st-nucleo),默认的配置是没有组入软件IIC的软件框架。使用RTT 的ENV 工具很容易就可以将IIC软件框架代码组入系统,组入方法如下,在BSP目录下使用env工具,输入menuconfig。) a9 D$ ?2 v: z1 n& ^
( B8 Y# h9 p6 S& R- `6 `2 [% Z
menuconfig.png

& P0 \9 d4 w+ @% V! h) Z, T4 ?8 V: i
配置路径如下:

+ j/ _1 Y% D3 s0 ~" u2 r
5 q9 t! c2 _* s7 D% h( N

& a% P7 ^" z  e0 F) r5 w
i2c1.png
+ D; D# s4 p) }' X; X" [, o

, X9 M2 z7 R7 \) B* M: `( |0 `
即可开启I2C,并配置SCL,SDA对应的引脚ID即可。配置完成后,运行SCONS即可发现相关的IIC代码文件已经参与编译了,我的配置如下。
4 M: j( d0 X9 S" j
config.png

; |3 p8 t) M: {5 Z- x
% T0 l9 z6 |: h2 S2 L0 Z
2.适配加速度传感器,按照上一篇IIC驱动框架的理解,使用的时只要使用rt_i2c_bus_device_find查找对应的I2C设备,试验配置的名称为“i2c1”,找到相应的设备后调用rt_i2c_transfer 函数即可操作i2c总线的读和写操作了,所有的基于I2C总线的操作驱动框架已经集成,只需要用户实现芯片相关的配置即可而不用关心IIC协议的具体细节。适配过程中遇到两个问题。. K: w1 z4 Y) }+ ~  C0 P  o
①i2c的地址问题,发送结合接收时地址设置为芯片手册对应的7bit地址值即可,开始的时候读和写操做设置的地址为实际的8位地址,总是应答NACK,跟了下代码发现底层代码会根据读写操做自动设定地址,自己的操作存粹是多此一举。
. {+ r4 ~+ @* p4 W3 J②因硬件上未配置总线上拉电阻,造作总线的时候总是失败,默认的IO配置的开漏输出是没有配置内部上拉的,所以总是失败,配置成内部上拉后总线就可以正常通信了。

: `3 e2 x9 c3 o
' i' o8 B: c8 K

- z- G* Y7 }; X! f7 Z4 F
iicSHIXU.png

- y' C* C6 ~4 \/ u+ G
% {4 x: J  y+ U, ]' h6 R* Y" q
iictime.png

" t' p0 k5 d) s8 t& s
3.相关的测试代码如下:1 Y" g0 M2 a" q3 x2 x
①初始化KX224
; u6 K7 ]$ N% @/ E) ]! s: O
  1. static rt_uint32_t _g_sens;. {9 Y/ F% X5 |, ^
  2. struct rt_i2c_bus_device* bus = NULL;$ O0 U' }3 H2 y4 U# v+ g$ n- ?* u

  3. 7 h* X0 Q5 j" r  @+ a, _
  4. static void kx224_init(void)
    ; }9 [8 ]$ E6 t: [  c" _1 g( l$ r2 _
  5. {
    % H& v0 N0 ^( {) w+ V
  6.         rt_uint8_t deviceid = 0,reg = 0,gsel = 0;
    2 ~+ F7 y! m# c) N9 C( X; N
  7.         
    ) u- ~5 D0 H0 d- ^: c% J5 _3 K! v
  8.     bus = rt_i2c_bus_device_find("i2c1");0 y, k6 o, q& i7 s1 S
  9.         if(!bus)
    2 O: D# V& G( b
  10.         {5 V# T* r4 K; R1 y: j5 r
  11.                 rt_kprintf("can't find i2c device\n");
    + u9 I6 _1 h5 }0 Q+ y+ I9 R
  12.                 return;7 u# k( n  p# a( h
  13.         }0 y0 w" e( E4 U, a1 m+ k
  14.         write_cmd(bus,KX224_WHO_AM_I);3 Q3 r/ E+ w4 a7 e$ _$ B
  15.         red_reg(bus,1,&deviceid);& f1 R) q; k5 L! j
  16.         if(deviceid != KX224_WAI_VAL)" X: ^, Q  W0 W$ b, [
  17.         {, C; G9 u1 ~, z) i
  18.                 rt_kprintf("can't find device\n");3 W5 ?9 U1 I! X9 y9 u% _( G
  19.                 return;
    - ^/ A6 k+ T* H+ A$ H2 I
  20.         }
    8 e# o' ]- i2 @- J7 u
  21.           write_reg(bus,KX224_CNTL1,KX224_CNTL1_VAL);+ Q- P& q6 `" G
  22.         write_reg(bus,KX224_ODCNTL,KX224_ODCNTL_VAL);
    9 m5 h8 M% E0 A. D; j$ C
  23.         write_cmd(bus,KX224_CNTL1);. E& w/ |4 D+ w% f* [
  24.         red_reg(bus,1,®);9 w- F  r" v! Q7 t
  25.         gsel = reg & KX224_CNTL1_GSELMASK;
    8 v. q4 C9 n& s3 m: n
  26.         rt_kprintf("reg is 0x%02x gsel is 0x%02x\n",reg,gsel);. C, c6 V! v% ?& {6 J) ^, W
  27.         reg |= KX224_CNTL1_PC1;
    - P' E6 v+ ?: e3 u4 Y& V
  28.         write_reg(bus,KX224_CNTL1, reg);6 |3 h, j$ u* ]6 t
  29.         switch(gsel) {. ]( c" T+ G  _0 e9 r/ S
  30.     case KX224_CNTL1_GSEL_8G :) i; O2 E/ ~2 t4 ]& K
  31.       // (Equivalent counts) / (Range) = (32768 / 8)
    , S9 j& d$ r5 ]" t- W
  32.       _g_sens = 4096;
    1 V; c4 x3 j$ y" _- P
  33.     break;
    5 f) h, S5 Y/ ?9 \! q

  34. ! b% s7 L6 G0 L; w  a& F/ c
  35.     case KX224_CNTL1_GSEL_16G :
    & m' M4 L9 L& Q  v. L3 d1 m# f
  36.       // (Equivalent counts) / (Range) = (32768 / 16)- U1 X% d! b& s- h  K+ L% T* {: r
  37.       _g_sens = 2048;
    ' K, m4 s: a" z4 }4 |3 p
  38.     break;
    , z4 M6 _4 q4 `) V

  39. 6 J! z0 y3 X/ z/ b
  40.     case KX224_CNTL1_GSEL_32G :3 ?3 e' z: x  Y; A7 A
  41.       // (Equivalent counts) / (Range) = (32768 / 32)
    4 a% g( G4 W0 ^0 g+ S, m) @
  42.       _g_sens = 1024;
    , Q. W7 f3 _( N/ {& E
  43.     break;
    % c) |3 @, ~2 P' J- Y$ k
  44. : F1 A1 w5 {7 D  w8 C. E. ^
  45.     default:
    , V  W' O/ |/ I* m" l& r0 ~: O
  46.     break;
    % J, C1 L& A. a, v  @
  47.   }
    , G3 e; ?4 N4 x1 ]# x
  48.   rt_kprintf("_g_sens is <%d>\n",_g_sens);        
    2 u  F+ S* {0 p
  49. }
复制代码
& t8 A& J7 q* K9 C/ `3 _
/ v0 a9 F$ S3 {
②i2c总线的读写操

3 n; T5 I3 _; {$ D5 P- R
  1. static rt_err_t write_reg(struct rt_i2c_bus_device *bus,rt_uint8_t reg,rt_uint8_t data)- S  m7 F: K- ]6 b* O$ K7 S7 m
  2. {: E- p. z: p9 L: {
  3.         struct rt_i2c_msg msgs;  k. l' j$ X" |5 p: v+ J
  4.         rt_uint8_t buff[2];) P. T; P' }9 A, X4 e. h8 d
  5.         rt_size_t size = 0;" J4 n8 z4 x7 w( p/ g) u
  6.         3 s& E& V- g5 y1 Y: E
  7.         buff[0] = reg;
    ) O: U$ D) b3 K
  8.         buff[1] = data;
    8 i8 J# U& u  I. F- k, {# ?4 _

  9. + Q4 f8 ~- w9 f" }5 N& r
  10.         msgs.addr = KX224_DEVICE_ADDRESS_1E;5 P5 W* k, x/ t9 n8 [
  11.         msgs.flags = RT_I2C_WR;
    5 W0 J& J0 ]4 b. u
  12.         msgs.buf = buff;: x! V; d7 h. j' Y
  13.         msgs.len = 2;. B# F- b- Q& i8 f
  14. # z, _* b: F8 {/ i" C3 N
  15.         if( rt_i2c_transfer(bus, &msgs, 1))
    ' ?5 W+ M5 M9 ]" G
  16.         {" b/ C1 V% I; J1 q( s' m  t
  17.                 return RT_EOK;
    . m* l* O% `! w* }
  18.         }
    # t, M: a1 k& r% O! }
  19.         else7 g. A: Y! J1 Y# c" F9 u1 @
  20.         {: K/ w1 P2 ?* }, O
  21.                 return -RT_ERROR;7 d/ s1 U8 L! ]0 I6 d9 G
  22.         }
    " j& J$ k1 I5 \! {
  23. }9 R) q; D5 s2 a. u. d! O3 h# \

  24. " o' F$ A3 m" K- Y$ ~  ~
  25. static rt_err_t write_cmd(struct rt_i2c_bus_device *bus,rt_uint8_t reg)
    8 B. e, K$ t- R; a6 h
  26. {) f! S5 ]1 R& h% K: \) r
  27.         struct rt_i2c_msg msgs;% [' A& Y5 n( Z, n3 }9 P8 A
  28.         rt_uint8_t buff[2];
    1 E( F, U6 b/ T: [! V1 i+ |
  29.         rt_size_t size = 0;/ Y; |  G1 F: R$ C3 ?9 D
  30.         9 P% `% A7 t7 ~2 k/ P
  31.         buff[0] = reg;. q8 Q* D# m, ?: d5 P3 ^
  32. 2 K3 x( N* o* p
  33.         msgs.addr = KX224_DEVICE_ADDRESS_1E;
    0 H* x3 s) V! k7 I7 K) N
  34.         msgs.flags = RT_I2C_WR;
    7 H9 O+ `; U$ M  A! f* T5 m
  35.         msgs.buf = buff;
    + e+ u3 a% {8 n
  36.         msgs.len = 1;9 M( P: X: l) C: i
  37. 5 S, x& b( _, r2 b. @* a3 o1 j
  38.         if(rt_i2c_transfer(bus, &msgs, 1))
    2 W9 r& _  C, n2 j
  39.         {
    + C; {4 j  T& L* [$ Y- u
  40.                 return RT_EOK;1 h% u) o* {- w
  41.         }& Z$ C# V1 ~% w" g
  42.         else0 U1 }* J$ b& Y
  43.         {  V" m5 ^, ?( L% B- C3 p3 V9 D
  44.                 return -RT_ERROR;
    % w& R$ ~! W! u& s# }
  45.         }+ O# C& ]7 v4 y
  46. }( y. \0 }, U) B5 K" g" F5 q

  47. , C: P) J/ t  h: W1 E/ Y5 a
  48. # I2 t6 P* k# r5 d
  49. static rt_err_t red_reg(struct rt_i2c_bus_device *bus,rt_uint8_t len,rt_uint8_t * buf)
    ( w3 t) y5 m: @& O
  50. {
    + C8 f) d9 x+ O. Z  F9 ^
  51.         struct rt_i2c_msg msgs;
    7 H, c8 u* F, C- E0 Y- S
  52.         rt_size_t size = 0;
    8 v" B+ k8 s2 b/ d* M: H7 _6 }
  53.         # T+ b' H! A6 x3 M, m9 v  p
  54.         msgs.addr = KX224_DEVICE_ADDRESS_1E;
    6 t3 h, X1 ~5 P) E7 n! @; j! y; N
  55.         msgs.flags = RT_I2C_RD;( P1 S5 h# [; b4 a4 h9 Y
  56.         msgs.buf = buf;* b. k3 Y$ V' z: u( A8 }' h
  57.         msgs.len = len;
    + E, H" }4 i# a7 l
  58. ( z2 b+ x, \$ N6 I9 K
  59.         if(rt_i2c_transfer(bus, &msgs, 1))
    # O& u5 S$ I: I
  60.         {% r3 J# M# }7 E9 G6 T, ^
  61.                 return RT_EOK;
    ) H% G! P$ w& W1 l/ v. m7 u  |
  62.         }
    ; p2 Z( _2 B' n. ?
  63.         else
    + V9 m3 e7 S7 w! s
  64.         {
    & {% d$ _7 _* P6 K( [
  65.                 return -RT_ERROR;
    & d5 O* c* O' i) W' `5 m5 P
  66.         }5 ]8 I8 a( z  D
  67. }
复制代码

! v3 @6 h: l6 e

2 J3 m$ v; J8 f! y% b
下载运行后发现能够获得数据了,数据的准确性后续在进行研究。

5 g; X6 i. b9 i: M

8 C- P( e+ ]0 ?) X* p" X& Q& S) g

5 V9 L# T4 r' u8 c, T5 z7 j" X
board_iic.jpg

; p; y2 j9 F" _  g1 h* m7 m; e! e9 u+ g. d7 V; ?
acc.png

; B5 i7 d! Q8 o4 T- E  x

. ]1 p0 t2 {* m

% J" ?5 w. x7 C* i7 n3 E+ S
收藏 评论2 发布时间:2021-6-8 15:38

举报

2个回答
STMCU-管管 回答时间:2021-6-8 17:43:05
感谢分享,金币已增加7 p7 t% a9 Z! q2 D
andey 回答时间:2021-6-9 16:04:29
STMCU-管管 发表于 2021-6-8 17:432 t2 M3 l  F/ T/ r: v, a* x
感谢分享,金币已增加
# i+ h$ o$ g# S. h, \
金币追加的速度啊$ b6 Y1 x1 n1 i

所属标签

相似技术帖

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