找回密码
 注册
关于网站域名变更的通知
查看: 293|回复: 1
打印 上一主题 下一主题

【开发教程11】疯壳·ARM功能手机-I2C教程

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-6-27 19:33 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
I2C教程
——疯壳·开发板系列
! T! A3 d# D1 O; `+ Z% D
# ^  A, j  l  M$ I9 O! y

, p* q- `: L  V    
2 H) k: b4 t0 v  Z- W1 W% V4 I+ ~* r8 B% M    图1- Y/ Q% V, V* t

, J- \) c5 x' A    第一节I2C硬件电路
  N0 X+ m4 [! a: M/ P    将P12与P13配置为I2C的两个接口即可,P12与P13已通过排针引出,如下图所示:
" y, u- v* b2 b  Q% u6 W# i) v$ v
5 f  {) B! ?& H# U# d6 \# @ 5 d* _" A5 z; _# @9 ^  ~8 _
   
( ]9 e. ]7 J: t+ L2 b2 h: b( ~3 {    图2. E) K$ J0 ~8 r9 w

7 k. W  E7 _1 V7 R
" s# v. p  \7 _$ J1 L+ r* r3 f& H; c/ q, W* f7 D$ ~" u
    第二节 I2C# D. J7 q& q( w  w. v5 p3 H1 f

* h, R* L. V0 x    2.1 I2C介绍
, f8 |4 W, W% v4 y    I2C总线是一个为系统中电路通信提供支持的可编程控制总线,它是一个软件定义的两线通信协议。
* J8 T+ ?, m3 z, E) r( Q    两线I2C串行接口包括一个串行数据线(SDA)和一个串行时钟线(SCL);) b* `9 g3 x! ^2 ~# U
    支持两种通信速率,标准模式(0~100Kb/s)和快速模式(小于等于400Kb/s);
! ]6 P  |' Z1 c) Q% Y$ e: U    时钟同步;% w! F- e: w- q7 r+ |; f
    32字节的发送接收FIFO;
