本文基于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, ^
! 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
$ G V8 Z% Y7 |, L( [! ]$ s' b0 O7 C: l8 O! |
即可开启I2C,并配置SCL,SDA对应的引脚ID即可。配置完成后,运行SCONS即可发现相关的IIC代码文件已经参与编译了,我的配置如下。 : L j5 I4 [& a4 [1 o* K
2 _/ [2 ?8 u4 c5 J
^8 D" t. ^: a. }2 j" M% T9 m2.适配加速度传感器,按照上一篇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
1 E3 Z+ ~0 \+ w8 o* ] Z, p8 C3 X) x8 H; ^( D j/ C
5 e4 T$ N1 q @( g3.相关的测试代码如下:4 ] ?0 f8 x# A$ Z0 n6 g0 e
①初始化KX224 1 q$ t/ O5 K/ h/ E2 m% m$ i
- static rt_uint32_t _g_sens;
4 X+ _' ]/ o* L - struct rt_i2c_bus_device* bus = NULL;
' q2 P7 b7 k; l' g6 C) \. b4 l" o
- I3 f: w0 f+ P5 Z+ w5 y- static void kx224_init(void). y8 S9 o6 k' F& }9 R H. }* f
- {
7 @6 z/ o, g1 `% E4 T! }* | - rt_uint8_t deviceid = 0,reg = 0,gsel = 0;
& t3 k& c) D; q! P$ }4 s6 g -
" E$ r% a; z) v/ g6 D$ {7 g - bus = rt_i2c_bus_device_find("i2c1");
: [ U( @; e6 u* c - if(!bus)! }5 S" [8 y4 y4 E6 p6 v* c
- {& a ^! f% l3 @6 n5 W3 X# C
- rt_kprintf("can't find i2c device\n");
' d* _5 E* ^# R/ f# u1 V# S8 e - return;
. \# y1 u! }6 ^- x* Q& y - }! C1 {4 y. ]+ o1 i+ m8 t# J' k% b
- write_cmd(bus,KX224_WHO_AM_I);
6 ~$ z- T2 h+ y" Q4 ]2 i5 a2 E - red_reg(bus,1,&deviceid);* Y/ s8 ^3 t, J( d
- if(deviceid != KX224_WAI_VAL)
1 T) w2 X: {$ @; k& o0 }1 @ - {
x Z( a( B# d+ q7 v9 b - rt_kprintf("can't find device\n");! M; M+ e) O. h
- return; " J5 @- j$ h( ~; g' B- i, h. H
- }
) ]9 v9 p) c: q! F- C - write_reg(bus,KX224_CNTL1,KX224_CNTL1_VAL);
. X5 N! p( Q. ~2 s$ g% Y t X - write_reg(bus,KX224_ODCNTL,KX224_ODCNTL_VAL);
* I6 E2 [0 F6 ?8 @) [- a - write_cmd(bus,KX224_CNTL1);
, U' @0 N# n( x5 e3 Z - red_reg(bus,1,®);
! O h; v; k( {1 d0 R } - gsel = reg & KX224_CNTL1_GSELMASK;
4 v9 X+ I0 O% M, ]1 C% ] - rt_kprintf("reg is 0x%02x gsel is 0x%02x\n",reg,gsel);
+ n1 C$ Q! C: N. V0 O; Z0 { - reg |= KX224_CNTL1_PC1;
0 c9 l! B4 J' o( k* D! m* } Z) G - write_reg(bus,KX224_CNTL1, reg);
2 M3 H7 a; L( f1 b - switch(gsel) {
/ s. j3 h; @/ X* L) { - case KX224_CNTL1_GSEL_8G :. F1 l; `4 F: t. w: a3 r( Z2 @
- // (Equivalent counts) / (Range) = (32768 / 8)
! c+ |! @0 S2 H3 ~9 P, u& g - _g_sens = 4096;
" @1 V w# c5 K# l# B q - break;
! w) A; ?1 ?/ L+ ]; a
% y$ p% k9 T' T ^& f7 {9 i: d- case KX224_CNTL1_GSEL_16G :
! ?7 ^) c* U$ G9 d& B - // (Equivalent counts) / (Range) = (32768 / 16)
/ U0 p" V" B7 C" c. Z9 Y) w - _g_sens = 2048;/ u! k+ B; `" n& g- K% K
- break;
1 t6 D' H2 W0 x' j0 Z
8 L, ^4 `2 y, h1 n) {8 B3 t6 s4 u- case KX224_CNTL1_GSEL_32G :( T3 o" k3 ^ c6 \9 {
- // (Equivalent counts) / (Range) = (32768 / 32)$ b& m- X4 M" J, H( ~
- _g_sens = 1024;
8 T/ P E2 ?. s6 G' A8 V8 _ - break;3 L. Y; O) \( }% T" W& a
- ) i' d$ _3 S6 Y$ S1 q
- default:& m3 Y$ m* a( B: f) \
- break;
" Z4 M. z9 N9 r! U - }
, p* t7 }2 d8 R- S6 y - rt_kprintf("_g_sens is <%d>\n",_g_sens); 1 q7 e1 U5 t# p1 Z$ k; q
- }
复制代码 ) h2 m) ^* P8 ?$ @* Y$ ]
9 p$ }1 T S/ ]* Y2 \6 ~# L②i2c总线的读写操 ! {$ _, T1 I7 r" w2 W% a
- 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
- {- b6 _% x9 O% h+ X# a
- struct rt_i2c_msg msgs;8 d& r8 x9 \0 z( S/ h
- rt_uint8_t buff[2];
v+ P1 p8 _( P% ~8 a" g1 X- j4 O - rt_size_t size = 0;+ O5 Q# i' W8 I( F8 @
- . Z5 v3 E. ~) _7 Z8 h9 C6 f- B, w8 j
- buff[0] = reg;
3 h8 H1 s7 s" o [$ q; X M) M - buff[1] = data;" a) {! S# b" v0 n) ]
- + h' y2 O' r) A
- msgs.addr = KX224_DEVICE_ADDRESS_1E;
8 B# R7 r8 D: p4 ?9 G% E+ t - msgs.flags = RT_I2C_WR;
2 R/ L0 m8 e2 {5 H6 w1 n - msgs.buf = buff;- W) j: E% U- s: i! j% G2 B
- msgs.len = 2;
/ Z% g- ~- b% h+ ~; O; n# T, }
2 R' q- Z' ~( f- if( rt_i2c_transfer(bus, &msgs, 1))
4 O7 }' X! y1 R+ C1 {$ e - {
/ \6 i4 U3 a. ~& o1 ~) j# j - return RT_EOK;
4 K( y. c8 ]9 u1 E$ d - }
8 U( n2 V* o! b+ P# w - else
. \) W& O, r4 a. y6 y5 X3 D& { - {# Q# V" z0 a1 R) T
- return -RT_ERROR;
6 f; m' D- s3 B( y - }
, X( `* ^# c! ?, w& b - }- ? m2 k+ R' w3 f0 b6 S8 P
- R5 b8 n3 G3 R7 X
- static rt_err_t write_cmd(struct rt_i2c_bus_device *bus,rt_uint8_t reg)6 g, d4 b9 j1 w$ Z. t7 [
- {
2 B6 P k/ X: B$ r' m& K3 Q; J - struct rt_i2c_msg msgs;& s' z/ p, g f( y3 N0 M' _: S
- rt_uint8_t buff[2];
# V9 n) M, W7 B, O9 C* _ - rt_size_t size = 0;( o- l- w$ _! c) S& p8 C, G
- - S! E Q4 h& K7 t# m
- buff[0] = reg;, H) s' T6 N N* c8 | T
- ) n# Q0 d( H" L$ V: @
- msgs.addr = KX224_DEVICE_ADDRESS_1E;$ R: c5 X0 |; B/ v
- msgs.flags = RT_I2C_WR;( F. D) m/ ?5 i# M: a- B
- msgs.buf = buff;" {! `* P$ j N0 C
- msgs.len = 1;
2 e0 f1 y; E) B- e) M& e
6 m# w* E9 f' ]3 `1 j8 k& \- if(rt_i2c_transfer(bus, &msgs, 1))
7 o f5 R# ~( E8 `& ~" E - {- N/ s; d( N" S: B1 N: R4 Z2 p* a
- return RT_EOK;7 i4 j- ]+ ?: X2 I, y
- }
: Q. `5 T, X# O2 U0 r6 g - else
9 |- r& r; z( q- O - {
& U5 t! T0 B5 A1 y% y8 C) i: M; K1 Q, b - return -RT_ERROR;1 R) S, W2 L) d2 g* }
- }
$ D l! K4 d" l f3 G, G - }' h1 `, G, J% G# B6 M
; J0 |, z6 P( J+ O. B) r( c
5 e9 X1 D8 J ^- 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- ^
- {5 x* \ z6 B2 F7 ^0 j1 g
- struct rt_i2c_msg msgs;
$ P% g" n+ b7 \7 y% | - rt_size_t size = 0;, V5 s: B0 ^' P% N# Q; C7 I8 B
- $ V- ]( U% ?% x H! K* E
- msgs.addr = KX224_DEVICE_ADDRESS_1E;& t$ I3 v6 F6 M3 U5 v% O
- msgs.flags = RT_I2C_RD;: Q7 L7 r. G' Y: ]) [. H4 T
- msgs.buf = buf;) H; M6 U+ t+ I
- msgs.len = len;
% {0 d( v9 r# R0 G
9 E7 r# i% B6 j; ?1 Z- if(rt_i2c_transfer(bus, &msgs, 1))& k: f6 s y2 w6 b- p
- {
: P! M: x2 l0 T' q C5 }+ a - return RT_EOK;! \$ n6 d. j2 ~7 i2 Q5 J$ z" K l
- }
+ l, {6 X& B" y: c8 u& q - else1 Y% b' h8 ?3 C/ c; E6 F
- {3 v. y& N- X% k4 [" G6 H2 Q
- return -RT_ERROR;6 ^' _( N; U, G. x$ L6 T
- }' `& a0 b6 p' d: `1 r/ S
- }
复制代码
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% {
; r5 b. s* _# ]2 F0 B* @
/ N" h. C! x1 j* G
, t( q8 ?3 O; V* d; a4 n6 @9 F0 v, b
: b& R, C: O. D& u+ `: |; y% S
|
金币追加的速度啊