|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
I2C教程 ——疯壳·开发板系列
5 x' X& G( p6 o' L4 W9 @% B/ ]% D, w2 c" a0 b( S0 P
2 j+ j& f7 P( |/ l8 M2 s$ `2 K
2 [: `$ P& A" G( @0 ^+ P% G
图1, [6 H% B P( R7 m# A! S2 X
' T S* o+ B3 N) ~ 第一节I2C硬件电路- Q' O& ^% ?+ _: @9 J, ]
将P12与P13配置为I2C的两个接口即可,P12与P13已通过排针引出,如下图所示:
% t4 d* C/ {: M* S: p: D* j. T9 C' d; V( ^
% F$ l# c( Q. p( g& D
; P' s. K$ I% a: T6 @# J. U! H7 a
图2! a, [; U. q0 M& l& }
' n0 O" L) k5 R
4 ~5 \; b- h7 R/ V5 [/ Q1 M
4 a6 p" m, y% c* b# @% T 第二节 I2C% ?5 F0 C/ T4 ?
7 H5 N) E: Y6 q( Z v! a/ h; B
2.1 I2C介绍
! I0 ~ N( k4 X' o( R& C* C% p I2C总线是一个为系统中电路通信提供支持的可编程控制总线,它是一个软件定义的两线通信协议。
, M' n. T, Q, {* @ 两线I2C串行接口包括一个串行数据线(SDA)和一个串行时钟线(SCL);* G$ j! b# q, T
支持两种通信速率,标准模式(0~100Kb/s)和快速模式(小于等于400Kb/s);: \- d R8 {3 `7 `1 n
时钟同步;' v6 w- ~( P. a, u8 @1 y$ x
32字节的发送接收FIFO;
- |- J7 L8 L h( n 主机发送与接收操作;
' O" }9 r! }# S9 `- [4 v& L 7或10位地址,7或10为混合格式发送;
U# t7 e8 p1 g& i) v, ~8 ?3 T 块发送模式;; X/ Q" x N X& \+ a7 ]
默认从地址为0x055;
+ }6 Y1 {2 {# }# x2 j4 }( C 中断或者轮询操作模式;( V. Z. K7 l/ G9 E$ o+ |4 i; c
可编程的数据线保持时间;6 {+ ?8 D6 p1 e9 H1 E2 S
7 |7 @$ I' e+ o* J1 O6 t
2.2 寄存器介绍
5 }5 u$ J" O% z, a' q# Q I2C相关的寄存器比较多,所以我们只介绍常用的寄存器,其它的可以参考官方数据手册AD14580_DS_v3.1.pdf,位于目录:..\WT开发板\硬件资料。+ ?+ Y" O: W. m. e" R( ?5 D% q
& X k6 f- D4 t3 p" J0 J 2.2.1 I2C控制寄存器# E8 u# X. f+ u! J
5 s3 V [, F: |
l. X" ^' \( m# } 图3 X( @0 C" H6 ]' a+ x l
15:7位:保留不使用;
8 W: ~& O+ Z7 f6 h 6位:I2C从设备使能位,’0’表示从设备使能,’1’表示从设备不可用,该位不一定要软件设置,但是要保证如果该位为’0’则该寄存器的第0位也为’0’;8 _+ P7 ?7 b) C. g: U% G9 s- @
5位:当作为主设备时,是否发送重启条件,’0’表示不可以,’1’表示可以;
; n3 k6 P; Q& ? 4位:作为主设备时,决定以7位地址还是10位地址开始发送,’0’表示7位地址,’1’表示10位地址;
& l6 t+ L2 q( z, m! h" N# [, x 3位:作为从设备时,决定以7位地址还是10位地址开始发送,’0’表示7位地址,’1’表示10位地址;: B, P4 ], O' Q& y; P
2:1位:I2C通信速度选择,1表示标准速度(100Kbit/s),2表示快速(400Kbit/s);
" M2 A4 w& w9 ^1 b2 }: z 0位:I2C主设备使能,’0’表示主设备不可用,’1’表示主设备使能,要保证如果该位为’1’则该寄存器的第6位也为’1’;
4 b& J& Y" X3 ^/ q& _( J) ^2 S
' F7 o+ \$ R* `* g4 v) k, K3 i 2.2.2 I2C目标地址寄存器' m/ ^# [$ x& g" g& f
/ G) F6 \+ P0 m, V
" d5 o0 y* k, v
3 e! u4 o# ~8 a6 O+ Z/ B' s$ _ M& o
图4! m7 i5 c" K2 t- o; K
15:12位:保留不使用;
* A( C- Q! d6 b7 n 11位:该位决定软件是否进行广播或者开始字节命令,’0’表示忽略第10位GC_OR_START并且正常使用IC_TAR;3 g( Y& H/ e+ v
10位:如果第11位设置为’1’,则该位表示控制器是否进行广播或开始字节命令,’0’表示发送广播地址,之后只能进行写操作,如果进行读操作则导致TX_ABRT置位,控制器一直停留在广播模式,直到第11位被清除,’1’表示发送开始字节;( Y+ }! |& p3 E+ P+ V
9:0位:这是主设备发送的目标地址,如果发送广播则该位被忽略,CPU只需要写一次这些位;注意如果目标地址与从设备地址相同则存在回路,但是FIFO为主从共用,所以完全回路是可行的,只支持单方向的回路,一个主设备不能给自己发送数据只能发送给从设备。- }1 Z, m* B( a. v t6 U1 n7 H$ @
; K/ Y4 |- X' E; I* M1 V 2.2.3 I2C接收发送数据缓存与命令寄存器$ g8 _8 O7 ~$ o! P- m/ Q7 L! Y" [1 R
, {9 }0 A3 b! c/ D/ L
" |; p+ h- J: C, k8 }$ ]3 D9 `
1 ]4 @% [0 d8 Z. |! ^. t 图5# H* B* h8 z( x4 Y% X+ L2 c
15:9位:保留不使用;( Z3 O7 [5 K1 |/ y. g1 V4 r
8位:读写控制位,作为从设备时不能控制方向,只能作为主设备时使用,’0’表示写,’1’表示读;
+ {! ]: X C* d& j 7:0位:存储I2C总线上发送或接收的数据,如果你正在操作该寄存器并且要进行读操作则该位被忽略,如果你读该寄存器则该位存储的是接收到的数据。
0 U9 Y) w8 f/ `1 {0 ^3 u% u4 Y- I+ S
2.2.4 I2C清除TX_ABRT中断# ]/ f5 |* _! R4 o6 V. n9 a
7 t' a8 x% a' R+ K
' I/ ]$ V8 r! G6 d 图6 b& w+ i) V( @8 u3 G- o2 A7 b) R
15:1位:保留不使用;) w+ V8 z8 _' r% \, g Y3 a4 }
0位:清除发送异常停止位,读该位则清除发送异常停止中断位,和发送异常停止源寄存器位。同时发送FIFO从刷新/复位状态中释放出来,可以允许更多写入。% u* F. X; q+ ~# P) G4 Z7 z
+ J/ C% D* Z6 {% i: V' D; z. W
2.2.5 I2C使能寄存器5 z6 T0 Z. R+ z, A
9 S, p" Y9 H9 m7 J) ?( _
& s& P3 [" v7 t: I. i- D5 R. G. j+ S4 |
4 o/ r, b# g6 Z* I. e7 I1 i
图7
7 ^0 E: v5 O" O2 U+ p. [; e 15:1位:保留不使用;
9 J3 g& ?# s; B" R: J, ^ 0位:控制器使能位;
! V+ n0 J9 L; X' ~0 ]: \* v* c- ] A% Q, p" n4 Q
2.2.6 I2C状态寄存器
( f) w' n0 U7 J
. O; t' k$ O6 F: [$ |2 s3 ~
) z$ P) J/ W$ D% k
9 s" C# I' o" z8 s% D 图8! l+ Z& I! [- }9 a5 ~' C# ^, ?
15:7位:保留不使用;
$ O" ~. y5 D( G2 m+ m- u/ D7 _/ M 6位:判断从设备是否活动;
2 F0 v4 e( \! h* V& h3 H0 Y0 Z3 O 5位:判断主设备是否活动;
: v# s0 A) e l& P* U 4位:判断接收FIFO是否全满;
9 O. c4 L7 B& q( w; c/ g2 C5 H 3位:判断接收FIFO是否为空;# f1 Z0 n1 C, m* X, B$ Z
2位:判断发送FIFO是否全满;8 C, t! g$ }. v. x# E! \3 K
1位:判断发送FIFO是否为空;
; J5 r3 {7 J. b' i, X: f 0位:判断I2C模块是否活动。$ T, L! t4 h; W: E1 ]& p- r
* B+ p7 |5 u+ @
2.2.7 I2C接收FIFO数目寄存器. ^9 G# b% E7 [
9 d8 L' X( T, c( L
) I- n) C( R. P, o
图9
% x0 _5 J4 W: n7 p5 G 15:6位:保留不使用;
6 s; S* s* `- r: }/ R; T 5:0位:接收FIFO可以接收多少字节。9 g( I( `' j" @! t: _+ r k$ |
6 p6 X+ q( y! [& |5 P! ]5 F- I 2.2.8 I2C发送异常终止源寄存器$ Q3 Z9 G4 F) v" V' k( Q8 N
& B1 r! V5 P$ H* V" i
1 Q" c- B! ^: b
! D0 a V7 P1 B0 D2 ~
图10
5 H3 g( D: L2 b8 Y 15位:当主设备需要发送数据时,却进入读数据状态;
! v; Q. f1 ?! e' L" E1 v' | 14位:当发送数据时,从设备丢失总线;" [6 M# b) X8 e! Y" n: k
13位:当从设备要接收数据时,FIFO中已经有一些数据;0 Z5 Y( c$ ?; b3 }3 h. W# h
12位:失去仲裁;& K/ C" i; x0 v, E
11位:当主设备不可用时,用户进行主设备的操作;
z R" c' V" ^% Z" O4 ` 10位:重启不可用,并且主设备在10位地址模式下发送读命令;7 v! c1 K/ S" b& o0 h, s
9位:重启不可用,但是用户发送一个开始字节;
( j0 ]; q, S0 ` 8位:重启不可用,但是用户试图在高速模式下发送数据;
( `9 O, W/ n8 [! P- q& w) M& G 7位:主设备已经发送了一个开始字节,并且开始字节被确认;$ ]- v% j; h5 k) X
6位:主设备在高速模式下,并且被确认;
9 {& W/ k- F( c' Q4 N9 L 5位:主设备控制器广播之后进行读操作; ^6 s p" |/ x- s: n( f. c
4位:主设备发送广播,但是没有从设备确认;! P& i9 D. ?9 [) e: Z1 L/ y
3位:只有主设备有效,主设备已经发送地址,并确认,但是发送数据得不到确认信号;0 K! t$ V9 w- S) ]; V
2位:主设备使用10位地址模式,10位地址的第二个字节没有被任何从设备确认;
9 c* m' v: F, L" N 1位:主设备使用10位地址模式,10位地址的第一个字节没有被任何从设备确认;0 y5 }8 x. |, u" Q5 ^5 ~0 h
0位:主设备使用7位地址模式,但是没有被任何从设备确认。
$ k9 |' [/ I' K5 x
2 R( I5 {9 M8 j# V* [8 f 2.3 寄存器配置讲解0 n7 f: M) @0 `3 Z: P( p$ I2 K
7 b% H0 X1 K3 ]7 J$ A #define CLK_PER_REG (* ( volatile uint16*)0x50000004)
9 H8 z; j! X5 q #define I2C_CON_REG (* ( volatile uint16*)0x50001300)8 u. p: |6 v1 T3 D. S# b' H
#define I2C_TAR_REG (* ( volatile uint16*)0x50001304)
" B7 z- f, G2 h9 U$ a4 O8 n" L #define I2C_DATA_CMD_REG (* ( volatile uint16*)0x50001310)$ Z+ N6 F) {: ?+ a% X
#define I2C_CLR_TX_ABRT_REG (* ( volatile uint16*)0x50001354)
+ U% B+ Z% a+ } #define I2C_ENABLE_REG (* ( volatile uint16*)0x5000136C)
( S, o# A* z2 X% W) ~ #define I2C_STATUS_REG (* ( volatile uint16*)0x50001370)
1 V* j; W5 l$ ^4 r, L& E #define I2C_RXFLR_REG (* ( volatile uint16*)0x50001378): d$ H6 L0 g( a
#define I2C_TX_ABRT_SOURCE_REG (* ( volatile uint16*)0x50001380)
$ \6 ~) o' a, r/ C 启动I2C模块的时钟:CLK_PER_REG |= 0x0020;- v6 I! ^$ \( g. m: S( [
I2C的初始化寄存器配置:' L$ K" K' k+ ^; @8 f+ Q& e- ^ H
先关闭I2C控制器, I2C_ENABLE_REG=0x00;4 E: V& h- {0 h* D4 y) \' ?
设置为主模式,关闭从模式,可以重复开始,速度设置为快速,地址为7位模式(0x0000000001100101), I2C_ CON _REG =0x0065;% a. z; Y- `- ?9 F5 x1 D) d; b
设置目标设备地址为0x51, I2C_TAR_REG =0x51;6 [+ _& a) z8 Y$ T& R
打开I2C控制器, I2C_ENABLE_REG=0x01;
7 M! j" k# }5 i/ ~+ ? 等待控制器准备好,while( (I2C_STATUS_REG & 0x20) != 0 );
& u1 g& H+ u. A; Q$ X1 O 读取地址为0x98处的一个字节,先发送地址I2C_DATA_CMD_REG = 0x98;等待发送完毕while((I2C_STATUS_REG&0x0002)==0);发送读指令I2C_DATA_CMD_REG = 0x0100; 等待发送完毕while((I2C_STATUS_REG&0x0004)==0);之后等待数据接收完毕while(I2C_RXFLR_REG == 0);读取接收缓冲区的数据即为接收数据rx_data = I2C_DATA_CMD_REG;
8 \4 d- v" q; ?3 Z: U5 U, M3 A 向地址为0x98处写入一个字节0xaa,先发送地址I2C_DATA_CMD_REG = 0x98;等待发送完毕while((I2C_STATUS_REG&0x0002)==0);发送数据I2C_DATA_CMD_REG = 0xaa; 等待发送完毕while((I2C_STATUS_REG&0x0004)==0);( L/ L' H V8 g" A/ l
: \" t0 c5 X' ?/ Y
7 q; b A/ _6 T i9 Z2 B; `' D6 \9 {0 M9 L
# z# \. i3 G1 l; E
第三节 I2C实验3 f: c6 s0 l- _# h5 X
. J! e t2 T$ D; J
实验需要使用的模块有:手机开发板底板,Jlink调试工具,杜邦线、心率体温模块、3.7V锂电池或Mocro USB线。
; @; _( U( C4 b- L e; P$ G 将心率体温模块通过杜邦线连接到主控底板上,连接方式如下:% [8 D, m/ ?7 K5 K( h& f
(1)心率体温模块一端主需要使用杜邦线连接心率体温模块的3V3、GND、SCL、SDA四个引脚,如下图所示:
; f- [5 |* e2 L7 R
6 V% E' ?$ l, T6 ~. x5 ^
7 k# w; a( x5 y) ]3 U 图11
" ~1 Z! |4 S Q2 x (2)手机主控板一端需要使用杜邦线连接J4的2个引脚以及J10的两个引脚与心率体温模块的引脚一一对应,如下图所示
" \" n" h+ x, Z) f+ M! x! Z4 K8 C) x8 b4 Y$ I
& T/ k( [! g. C8 {2 X+ ]! w _6 g
; u" c- U! {$ |& m4 w' W 图12
9 @5 m" A5 }1 ^" ?, f+ F 使用JLINK通过杜邦线连接手机蓝牙位于手机主控底板,连接方式如下:
6 E% Z( g: X% R* X" Z$ H (1)JLINK一端只需要使用杜邦线连接JLINK的SWC、SWD、GND三个引脚,如下图所示:
7 w& i+ }! S4 o# i- ]# [4 @6 y( C# E# g8 M- F: V
3 H4 r ?6 {$ V) r, t 图13
8 _- Z4 Q; a) J& A4 x% G; X (2)手机蓝牙一端需要使用杜邦线连接上方右侧的J3三个引脚,与JLINK的连接引脚一一对应,分别为SWC-->SWCLK、SWD-->SWDIO、GND-->GND,如下图所示:
9 S& e0 N/ M: O1 w4 [ d- R) v7 V4 N; g! a9 J( r. O
- j/ V6 I; N$ L# ^/ `
图14& b/ x' Q4 Q/ b8 }& W% F, K5 v3 i
将JLINK插上电脑的USB接口,连接好之后给手机主控底板供电,详细的介绍可以参考《如何上电》教程,路径为:..\WT_Mobile\0.从这里开始\0.开机测试。0 d- X o+ k. o4 T, e3 S8 K
打开I2C实验的Keil工程i2c_eeprom.uvproj,位于目录:0 d$ d. G( O- S( w, g7 a
..\WT_Mobile\1.初级教程\DA14580\5_初级_I2C\projects\target_apps\peripheral_examples\i2c\i2c_eeprom\Keil_5,如下图所示:
0 N2 n7 M; f) a; B
' X! s8 u/ u4 X' U- F- H( q. e
& C: E) R7 ~& W 图15. Z0 D$ v! L3 q" Y& [" {) a
在KEIL中编译源代码,点击DEBUG,然后点击全速运行,在存储温度数据的变量下方打上断点,当程序运行到断点时就会停止。将该变量添加进变量查看窗口中,可以看到温度值,如下图所示:
# n1 j0 P2 ^7 J2 S8 m0 ~
4 K( ]; B3 A9 m# L$ y% O
: C; r$ | ~5 K! l% w( Z4 j$ M) O) Q( s9 a* } k( H
+ l' V. i% S7 F7 z p& v5 J, ^4 X6 D1 j6 B$ E- v# S& ?, O
+ h# R. f. \9 M9 o8 @% Z/ h8 o
6 x0 y% w- j5 B7 C+ Y+ R
3 v2 W" o+ i0 e ~0 \! d
图167 c8 {1 k5 Q: e, L( V+ s, K
U, |" U. v* {" t; L
7 a+ v+ _0 }! O9 }" K* d
( f4 y6 l$ ^7 W( s 配套资料:http://www.fengke.club
. I" v8 P+ C1 h 套件地址:http://shop115904315.taobao.com/: v- L5 m% j8 |) Q( ], B2 q% r
文件下载请点击:
I2C教程.pdf
(1.53 MB, 下载次数: 0)
$ o, e [( M7 i5 t9 Z" A7 Q* x: \, z4 \
# |* Q- d$ Y- T. H: K
* ^2 n$ y8 H# \5 c W |
|