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

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

[复制链接]
andey 发布时间:2021-6-8 15:38
本文基于rtt的iic驱动框架来实现加速度传感器数据的读取测试,废话不多说开启正文。
  [8 _1 a. R$ F4 l% p

) P8 t& m8 s0 C* t1.编译RT-thread加入I2c框架相关代码本实验使用的是官方代码中已经值支持bsp(\rt-thread\bsp\stm32\stm32l476-st-nucleo),默认的配置是没有组入软件IIC的软件框架。使用RTT 的ENV 工具很容易就可以将IIC软件框架代码组入系统,组入方法如下,在BSP目录下使用env工具,输入menuconfig。9 ?' l( w( [0 w- x
6 X$ z) \' c% J6 m0 x7 S5 ]1 }
menuconfig.png

+ B2 {/ E! _5 c8 }8 b9 l' c
" k  C/ x/ ?! H- _7 B
配置路径如下:

$ h: x7 Q0 K% r$ U6 `/ N
; |3 \; j. [8 y$ z

# n. i+ k, S8 P$ O
i2c1.png
+ E4 i7 s6 G5 I1 Q/ J6 A2 H( q
; X; N) s) I7 u. ^: c# c, R4 T0 k
即可开启I2C,并配置SCL,SDA对应的引脚ID即可。配置完成后,运行SCONS即可发现相关的IIC代码文件已经参与编译了,我的配置如下。

9 U* Q( B, U8 k4 @0 s
config.png
  |4 p% Q) ]2 U8 V" J: H

) ^; U- i( M, \0 u$ O0 r
2.适配加速度传感器,按照上一篇IIC驱动框架的理解,使用的时只要使用rt_i2c_bus_device_find查找对应的I2C设备,试验配置的名称为“i2c1”,找到相应的设备后调用rt_i2c_transfer 函数即可操作i2c总线的读和写操作了,所有的基于I2C总线的操作驱动框架已经集成,只需要用户实现芯片相关的配置即可而不用关心IIC协议的具体细节。适配过程中遇到两个问题。
3 A+ ]% E4 m0 B5 S% ~. l①i2c的地址问题,发送结合接收时地址设置为芯片手册对应的7bit地址值即可,开始的时候读和写操做设置的地址为实际的8位地址,总是应答NACK,跟了下代码发现底层代码会根据读写操做自动设定地址,自己的操作存粹是多此一举。
1 V' T, c. V, D1 Z" h②因硬件上未配置总线上拉电阻,造作总线的时候总是失败,默认的IO配置的开漏输出是没有配置内部上拉的,所以总是失败,配置成内部上拉后总线就可以正常通信了。

6 j# ?: s; W: `  y
6 p$ `5 N* ]& M4 N+ t! H6 |

" D' N. W2 D5 w9 P
iicSHIXU.png
) [* C2 C- ]: [/ c  O

' S( }7 e6 F* I; [1 s5 C& v
iictime.png
; m  E: z! }/ p0 s4 [% Y$ ^6 _
3.相关的测试代码如下:
) c" _& O4 D7 Z; m( `+ A3 M①初始化KX224
' V& g) k( k1 Q0 ~! W  q
  1. static rt_uint32_t _g_sens;% w/ k; t- e2 c% w1 k9 W
  2. struct rt_i2c_bus_device* bus = NULL;- L4 G3 ?! P- e3 k
  3. & x* p# n, ]" H6 y/ e
  4. static void kx224_init(void)
    / `4 C; u) L' Q. T" s
  5. {
    # u9 V: g8 M) I& y& k
  6.         rt_uint8_t deviceid = 0,reg = 0,gsel = 0;/ v! _0 r2 R$ q: M6 q
  7.         . t9 {- W2 Z- ?
  8.     bus = rt_i2c_bus_device_find("i2c1");* J4 J/ y# p; [, p
  9.         if(!bus)# \) d1 T. x$ d/ y
  10.         {
    0 J& |# Y+ {+ j- e; X9 ^4 n5 J
  11.                 rt_kprintf("can't find i2c device\n");7 L0 a* y# o& C2 z
  12.                 return;
    % j8 _( Y$ L' L- A0 F+ x% l; c
  13.         }# J* T7 S8 C0 Z) ~; l
  14.         write_cmd(bus,KX224_WHO_AM_I);
    2 Y5 m9 \; ?7 g; x8 K$ H
  15.         red_reg(bus,1,&deviceid);, q6 v3 S. L8 V, A
  16.         if(deviceid != KX224_WAI_VAL)5 c* t; Y* a; }& y( {6 `
  17.         {
    - r$ ?* M' L# z
  18.                 rt_kprintf("can't find device\n");- o7 l8 ?4 p/ [1 q+ I1 ~  x8 f
  19.                 return;
    . b& e4 p" F, v7 J
  20.         }
    4 c% k, _5 }4 Z/ {
  21.           write_reg(bus,KX224_CNTL1,KX224_CNTL1_VAL);6 h# h9 l0 s- m' c) s; Q
  22.         write_reg(bus,KX224_ODCNTL,KX224_ODCNTL_VAL);& H! C( a; w2 i) k' I" m
  23.         write_cmd(bus,KX224_CNTL1);2 q) h1 L+ x& ~; H4 D
  24.         red_reg(bus,1,®);# X5 h8 c( K+ x1 m( `4 t
  25.         gsel = reg & KX224_CNTL1_GSELMASK;  }8 V) g9 ?: S/ V1 [
  26.         rt_kprintf("reg is 0x%02x gsel is 0x%02x\n",reg,gsel);7 D% z9 R0 |- d3 d# ~/ u+ v
  27.         reg |= KX224_CNTL1_PC1;
    7 m# V! t6 M% b
  28.         write_reg(bus,KX224_CNTL1, reg);$ u  x( }- I6 k
  29.         switch(gsel) {& F. `/ w$ v7 _* v
  30.     case KX224_CNTL1_GSEL_8G :$ f& |4 ~2 i( _; F  j
  31.       // (Equivalent counts) / (Range) = (32768 / 8)' v* {  l& n* \1 ~& l
  32.       _g_sens = 4096;
    ; D- V; E& g* s
  33.     break;: j% H/ x" y2 M, f* i" L4 J- n
  34. % ]% f* f* I+ V2 v9 r% K
  35.     case KX224_CNTL1_GSEL_16G :
    9 D2 _" g" {" P/ m+ R0 ]5 F
  36.       // (Equivalent counts) / (Range) = (32768 / 16)
    6 p" ]& R% M( K0 }
  37.       _g_sens = 2048;9 s/ c- W& A3 i% T5 F3 n
  38.     break;! o9 `8 q7 }3 R; M' c$ ~2 R: ]

  39. ! D( U/ w9 r, A- k0 E7 T* x& z, s
  40.     case KX224_CNTL1_GSEL_32G :. @% y, z, ]: x2 [
  41.       // (Equivalent counts) / (Range) = (32768 / 32)1 u( j9 B4 i  V7 c0 T0 R
  42.       _g_sens = 1024;
    ' W: b' T* e( z3 a! f9 U
  43.     break;2 K1 I+ ^6 t$ G8 V) p2 e

  44. $ S0 x* n& }4 l- H8 M
  45.     default:) b6 O/ X9 s- R' L. }- c
  46.     break;
    ; o7 O* z# w) z" `. i
  47.   }
    ! V- {9 L. r& r# i( R) q" v0 W! v! R
  48.   rt_kprintf("_g_sens is <%d>\n",_g_sens);        ! x3 `) ?8 Y0 f
  49. }
复制代码
! K: f; W. U7 a3 Y( ~' w

! v0 p) ?2 g2 l: `$ ^
②i2c总线的读写操

6 j! s7 n! o6 }" v
  1. static rt_err_t write_reg(struct rt_i2c_bus_device *bus,rt_uint8_t reg,rt_uint8_t data)9 X+ m  M$ ~- F+ o7 U; {& T
  2. {9 H) x* M' T  h. l
  3.         struct rt_i2c_msg msgs;
    & q# g7 q: c- g. `
  4.         rt_uint8_t buff[2];. g8 V- l. U3 }( [
  5.         rt_size_t size = 0;" @. b! x8 ^5 z( G; X
  6.         ( O" t; T  k+ L' l; r3 X9 Z
  7.         buff[0] = reg;' i7 e$ w+ u- T
  8.         buff[1] = data;
    ) }8 w5 e; s% _" {% ~9 U* R! A) I) u

  9. ( G" s0 K6 e  e+ ?* V) d/ N+ ?+ |
  10.         msgs.addr = KX224_DEVICE_ADDRESS_1E;
    # b9 ^2 M9 ]% [) H9 L0 D3 q
  11.         msgs.flags = RT_I2C_WR;8 m% c/ N# H! |( m9 R
  12.         msgs.buf = buff;: t" `8 q4 U$ q+ X  s/ v
  13.         msgs.len = 2;
    # R4 `6 }1 }- ?/ G

  14. & ~' b1 \6 M9 \' m8 s% E; z% P
  15.         if( rt_i2c_transfer(bus, &msgs, 1))6 B. M4 a% t8 Y  |+ W
  16.         {! C5 U; @! ~" e6 W
  17.                 return RT_EOK;% S* n% X+ F. G' m0 X5 b- t- P& i
  18.         }+ |- x1 z8 V0 y  H* q& h0 o
  19.         else
    % m/ \" T6 U( C
  20.         {5 W' w! i& L# g0 s( _- P4 C
  21.                 return -RT_ERROR;
    4 z# m/ e- E# N& g  b# J2 k* g
  22.         }
    ' T, D$ ~0 Q- K& J: q; p6 ]' E
  23. }5 @' b* h; g3 e
  24. * h" H) o2 T) ?0 Q: T: P) E
  25. static rt_err_t write_cmd(struct rt_i2c_bus_device *bus,rt_uint8_t reg)
    7 G8 h! b5 M: l5 t/ U
  26. {
    ' C9 o& t$ {8 I
  27.         struct rt_i2c_msg msgs;
    6 K% H) Y8 b9 a9 N1 f8 d
  28.         rt_uint8_t buff[2];- J- w- ?8 F1 y3 g! ]: B9 I4 w3 J* k
  29.         rt_size_t size = 0;: k' V, L' }- P! ?
  30.         4 A  p7 D% j  _$ h" q+ {7 S' t
  31.         buff[0] = reg;
    : k1 Z" |9 J" y. y1 E4 Z# j# V
  32. 7 A: z+ A. N: ?, @* |
  33.         msgs.addr = KX224_DEVICE_ADDRESS_1E;- n$ X0 ]: G8 c$ h+ z  o. V" _
  34.         msgs.flags = RT_I2C_WR;
    $ o7 F" K  W7 H2 T
  35.         msgs.buf = buff;
    ( _$ A+ S  q- F
  36.         msgs.len = 1;
    6 D, q  {- N1 q" E! f1 w  G7 o
  37. ! \9 P( ]1 |9 c% m  ?7 h5 V9 [; c: b) d
  38.         if(rt_i2c_transfer(bus, &msgs, 1))2 ]/ L# Z8 q5 l' c7 g
  39.         {
    5 R' Q1 |1 u, n# c( `; D9 u1 S
  40.                 return RT_EOK;! }( A4 V$ i& r" J) k3 V5 [
  41.         }
    4 A; ~7 B. N5 n1 g6 L/ n8 Q  J: J
  42.         else
    & |3 m4 [% |! X8 T. _& Q
  43.         {
    % h3 h% \' s* D2 n
  44.                 return -RT_ERROR;0 S* s0 A$ J1 u" n! n
  45.         }0 E1 I6 p6 x0 C+ M4 N3 a
  46. }
    0 s, \4 i9 I0 \: w

  47. / ~' a/ }  m, t" }& O+ l+ l; k/ r- ]# b& \

  48. 2 o! Q9 O% z" {- t- s7 i/ g/ Q
  49. static rt_err_t red_reg(struct rt_i2c_bus_device *bus,rt_uint8_t len,rt_uint8_t * buf)4 ?+ S; Z1 X, C7 ?2 z7 S
  50. {8 D' }( t6 k! D" a* S
  51.         struct rt_i2c_msg msgs;
    - y; c) C2 b- b& [$ A
  52.         rt_size_t size = 0;
    $ I4 F* ?9 T; Z% m. e
  53.         
    ' |& b4 p9 ~% y, ^6 ]
  54.         msgs.addr = KX224_DEVICE_ADDRESS_1E;2 A$ y- Z  g( ^# Z0 f2 w
  55.         msgs.flags = RT_I2C_RD;7 D2 @6 ?/ K5 L! c; r( ^4 I% W: p
  56.         msgs.buf = buf;
    4 H7 H. {; I* v8 W' f1 s
  57.         msgs.len = len;7 i" `8 ?0 F) t% x* M' f
  58. % Q( `; \+ S9 t; S
  59.         if(rt_i2c_transfer(bus, &msgs, 1)); v) p* H# x4 @3 L6 O, Q2 U
  60.         {% [5 F. e/ H2 X! C
  61.                 return RT_EOK;
    8 c% L6 n% x$ a% R( [
  62.         }1 C. [& s+ x8 q  O. n
  63.         else3 u% q$ f$ N1 c' y& S3 P5 f
  64.         {3 i( P9 S. R8 Q, g9 b) [4 C. j
  65.                 return -RT_ERROR;
    - e& f2 D! E' F9 O1 }
  66.         }) \" J$ y) @! ^) }. @
  67. }
复制代码
3 H, r3 _2 P$ i& E% u
+ ^' W$ {2 I. F, l9 N" K! X; l
下载运行后发现能够获得数据了,数据的准确性后续在进行研究。
5 J% `! D; n* J# x
* L- D$ t2 c6 }$ |2 Z4 }

( f$ N' X* Z# P9 m- F7 F; E
board_iic.jpg
) ]1 t2 c2 c; \* d$ X8 o# h& y7 B" |
8 l0 u0 g/ z; ~/ A2 N
acc.png

, @) K4 b9 P! ]7 {

9 i/ z' r  d1 L. t* O8 w
; U4 C  @# g+ v8 ~  h7 t; n2 A
收藏 评论2 发布时间:2021-6-8 15:38

举报

2个回答
STMCU-管管 回答时间:2021-6-8 17:43:05
感谢分享,金币已增加' w! v! y+ s5 U
andey 回答时间:2021-6-9 16:04:29
STMCU-管管 发表于 2021-6-8 17:43
7 o  f7 F9 b: R2 b0 K* q) t感谢分享,金币已增加

/ Y4 R  Q) n8 g; f, X金币追加的速度啊
' ?, x1 q; a; \" d* d1 o' m
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版