本文基于rtt的iic驱动框架来实现加速度传感器数据的读取测试,废话不多说开启正文。8 M- G0 b! ^- S+ N" s2 t2 E0 s
, Z3 ^+ {4 t. Q+ d1.编译RT-thread加入I2c框架相关代码本实验使用的是官方代码中已经值支持bsp(\rt-thread\bsp\stm32\stm32l476-st-nucleo),默认的配置是没有组入软件IIC的软件框架。使用RTT 的ENV 工具很容易就可以将IIC软件框架代码组入系统,组入方法如下,在BSP目录下使用env工具,输入menuconfig。# V% j& k# \8 z7 [/ `' |4 |
* R# t# y: [* {! l5 F; J
# ] P x% m8 N9 c; t6 ^ O8 o: q3 C
配置路径如下:
7 G- s5 P; [0 _9 a- F! U) L+ W b7 n Y
9 {7 g# t% s2 V& w7 g7 o
6 D" B* @% ^: |6 y7 X4 z5 x" w* W
/ {9 j- f: q j. o即可开启I2C,并配置SCL,SDA对应的引脚ID即可。配置完成后,运行SCONS即可发现相关的IIC代码文件已经参与编译了,我的配置如下。 $ G4 t) `6 K3 n4 w0 i
' ]: y, z) k z7 Y
7 s+ `# g- s- E2.适配加速度传感器,按照上一篇IIC驱动框架的理解,使用的时只要使用rt_i2c_bus_device_find查找对应的I2C设备,试验配置的名称为“i2c1”,找到相应的设备后调用rt_i2c_transfer 函数即可操作i2c总线的读和写操作了,所有的基于I2C总线的操作驱动框架已经集成,只需要用户实现芯片相关的配置即可而不用关心IIC协议的具体细节。适配过程中遇到两个问题。
2 a, z' M! I# {①i2c的地址问题,发送结合接收时地址设置为芯片手册对应的7bit地址值即可,开始的时候读和写操做设置的地址为实际的8位地址,总是应答NACK,跟了下代码发现底层代码会根据读写操做自动设定地址,自己的操作存粹是多此一举。/ }; X7 R8 v a( `+ M
②因硬件上未配置总线上拉电阻,造作总线的时候总是失败,默认的IO配置的开漏输出是没有配置内部上拉的,所以总是失败,配置成内部上拉后总线就可以正常通信了。
( L- l# }3 @/ }- ^
1 h3 k# H/ r, a7 K8 O' u; t% w # w7 j+ p; }( D! l
" B8 }) b. M$ j
, z: {0 V- f+ Z: K/ u
4 G ~* N- q8 I; X3.相关的测试代码如下:2 B; {( g' ?+ I8 T" l% f
①初始化KX224
7 J. ~& Z3 ^: B1 K+ s- static rt_uint32_t _g_sens;2 z% c% F: Z# W+ a( [. c2 e/ O
- struct rt_i2c_bus_device* bus = NULL;8 D( r+ I1 B( ^- F9 _; s) s V- g1 _
* a1 W2 [+ O: o2 W- static void kx224_init(void)
' m: b! |# W: h; P+ D. S- _5 | - {- V% |& E9 I9 b; q
- rt_uint8_t deviceid = 0,reg = 0,gsel = 0;8 w: s. H, u3 b
-
% a9 S% a0 n, B7 J3 | - bus = rt_i2c_bus_device_find("i2c1");
1 y- h/ Y" ^. U9 B - if(!bus)3 y( M$ S# Q. z" L" p2 s/ k- L
- {
+ a0 N$ @. p* D7 n; w4 N6 f8 \9 u+ j- w - rt_kprintf("can't find i2c device\n");+ T4 Q. j, s, i& `0 M! {
- return;" I- D5 k9 C2 u9 d W5 O/ t
- }% o0 n+ I' W% K0 c
- write_cmd(bus,KX224_WHO_AM_I);7 Q( R! Z/ }- g- J
- red_reg(bus,1,&deviceid);( r3 | C. x% E$ V
- if(deviceid != KX224_WAI_VAL)4 t4 d/ {+ u6 C# D; v6 e5 e
- {
5 r" g/ @9 l( y! q* Q- { - rt_kprintf("can't find device\n");' Y f5 k+ d2 [# i4 c
- return;
/ l( {9 Q8 X% G# g& } - }' O( m! a* f0 N$ n& l& Y7 M
- write_reg(bus,KX224_CNTL1,KX224_CNTL1_VAL);
, Q. R2 W O# q, h2 H" c$ y: J( Z - write_reg(bus,KX224_ODCNTL,KX224_ODCNTL_VAL);+ [0 L/ |7 C$ H' Z) {5 e
- write_cmd(bus,KX224_CNTL1);) W$ M7 u, ]( k& w' p! J
- red_reg(bus,1,®);
$ a( k* e- v6 Q. R* G/ g, Z - gsel = reg & KX224_CNTL1_GSELMASK;' _( J2 a& z% S# O/ Y4 |
- rt_kprintf("reg is 0x%02x gsel is 0x%02x\n",reg,gsel);5 X2 _. j# @6 Y$ K' c3 R% t
- reg |= KX224_CNTL1_PC1;. b& J9 p! o; g3 |5 V7 n' I! {
- write_reg(bus,KX224_CNTL1, reg);, |* W- t6 h/ U7 z
- switch(gsel) {
) {& `8 {' Y* T1 h0 ]* E. y: X J# W - case KX224_CNTL1_GSEL_8G :
& ^, p) B+ j+ R8 V5 V1 ^% i - // (Equivalent counts) / (Range) = (32768 / 8)
; a! O0 }$ O; P; k/ Q# v - _g_sens = 4096;7 O/ O3 L5 c% [% E2 `; j
- break;
& k) x+ i" C3 q/ C& G8 D$ T! n - ! j2 S: `& w4 ?) r, F4 g o
- case KX224_CNTL1_GSEL_16G :
3 A, S4 F. D$ f1 \0 u' c8 _3 o - // (Equivalent counts) / (Range) = (32768 / 16); c, M5 c" x& O- }& ^
- _g_sens = 2048;5 O: u' K& S& v( N6 b6 t7 Z
- break;( S4 }+ S9 O5 B1 e+ C# t$ M
- 5 k, z i$ [4 r. Y
- case KX224_CNTL1_GSEL_32G :# c; h- H5 T' t$ Q
- // (Equivalent counts) / (Range) = (32768 / 32)7 o0 D2 ~+ C2 n3 l/ S- R) h% D
- _g_sens = 1024;9 }1 _% m/ _3 X& W* G1 n/ _4 p0 h. i1 P
- break;
* U) y: P/ y: t# X# I
+ C$ i7 Z+ Y5 P% `1 E" v2 v- default:
' i+ j& D. \' W* @% n1 e# [- ] - break;" G* K9 m: q" P2 F2 @; t# \8 E a! n
- }* Z! t- n9 G( l! S) F
- rt_kprintf("_g_sens is <%d>\n",_g_sens); 2 I$ @5 n, k9 c; z
- }
复制代码
# f5 Q0 c" b# w# k2 ]* U
+ N) O' Y- n6 x$ ^$ Q②i2c总线的读写操
t. n. g& c) r- static rt_err_t write_reg(struct rt_i2c_bus_device *bus,rt_uint8_t reg,rt_uint8_t data)- [* w9 h6 }2 D& m! ~! X
- {, l* y! \$ e1 u4 D# z' D
- struct rt_i2c_msg msgs;
" W3 d F5 T L4 k3 q - rt_uint8_t buff[2];- a, t% m' d) G- P) R R0 a
- rt_size_t size = 0;" e$ r. f/ j% T# g, w$ P& O& ~& s
-
9 x. ?0 P+ D! F - buff[0] = reg;
+ L, f5 K. H1 w) y: j) t$ A - buff[1] = data;
# o9 v2 L, \& v/ f' ?6 A - 4 e( F% o1 C9 g( u
- msgs.addr = KX224_DEVICE_ADDRESS_1E;
* e+ t* g- I1 q5 k1 I" ^* B - msgs.flags = RT_I2C_WR;& n: N1 n: n( D, h2 u- }, J$ M8 H
- msgs.buf = buff;' B6 i& }& a' k2 R" S
- msgs.len = 2;( a9 T$ n- I" |6 W9 m$ X
- - B0 h$ w+ [) J2 X. ~
- if( rt_i2c_transfer(bus, &msgs, 1))
. L( e: X! o E - {/ z2 {6 `" D6 q Y6 Y+ }1 x
- return RT_EOK;
n, k/ x2 C% c8 P7 d5 P - }0 H- v% ?$ Z4 X; a0 F1 M
- else
# F, A7 j" K3 f, y9 y2 r4 D - {
5 O* G4 L s6 {+ [$ { - return -RT_ERROR;
# [) E, H8 `+ h9 `% d2 ~( v' F - }
0 N, ?) |( Z8 ]' q - }
3 C* G4 Y; }# a7 W, f3 L
3 | D' O/ Z) q, i$ }7 g# \. d* L- static rt_err_t write_cmd(struct rt_i2c_bus_device *bus,rt_uint8_t reg)
8 X2 g4 ^8 B6 c9 N8 B; ~: Q - {
9 S% G( Q+ T! z! n - struct rt_i2c_msg msgs;% x p! b6 Z! Y+ a' d- s; W
- rt_uint8_t buff[2];" ?. k6 }9 Y$ A+ v+ w4 \
- rt_size_t size = 0;
5 n& W& |0 A) T/ L- R2 R; J) S+ }: y -
0 A6 n) S* a% p9 A - buff[0] = reg;- [. L/ h/ P; H! P
- ' `0 W2 n1 U X0 W1 d3 ^# t1 B
- msgs.addr = KX224_DEVICE_ADDRESS_1E;
% T" { s* T$ U7 W5 M2 H - msgs.flags = RT_I2C_WR;& X b$ h/ `- i P/ ~
- msgs.buf = buff;
( ]2 X9 L5 f b, O" Q6 N - msgs.len = 1;# `" I6 c0 E) ]# D4 o9 o! k1 a
0 Y" c- V2 `% c- ~5 o, w- if(rt_i2c_transfer(bus, &msgs, 1))
, A( e! J% Y/ E: P6 Q - {
# S3 V9 z6 ?3 X - return RT_EOK;
& L; @7 J' c2 ?0 |% H5 z& Y1 P, ~ - }2 I: r: Y& b" U6 ]9 I
- else \7 j3 d/ _4 k9 M% S/ A
- {
D0 u. K9 G6 F0 \% G- _ - return -RT_ERROR;- \& |1 `. n! {/ P3 L4 l0 v+ Q+ h
- }
4 T/ K7 q6 K" @$ F4 z# V - }
0 e0 q' y4 t0 K* N' r! ]" p/ L - 7 X4 l" C1 @! V, _0 H# {) v2 u4 c8 k
- 4 c$ G# x" f" d0 D; a
- static rt_err_t red_reg(struct rt_i2c_bus_device *bus,rt_uint8_t len,rt_uint8_t * buf)* f7 R9 v; N4 z' Q6 \
- {
* I9 o$ \% f, S) F- g. s6 h, [8 M - struct rt_i2c_msg msgs;
! C% b) d) C' [& |( s3 H - rt_size_t size = 0;" D; _0 T( Y- h" Z7 {* C, w
-
2 K% m1 Q- T. T! R - msgs.addr = KX224_DEVICE_ADDRESS_1E; j: Z; p* _8 {
- msgs.flags = RT_I2C_RD;
/ N! e7 r- C$ v& S- C4 W! N+ n# \$ _ - msgs.buf = buf;
2 k$ \3 X( Q* s- u9 r A - msgs.len = len; Y0 a9 c1 Y( m9 A6 \) t8 H
- c, a8 j! b* F- if(rt_i2c_transfer(bus, &msgs, 1))
2 N" q- x3 k7 v7 \: V+ N - {
; Q9 u, A. [0 J, Q( C+ n$ j - return RT_EOK;
1 F: y' ^5 `$ w( `4 q1 z; q$ k6 x - } `- _; b" Q; k: g: R" m6 R! C
- else
. f; ]6 C. ]4 Z6 E# p, { - {
1 b0 F# i5 Z8 Z& V* e t/ m" G - return -RT_ERROR;0 C! {. ?- x) V' [7 m4 \) g" }
- }
$ Z+ K5 b4 U! P% M, f - }
复制代码 j, ~* D% h% S6 Q [0 p
7 }6 {" ^: I, o* E% H8 W3 `下载运行后发现能够获得数据了,数据的准确性后续在进行研究。
0 E1 ]/ [; b( [4 w& d0 ^; Z0 e1 o. T$ T
7 W V0 p7 w. F* {- e
+ f# `! a* \! I5 s8 a$ o# y7 ^# J0 c+ x1 E& d% j' I! O
0 W: r) p8 q+ Q; \! p% }
+ e8 U: H; d4 D d/ [1 d
! k0 h- v! S9 b/ i3 }) } |
金币追加的速度啊