本文基于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
& P0 \9 d4 w+ @% V! h) Z, T4 ?8 V: i
配置路径如下:
+ j/ _1 Y% D3 s0 ~" u2 r5 q9 t! c2 _* s7 D% h( N
& a% P7 ^" z e0 F) r5 w+ 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
; |3 p8 t) M: {5 Z- x
% T0 l9 z6 |: h2 S2 L0 Z2.适配加速度传感器,按照上一篇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
- y' C* C6 ~4 \/ u+ G
% {4 x: J y+ U, ]' h6 R* Y" q
" t' p0 k5 d) s8 t& s3.相关的测试代码如下:1 Y" g0 M2 a" q3 x2 x
①初始化KX224 ; u6 K7 ]$ N% @/ E) ]! s: O
- static rt_uint32_t _g_sens;. {9 Y/ F% X5 |, ^
- struct rt_i2c_bus_device* bus = NULL;$ O0 U' }3 H2 y4 U# v+ g$ n- ?* u
7 h* X0 Q5 j" r @+ a, _- static void kx224_init(void)
; }9 [8 ]$ E6 t: [ c" _1 g( l$ r2 _ - {
% H& v0 N0 ^( {) w+ V - rt_uint8_t deviceid = 0,reg = 0,gsel = 0;
2 ~+ F7 y! m# c) N9 C( X; N -
) u- ~5 D0 H0 d- ^: c% J5 _3 K! v - bus = rt_i2c_bus_device_find("i2c1");0 y, k6 o, q& i7 s1 S
- if(!bus)
2 O: D# V& G( b - {5 V# T* r4 K; R1 y: j5 r
- rt_kprintf("can't find i2c device\n");
+ u9 I6 _1 h5 }0 Q+ y+ I9 R - return;7 u# k( n p# a( h
- }0 y0 w" e( E4 U, a1 m+ k
- write_cmd(bus,KX224_WHO_AM_I);3 Q3 r/ E+ w4 a7 e$ _$ B
- red_reg(bus,1,&deviceid);& f1 R) q; k5 L! j
- if(deviceid != KX224_WAI_VAL)" X: ^, Q W0 W$ b, [
- {, C; G9 u1 ~, z) i
- rt_kprintf("can't find device\n");3 W5 ?9 U1 I! X9 y9 u% _( G
- return;
- ^/ A6 k+ T* H+ A$ H2 I - }
8 e# o' ]- i2 @- J7 u - write_reg(bus,KX224_CNTL1,KX224_CNTL1_VAL);+ Q- P& q6 `" G
- write_reg(bus,KX224_ODCNTL,KX224_ODCNTL_VAL);
9 m5 h8 M% E0 A. D; j$ C - write_cmd(bus,KX224_CNTL1);. E& w/ |4 D+ w% f* [
- red_reg(bus,1,®);9 w- F r" v! Q7 t
- gsel = reg & KX224_CNTL1_GSELMASK;
8 v. q4 C9 n& s3 m: n - rt_kprintf("reg is 0x%02x gsel is 0x%02x\n",reg,gsel);. C, c6 V! v% ?& {6 J) ^, W
- reg |= KX224_CNTL1_PC1;
- P' E6 v+ ?: e3 u4 Y& V - write_reg(bus,KX224_CNTL1, reg);6 |3 h, j$ u* ]6 t
- switch(gsel) {. ]( c" T+ G _0 e9 r/ S
- case KX224_CNTL1_GSEL_8G :) i; O2 E/ ~2 t4 ]& K
- // (Equivalent counts) / (Range) = (32768 / 8)
, S9 j& d$ r5 ]" t- W - _g_sens = 4096;
1 V; c4 x3 j$ y" _- P - break;
5 f) h, S5 Y/ ?9 \! q
! b% s7 L6 G0 L; w a& F/ c- case KX224_CNTL1_GSEL_16G :
& m' M4 L9 L& Q v. L3 d1 m# f - // (Equivalent counts) / (Range) = (32768 / 16)- U1 X% d! b& s- h K+ L% T* {: r
- _g_sens = 2048;
' K, m4 s: a" z4 }4 |3 p - break;
, z4 M6 _4 q4 `) V
6 J! z0 y3 X/ z/ b- case KX224_CNTL1_GSEL_32G :3 ?3 e' z: x Y; A7 A
- // (Equivalent counts) / (Range) = (32768 / 32)
4 a% g( G4 W0 ^0 g+ S, m) @ - _g_sens = 1024;
, Q. W7 f3 _( N/ {& E - break;
% c) |3 @, ~2 P' J- Y$ k - : F1 A1 w5 {7 D w8 C. E. ^
- default:
, V W' O/ |/ I* m" l& r0 ~: O - break;
% J, C1 L& A. a, v @ - }
, G3 e; ?4 N4 x1 ]# x - rt_kprintf("_g_sens is <%d>\n",_g_sens);
2 u F+ S* {0 p - }
复制代码 & t8 A& J7 q* K9 C/ `3 _
/ v0 a9 F$ S3 {
②i2c总线的读写操
3 n; T5 I3 _; {$ D5 P- R- 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
- {: E- p. z: p9 L: {
- struct rt_i2c_msg msgs; k. l' j$ X" |5 p: v+ J
- rt_uint8_t buff[2];) P. T; P' }9 A, X4 e. h8 d
- rt_size_t size = 0;" J4 n8 z4 x7 w( p/ g) u
- 3 s& E& V- g5 y1 Y: E
- buff[0] = reg;
) O: U$ D) b3 K - buff[1] = data;
8 i8 J# U& u I. F- k, {# ?4 _
+ Q4 f8 ~- w9 f" }5 N& r- msgs.addr = KX224_DEVICE_ADDRESS_1E;5 P5 W* k, x/ t9 n8 [
- msgs.flags = RT_I2C_WR;
5 W0 J& J0 ]4 b. u - msgs.buf = buff;: x! V; d7 h. j' Y
- msgs.len = 2;. B# F- b- Q& i8 f
- # z, _* b: F8 {/ i" C3 N
- if( rt_i2c_transfer(bus, &msgs, 1))
' ?5 W+ M5 M9 ]" G - {" b/ C1 V% I; J1 q( s' m t
- return RT_EOK;
. m* l* O% `! w* } - }
# t, M: a1 k& r% O! } - else7 g. A: Y! J1 Y# c" F9 u1 @
- {: K/ w1 P2 ?* }, O
- return -RT_ERROR;7 d/ s1 U8 L! ]0 I6 d9 G
- }
" j& J$ k1 I5 \! { - }9 R) q; D5 s2 a. u. d! O3 h# \
" o' F$ A3 m" K- Y$ ~ ~- static rt_err_t write_cmd(struct rt_i2c_bus_device *bus,rt_uint8_t reg)
8 B. e, K$ t- R; a6 h - {) f! S5 ]1 R& h% K: \) r
- struct rt_i2c_msg msgs;% [' A& Y5 n( Z, n3 }9 P8 A
- rt_uint8_t buff[2];
1 E( F, U6 b/ T: [! V1 i+ | - rt_size_t size = 0;/ Y; | G1 F: R$ C3 ?9 D
- 9 P% `% A7 t7 ~2 k/ P
- buff[0] = reg;. q8 Q* D# m, ?: d5 P3 ^
- 2 K3 x( N* o* p
- msgs.addr = KX224_DEVICE_ADDRESS_1E;
0 H* x3 s) V! k7 I7 K) N - msgs.flags = RT_I2C_WR;
7 H9 O+ `; U$ M A! f* T5 m - msgs.buf = buff;
+ e+ u3 a% {8 n - msgs.len = 1;9 M( P: X: l) C: i
- 5 S, x& b( _, r2 b. @* a3 o1 j
- if(rt_i2c_transfer(bus, &msgs, 1))
2 W9 r& _ C, n2 j - {
+ C; {4 j T& L* [$ Y- u - return RT_EOK;1 h% u) o* {- w
- }& Z$ C# V1 ~% w" g
- else0 U1 }* J$ b& Y
- { V" m5 ^, ?( L% B- C3 p3 V9 D
- return -RT_ERROR;
% w& R$ ~! W! u& s# } - }+ O# C& ]7 v4 y
- }( y. \0 }, U) B5 K" g" F5 q
, C: P) J/ t h: W1 E/ Y5 a- # I2 t6 P* k# r5 d
- 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 - {
+ C8 f) d9 x+ O. Z F9 ^ - struct rt_i2c_msg msgs;
7 H, c8 u* F, C- E0 Y- S - rt_size_t size = 0;
8 v" B+ k8 s2 b/ d* M: H7 _6 } - # T+ b' H! A6 x3 M, m9 v p
- msgs.addr = KX224_DEVICE_ADDRESS_1E;
6 t3 h, X1 ~5 P) E7 n! @; j! y; N - msgs.flags = RT_I2C_RD;( P1 S5 h# [; b4 a4 h9 Y
- msgs.buf = buf;* b. k3 Y$ V' z: u( A8 }' h
- msgs.len = len;
+ E, H" }4 i# a7 l - ( z2 b+ x, \$ N6 I9 K
- if(rt_i2c_transfer(bus, &msgs, 1))
# O& u5 S$ I: I - {% r3 J# M# }7 E9 G6 T, ^
- return RT_EOK;
) H% G! P$ w& W1 l/ v. m7 u | - }
; p2 Z( _2 B' n. ? - else
+ V9 m3 e7 S7 w! s - {
& {% d$ _7 _* P6 K( [ - return -RT_ERROR;
& d5 O* c* O' i) W' `5 m5 P - }5 ]8 I8 a( z D
- }
复制代码
! 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
; p; y2 j9 F" _ g1 h* m7 m; e! e9 u+ g. d7 V; ?
; B5 i7 d! Q8 o4 T- E x
. ]1 p0 t2 {* m
% J" ?5 w. x7 C* i7 n3 E+ S |
金币追加的速度啊