本文基于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 }
+ 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+ 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 |4 p% Q) ]2 U8 V" J: H
) ^; U- i( M, \0 u$ O0 r2.适配加速度传感器,按照上一篇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: ` y6 p$ `5 N* ]& M4 N+ t! H6 |
" D' N. W2 D5 w9 P) [* C2 C- ]: [/ c O
' S( }7 e6 F* I; [1 s5 C& v; m E: z! }/ p0 s4 [% Y$ ^6 _
3.相关的测试代码如下:
) c" _& O4 D7 Z; m( `+ A3 M①初始化KX224 ' V& g) k( k1 Q0 ~! W q
- static rt_uint32_t _g_sens;% w/ k; t- e2 c% w1 k9 W
- struct rt_i2c_bus_device* bus = NULL;- L4 G3 ?! P- e3 k
- & x* p# n, ]" H6 y/ e
- static void kx224_init(void)
/ `4 C; u) L' Q. T" s - {
# u9 V: g8 M) I& y& k - rt_uint8_t deviceid = 0,reg = 0,gsel = 0;/ v! _0 r2 R$ q: M6 q
- . t9 {- W2 Z- ?
- bus = rt_i2c_bus_device_find("i2c1");* J4 J/ y# p; [, p
- if(!bus)# \) d1 T. x$ d/ y
- {
0 J& |# Y+ {+ j- e; X9 ^4 n5 J - rt_kprintf("can't find i2c device\n");7 L0 a* y# o& C2 z
- return;
% j8 _( Y$ L' L- A0 F+ x% l; c - }# J* T7 S8 C0 Z) ~; l
- write_cmd(bus,KX224_WHO_AM_I);
2 Y5 m9 \; ?7 g; x8 K$ H - red_reg(bus,1,&deviceid);, q6 v3 S. L8 V, A
- if(deviceid != KX224_WAI_VAL)5 c* t; Y* a; }& y( {6 `
- {
- r$ ?* M' L# z - rt_kprintf("can't find device\n");- o7 l8 ?4 p/ [1 q+ I1 ~ x8 f
- return;
. b& e4 p" F, v7 J - }
4 c% k, _5 }4 Z/ { - write_reg(bus,KX224_CNTL1,KX224_CNTL1_VAL);6 h# h9 l0 s- m' c) s; Q
- write_reg(bus,KX224_ODCNTL,KX224_ODCNTL_VAL);& H! C( a; w2 i) k' I" m
- write_cmd(bus,KX224_CNTL1);2 q) h1 L+ x& ~; H4 D
- red_reg(bus,1,®);# X5 h8 c( K+ x1 m( `4 t
- gsel = reg & KX224_CNTL1_GSELMASK; }8 V) g9 ?: S/ V1 [
- rt_kprintf("reg is 0x%02x gsel is 0x%02x\n",reg,gsel);7 D% z9 R0 |- d3 d# ~/ u+ v
- reg |= KX224_CNTL1_PC1;
7 m# V! t6 M% b - write_reg(bus,KX224_CNTL1, reg);$ u x( }- I6 k
- switch(gsel) {& F. `/ w$ v7 _* v
- case KX224_CNTL1_GSEL_8G :$ f& |4 ~2 i( _; F j
- // (Equivalent counts) / (Range) = (32768 / 8)' v* { l& n* \1 ~& l
- _g_sens = 4096;
; D- V; E& g* s - break;: j% H/ x" y2 M, f* i" L4 J- n
- % ]% f* f* I+ V2 v9 r% K
- case KX224_CNTL1_GSEL_16G :
9 D2 _" g" {" P/ m+ R0 ]5 F - // (Equivalent counts) / (Range) = (32768 / 16)
6 p" ]& R% M( K0 } - _g_sens = 2048;9 s/ c- W& A3 i% T5 F3 n
- break;! o9 `8 q7 }3 R; M' c$ ~2 R: ]
! D( U/ w9 r, A- k0 E7 T* x& z, s- case KX224_CNTL1_GSEL_32G :. @% y, z, ]: x2 [
- // (Equivalent counts) / (Range) = (32768 / 32)1 u( j9 B4 i V7 c0 T0 R
- _g_sens = 1024;
' W: b' T* e( z3 a! f9 U - break;2 K1 I+ ^6 t$ G8 V) p2 e
$ S0 x* n& }4 l- H8 M- default:) b6 O/ X9 s- R' L. }- c
- break;
; o7 O* z# w) z" `. i - }
! V- {9 L. r& r# i( R) q" v0 W! v! R - rt_kprintf("_g_sens is <%d>\n",_g_sens); ! x3 `) ?8 Y0 f
- }
复制代码 ! K: f; W. U7 a3 Y( ~' w
! v0 p) ?2 g2 l: `$ ^②i2c总线的读写操
6 j! s7 n! o6 }" v- 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
- {9 H) x* M' T h. l
- struct rt_i2c_msg msgs;
& q# g7 q: c- g. ` - rt_uint8_t buff[2];. g8 V- l. U3 }( [
- rt_size_t size = 0;" @. b! x8 ^5 z( G; X
- ( O" t; T k+ L' l; r3 X9 Z
- buff[0] = reg;' i7 e$ w+ u- T
- buff[1] = data;
) }8 w5 e; s% _" {% ~9 U* R! A) I) u
( G" s0 K6 e e+ ?* V) d/ N+ ?+ |- msgs.addr = KX224_DEVICE_ADDRESS_1E;
# b9 ^2 M9 ]% [) H9 L0 D3 q - msgs.flags = RT_I2C_WR;8 m% c/ N# H! |( m9 R
- msgs.buf = buff;: t" `8 q4 U$ q+ X s/ v
- msgs.len = 2;
# R4 `6 }1 }- ?/ G
& ~' b1 \6 M9 \' m8 s% E; z% P- if( rt_i2c_transfer(bus, &msgs, 1))6 B. M4 a% t8 Y |+ W
- {! C5 U; @! ~" e6 W
- return RT_EOK;% S* n% X+ F. G' m0 X5 b- t- P& i
- }+ |- x1 z8 V0 y H* q& h0 o
- else
% m/ \" T6 U( C - {5 W' w! i& L# g0 s( _- P4 C
- return -RT_ERROR;
4 z# m/ e- E# N& g b# J2 k* g - }
' T, D$ ~0 Q- K& J: q; p6 ]' E - }5 @' b* h; g3 e
- * h" H) o2 T) ?0 Q: T: P) E
- static rt_err_t write_cmd(struct rt_i2c_bus_device *bus,rt_uint8_t reg)
7 G8 h! b5 M: l5 t/ U - {
' C9 o& t$ {8 I - struct rt_i2c_msg msgs;
6 K% H) Y8 b9 a9 N1 f8 d - rt_uint8_t buff[2];- J- w- ?8 F1 y3 g! ]: B9 I4 w3 J* k
- rt_size_t size = 0;: k' V, L' }- P! ?
- 4 A p7 D% j _$ h" q+ {7 S' t
- buff[0] = reg;
: k1 Z" |9 J" y. y1 E4 Z# j# V - 7 A: z+ A. N: ?, @* |
- msgs.addr = KX224_DEVICE_ADDRESS_1E;- n$ X0 ]: G8 c$ h+ z o. V" _
- msgs.flags = RT_I2C_WR;
$ o7 F" K W7 H2 T - msgs.buf = buff;
( _$ A+ S q- F - msgs.len = 1;
6 D, q {- N1 q" E! f1 w G7 o - ! \9 P( ]1 |9 c% m ?7 h5 V9 [; c: b) d
- if(rt_i2c_transfer(bus, &msgs, 1))2 ]/ L# Z8 q5 l' c7 g
- {
5 R' Q1 |1 u, n# c( `; D9 u1 S - return RT_EOK;! }( A4 V$ i& r" J) k3 V5 [
- }
4 A; ~7 B. N5 n1 g6 L/ n8 Q J: J - else
& |3 m4 [% |! X8 T. _& Q - {
% h3 h% \' s* D2 n - return -RT_ERROR;0 S* s0 A$ J1 u" n! n
- }0 E1 I6 p6 x0 C+ M4 N3 a
- }
0 s, \4 i9 I0 \: w
/ ~' a/ } m, t" }& O+ l+ l; k/ r- ]# b& \
2 o! Q9 O% z" {- t- s7 i/ g/ Q- 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
- {8 D' }( t6 k! D" a* S
- struct rt_i2c_msg msgs;
- y; c) C2 b- b& [$ A - rt_size_t size = 0;
$ I4 F* ?9 T; Z% m. e -
' |& b4 p9 ~% y, ^6 ] - msgs.addr = KX224_DEVICE_ADDRESS_1E;2 A$ y- Z g( ^# Z0 f2 w
- msgs.flags = RT_I2C_RD;7 D2 @6 ?/ K5 L! c; r( ^4 I% W: p
- msgs.buf = buf;
4 H7 H. {; I* v8 W' f1 s - msgs.len = len;7 i" `8 ?0 F) t% x* M' f
- % Q( `; \+ S9 t; S
- if(rt_i2c_transfer(bus, &msgs, 1)); v) p* H# x4 @3 L6 O, Q2 U
- {% [5 F. e/ H2 X! C
- return RT_EOK;
8 c% L6 n% x$ a% R( [ - }1 C. [& s+ x8 q O. n
- else3 u% q$ f$ N1 c' y& S3 P5 f
- {3 i( P9 S. R8 Q, g9 b) [4 C. j
- return -RT_ERROR;
- e& f2 D! E' F9 O1 } - }) \" J$ y) @! ^) }. @
- }
复制代码 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) ]1 t2 c2 c; \* d$ X8 o# h& y7 B" |
8 l0 u0 g/ z; ~/ A2 N
, @) K4 b9 P! ]7 {
9 i/ z' r d1 L. t* O8 w ; U4 C @# g+ v8 ~ h7 t; n2 A
|
金币追加的速度啊