$ g$ f$ A8 d. q( f: _9 i    主机发送与接收操作;; \/ V* \4 G4 s" l8 @! I
    7或10位地址,7或10为混合格式发送;
# {4 \1 v" j% P7 Q: U    块发送模式;
+ d( a7 k7 W1 M. p: V' G. h& f    默认从地址为0x055;- ?% \; e) j7 u( d- r
    中断或者轮询操作模式;1 s3 T! S- U5 w( @; b
    可编程的数据线保持时间;9 ?# W" @$ ~4 U. n
5 [; ?4 [  v0 j" \& N: C
    2.2 寄存器介绍       
  V- F8 b' l# T5 ]        I2C相关的寄存器比较多,所以我们只介绍常用的寄存器,其它的可以参考官方数据手册AD14580_DS_v3.1.pdf,位于目录:..\WT开发板\硬件资料。! r" u3 l' M& `& j

1 E0 f+ p2 Y$ c" T$ {. ]! y    2.2.1 I2C控制寄存器2 b8 b" p- `# P- W3 K; g
" X  I6 H# g; V% m
    + }6 p7 C1 v* h0 s" i
    图3
) z% y4 k$ D' A$ c    15:7位:保留不使用;- p# K! q/ M. E
    6位:I2C从设备使能位,’0’表示从设备使能,’1’表示从设备不可用,该位不一定要软件设置,但是要保证如果该位为’0’则该寄存器的第0位也为’0’;
( }" e: c2 u: l5 g    5位:当作为主设备时,是否发送重启条件,’0’表示不可以,’1’表示可以;: U9 ~6 N0 m  W# Q; A+ g6 w& W3 r
    4位:作为主设备时,决定以7位地址还是10位地址开始发送,’0’表示7位地址,’1’表示10位地址;; m3 ]: N/ o* N( Y
    3位:作为从设备时,决定以7位地址还是10位地址开始发送,’0’表示7位地址,’1’表示10位地址;9 A' v7 ]! G( B' ^! \
    2:1位:I2C通信速度选择,1表示标准速度(100Kbit/s),2表示快速(400Kbit/s);( ]. ]+ {' G6 Z* ?
    0位:I2C主设备使能,’0’表示主设备不可用,’1’表示主设备使能,要保证如果该位为’1’则该寄存器的第6位也为’1’;# }* t  S6 I" A7 U, h
: ]3 k" l, U( O. f5 z
    2.2.2 I2C目标地址寄存器! S1 t7 |' s( L: ~" c, T

% Y$ g' V# k# M0 A  @4 e
; I0 k8 \: W+ m6 |% B0 C) S     & x# [) h6 |! _' F$ @; Q% l
    图49 J+ N$ T( [2 h  b* d6 z9 |! z
    15:12位:保留不使用;
+ p; b. L& e2 e9 H; g5 M6 _    11位:该位决定软件是否进行广播或者开始字节命令,’0’表示忽略第10位GC_OR_START并且正常使用IC_TAR;( t( P- k) A0 Y. S0 y/ V' k( p, F" }3 B
    10位:如果第11位设置为’1’,则该位表示控制器是否进行广播或开始字节命令,’0’表示发送广播地址,之后只能进行写操作,如果进行读操作则导致TX_ABRT置位,控制器一直停留在广播模式,直到第11位被清除,’1’表示发送开始字节;: U0 _; ~+ {9 H7 j' F
    9:0位:这是主设备发送的目标地址,如果发送广播则该位被忽略,CPU只需要写一次这些位;注意如果目标地址与从设备地址相同则存在回路,但是FIFO为主从共用,所以完全回路是可行的,只支持单方向的回路,一个主设备不能给自己发送数据只能发送给从设备。
8 L! R$ j* u3 _1 e. ?5 {0 C# U
% b8 s5 O- Z, Y. T( |    2.2.3 I2C接收发送数据缓存与命令寄存器
7 ~$ j0 j* F& a: z: N" ?# i: N+ W/ F% p8 r) [( P
" Y" q( P+ n! f+ G7 |" e
  4 F( @1 i" h, \
    图5/ P. H1 b  _7 r# N6 V% q! N7 Y/ J
     15:9位:保留不使用;
  x( B; M1 i- [' z        8位:读写控制位,作为从设备时不能控制方向,只能作为主设备时使用,’0’表示写,’1’表示读;
# m2 h! z/ c* |1 g4 h        7:0位:存储I2C总线上发送或接收的数据,如果你正在操作该寄存器并且要进行读操作则该位被忽略,如果你读该寄存器则该位存储的是接收到的数据。- u1 x& Z- O, {9 p2 J, Z
$ I  R: i6 ^  T/ G4 m- a$ `
    2.2.4 I2C清除TX_ABRT中断$ v" g: H% v2 `6 e' S2 R4 y" O- y
7 v0 I. Z2 S$ v
   5 d1 D# v* G" ]: [5 ^2 w
    图6
4 O$ v: X  ^! @& Z      15:1位:保留不使用;
5 d, n& ^: t* T7 L        0位:清除发送异常停止位,读该位则清除发送异常停止中断位,和发送异常停止源寄存器位。同时发送FIFO从刷新/复位状态中释放出来,可以允许更多写入。
# N( h8 L, B, G/ n
) e: g2 c. j- i8 a/ J+ g3 F  \    2.2.5 I2C使能寄存器
/ g- j1 I% r+ m: j
/ y! r5 B7 W: R" {
3 q4 ?  Z% n, L5 h  z    4 Q4 j; Z$ S" U
    图7" _! G2 A; U/ ~
        15:1位:保留不使用;3 P$ o! ~/ `- l1 Y& g0 o
        0位:控制器使能位;
& O6 W3 s' ~/ H* ~
+ _/ f* I  E* H3 o' f- D    2.2.6 I2C状态寄存器
0 X4 u$ W: P, _6 ]7 O* ~% _3 n; ]( V- |1 z

9 }' r4 O) W" O  b6 D$ ~& c5 D    
9 g  L7 K+ d( x    图8# f7 j6 Z9 {1 ^2 Z/ M! e" E% O
    15:7位:保留不使用;
* `3 @) N( T' c3 n    6位:判断从设备是否活动;/ l) j+ `& M0 R8 P/ j
    5位:判断主设备是否活动;
% Z2 e. V6 q9 ^/ R    4位:判断接收FIFO是否全满;7 p+ w# `* T: E8 a
    3位:判断接收FIFO是否为空;/ x* g/ f' B* J
    2位:判断发送FIFO是否全满;
, J" ]9 R6 ?" Z# ?    1位:判断发送FIFO是否为空;/ ]# S( M: t0 [8 Q, T3 |: i8 j9 t& |
    0位:判断I2C模块是否活动。& e- f9 ~7 q' s& M' V
$ o+ p% N$ K1 j' y' v2 p& s! x
    2.2.7 I2C接收FIFO数目寄存器! R- H1 t! ]4 n9 p9 F9 k/ g
2 w; O  y: b0 s3 F2 m2 Q) Q
   
. l1 b. q0 S, C9 r" ]    图9
! w0 v1 L- j+ s: {7 T    15:6位:保留不使用;
, R7 j; Q; ?7 R1 ]0 Q9 o    5:0位:接收FIFO可以接收多少字节。4 F* F& j: S0 W4 A4 X+ U% J1 b& M
1 w5 c) e% n5 x- V. A! j1 s% v
    2.2.8 I2C发送异常终止源寄存器4 I, ~1 E8 @" Y. h

5 i  q5 {- T8 q2 g 1 j9 ]+ F  y/ K5 @
    ( h5 {. {: c& e" B7 N
    图10) D' Z; z% ~$ C! G2 c* f1 y  y; i
    15位:当主设备需要发送数据时,却进入读数据状态;
# k9 K* ]) \. F6 f$ y# y    14位:当发送数据时,从设备丢失总线;, _; }! y/ u0 Y% Z: e
    13位:当从设备要接收数据时,FIFO中已经有一些数据;
, P+ E) F4 P  E    12位:失去仲裁;, i* C& t4 Q0 D% F* S: X
    11位:当主设备不可用时,用户进行主设备的操作;: F# `* j# Y! U2 ]6 n+ g
    10位:重启不可用,并且主设备在10位地址模式下发送读命令;! Y  \7 c. N3 @5 K: p
    9位:重启不可用,但是用户发送一个开始字节;
4 L, J( J9 n9 Q& E    8位:重启不可用,但是用户试图在高速模式下发送数据;# r3 u7 ?' X- b
    7位:主设备已经发送了一个开始字节,并且开始字节被确认;7 F3 M6 z( j. a) t! C" Z
    6位:主设备在高速模式下,并且被确认;" C, Y- d, v3 F9 E
    5位:主设备控制器广播之后进行读操作;
$ _' j1 U- x# j' b/ I    4位:主设备发送广播,但是没有从设备确认;  X8 D; y( Q' e  S
    3位:只有主设备有效,主设备已经发送地址,并确认,但是发送数据得不到确认信号;
$ B9 R& l/ Q/ a3 J0 `+ K3 J$ D    2位:主设备使用10位地址模式,10位地址的第二个字节没有被任何从设备确认;
( e3 b# Q! x7 @# J* f1 _    1位:主设备使用10位地址模式,10位地址的第一个字节没有被任何从设备确认;: e. K1 w) ~8 ^1 s6 F
    0位:主设备使用7位地址模式,但是没有被任何从设备确认。8 @9 b+ p/ g$ o+ y4 K. l

' [( ?9 ^. N/ O  E. L" E    2.3 寄存器配置讲解" x7 _% d; O9 S3 R; e2 w& K/ F

+ D6 ^1 O! R# ~* D; f4 M, D. U% P    #define CLK_PER_REG                (* ( volatile uint16*)0x50000004)
* v) f2 B1 e+ v9 w& |    #define I2C_CON_REG                (* ( volatile uint16*)0x50001300)
5 m) R  w4 f" v5 X4 ~/ q- D5 O" H    #define I2C_TAR_REG                 (* ( volatile uint16*)0x50001304), ^- ~' {+ ^) [5 v& B4 [+ V
    #define I2C_DATA_CMD_REG           (* ( volatile uint16*)0x50001310)+ y  d( d: a: X4 ^
    #define I2C_CLR_TX_ABRT_REG         (* ( volatile uint16*)0x50001354)
$ U! z+ E, B7 l2 z; ]    #define I2C_ENABLE_REG              (* ( volatile uint16*)0x5000136C)8 D) j0 }- u  m7 d
    #define I2C_STATUS_REG              (* ( volatile uint16*)0x50001370)) j5 ?+ l/ s  g4 G! Q7 ?5 F2 s8 @9 o
    #define I2C_RXFLR_REG               (* ( volatile uint16*)0x50001378)
7 n7 f) F/ f, t# K6 u& v) J: f9 c    #define I2C_TX_ABRT_SOURCE_REG     (* ( volatile uint16*)0x50001380)
" [! U. y6 L7 q2 ~  n& F0 U, ]    启动I2C模块的时钟:CLK_PER_REG |= 0x0020;9 w+ C6 |; i  `7 O
    I2C的初始化寄存器配置:
  U' H, P2 c0 U    先关闭I2C控制器, I2C_ENABLE_REG=0x00;$ b- P) H8 \+ Q1 l( j  q4 [
        设置为主模式,关闭从模式,可以重复开始,速度设置为快速,地址为7位模式(0x0000000001100101), I2C_ CON _REG =0x0065;% r0 H' R& A- d# W
        设置目标设备地址为0x51, I2C_TAR_REG =0x51;
4 O3 Z' j' M( c% x: s. }        打开I2C控制器, I2C_ENABLE_REG=0x01;8 n5 b7 l' i% i' C
        等待控制器准备好,while( (I2C_STATUS_REG & 0x20) != 0 );9 V  V5 A2 A# k
    读取地址为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;( U; b- v  z' ^1 u3 y% z0 P5 C* R$ 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);' ~% }- c; ^; X: O9 t# u  b- b0 m

' n8 l' T0 P3 B  F" z
+ _9 }3 A# R- D0 K/ Y5 o- X
9 M/ c4 B5 [" C4 Y! n( c8 U5 D( A
2 Y6 T! ~( A% U+ B) _' v    第三节 I2C实验6 G: A+ g( n2 \4 \9 y. `

! s- x+ o# R# Y. l# V  _$ X- h    实验需要使用的模块有:手机开发板底板,Jlink调试工具,杜邦线、心率体温模块、3.7V锂电池或Mocro USB线。
3 O" [, R& i5 a' n: \( d    将心率体温模块通过杜邦线连接到主控底板上,连接方式如下:
1 n4 e6 p& y4 k$ f3 O3 _    (1)心率体温模块一端主需要使用杜邦线连接心率体温模块的3V3、GND、SCL、SDA四个引脚,如下图所示:
7 c  v) u- S$ L' i) U8 @( k! E3 ~$ j/ l* K) r& [) o
   
7 L6 O. }& I$ p+ ^3 s6 Y0 M    图11, o! @! t/ s  B! Q
    (2)手机主控板一端需要使用杜邦线连接J4的2个引脚以及J10的两个引脚与心率体温模块的引脚一一对应,如下图所示
6 |  @' c3 C* e$ b: `; U+ u' z& S; {* V) B$ h8 s0 ~, g4 p

. ^) h; O* p6 F+ l* u8 r0 T) }1 M# Q" i9 `1 c
    , x. R. Z! r0 P* l
    图12( |  Y9 \  y( `; U' x
    使用JLINK通过杜邦线连接手机蓝牙位于手机主控底板,连接方式如下:- N7 a! Q3 k/ P  h& |" H! g
    (1)JLINK一端只需要使用杜邦线连接JLINK的SWC、SWD、GND三个引脚,如下图所示:# T5 D0 F4 u2 A9 |/ [
5 `, R  N8 I4 P. V

7 k; N+ y7 Q( |! G& k    图13
  w( l9 t8 Y# d1 F" l+ m0 x6 V    (2)手机蓝牙一端需要使用杜邦线连接上方右侧的J3三个引脚,与JLINK的连接引脚一一对应,分别为SWC-->SWCLK、SWD-->SWDIO、GND-->GND,如下图所示:1 J; i3 [1 _; ~, P

5 X) J/ `2 B5 [1 e( }/ V     ( Y) ]3 X' Y" G" E' Q1 x1 W
    图14
! h6 T& K- g  P    将JLINK插上电脑的USB接口,连接好之后给手机主控底板供电,详细的介绍可以参考《如何上电》教程,路径为:..\WT_Mobile\0.从这里开始\0.开机测试。  T0 Y9 y; ?5 K) P/ j! c/ t9 [
    打开I2C实验的Keil工程i2c_eeprom.uvproj,位于目录:
2 X3 v0 ~& e3 J! J* }    ..\WT_Mobile\1.初级教程\DA14580\5_初级_I2C\projects\target_apps\peripheral_examples\i2c\i2c_eeprom\Keil_5,如下图所示:
$ `9 S3 y$ X1 M! A# l" @
* `) _( ?) _& w! p) \' Q     * F9 ^' q( G7 K$ ?
    图15
8 Q9 m. t3 [9 K" W% R& m    在KEIL中编译源代码,点击DEBUG,然后点击全速运行,在存储温度数据的变量下方打上断点,当程序运行到断点时就会停止。将该变量添加进变量查看窗口中,可以看到温度值,如下图所示:
* e1 s& ?% }( d- F  J  [" O; Y5 ~0 e; g! ]

( o6 _$ H: N( W, h% E: M* h( j: |0 u) `8 b8 r; h
3 u- h& E" A* P5 q% u
, V  {3 w1 s/ n9 Y  V, z( A
) h6 T8 N& e& H
# _, ?* E* r0 q2 g+ K
    7 U" v  C& [. z( s
    图16" H1 ?" u& a* ?/ x2 ~* U8 @
, f4 m) q: Y2 Y2 C3 O- F3 V+ b
( p# p# ~1 a! {

  a( E; B# j8 [  S    配套资料:http://www.fengke.club
' x! w) c$ C! l5 i2 ]8 Z" a2 G, p    套件地址:http://shop115904315.taobao.com/& t1 c* {8 |+ a" G
    文件下载请点击: I2C教程.pdf (1.53 MB, 下载次数: 0) 2 L, u. D  Y0 U+ E6 p

9 m) {9 H. A/ x& |' u( G2 |, t8 f

: [/ t( e9 E! w. |
  • TA的每日心情
    开心
    2023-6-12 15:40
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2022-6-30 20:53 | 只看该作者
    ARM用的都是MDK软件,还可以在线仿真,很方便
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-11-23 21:51 , Processed in 0.171875 second(s), 26 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表