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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
I2C教程
——疯壳·开发板系列
! f: |6 C; @1 g8 g; w$ R

/ _5 |# ^, V. B! X9 z. Q7 @9 \3 W. k5 T
    + ~3 U9 S  G8 A" ?* y
    图1
8 y' x" }% Z  N7 W
9 g) I& q! a1 ~( q    第一节I2C硬件电路
) I$ t) r. d) O$ t! c' \, ]    将P12与P13配置为I2C的两个接口即可,P12与P13已通过排针引出,如下图所示:
: P7 @' P4 C  T1 \( B6 b, h. S1 S/ W  J- F4 N2 U. t
+ }8 O5 w' c" U3 Z3 K' F$ c
   
6 O% @+ j2 b0 r    图2, W2 A# U2 f* e0 B/ u  X' x
& x0 C& Z8 ?( J( b% Y# p  h1 ?8 F

+ z4 m0 ~) U9 R8 V8 w3 l/ {
' v( G# \1 N: }) ]7 H    第二节 I2C
- `& f1 j0 G! S! g/ `2 g- Y' x+ a+ r1 {. o* S
    2.1 I2C介绍
" u2 u4 a% C* D/ L    I2C总线是一个为系统中电路通信提供支持的可编程控制总线,它是一个软件定义的两线通信协议。
/ Q& y0 ?  e8 R- ~    两线I2C串行接口包括一个串行数据线(SDA)和一个串行时钟线(SCL);6 R$ Z2 C0 |% C- E. k' |
    支持两种通信速率,标准模式(0~100Kb/s)和快速模式(小于等于400Kb/s);
7 y' V  F+ Q1 n    时钟同步;) K1 U6 d* M1 S: L3 ]4 i
    32字节的发送接收FIFO;8 t- @1 ^% n! k* d& w) k
    主机发送与接收操作;: c3 ~( P+ ]3 u) R/ f
    7或10位地址,7或10为混合格式发送;# n& N1 A& `8 [3 v% [$ G
    块发送模式;7 h/ Y* P  ]# G  U" J
    默认从地址为0x055;  |  M4 U% n# I! x" Q0 }2 P
    中断或者轮询操作模式;- T% I: D/ {6 _# G+ p' l
    可编程的数据线保持时间;7 \( c7 Q6 w' ~+ D
- W: k) [3 m/ h) a
    2.2 寄存器介绍       
6 m7 L6 n9 w9 H- Y! ]# F7 a        I2C相关的寄存器比较多,所以我们只介绍常用的寄存器,其它的可以参考官方数据手册AD14580_DS_v3.1.pdf,位于目录:..\WT开发板\硬件资料。
& P% G1 E" W$ c  i# s5 L+ H1 E
9 w" l0 [( W4 Q    2.2.1 I2C控制寄存器
* [/ M$ ?; @. [, a
) ^5 ?0 o) Z1 ~. h: R' n     ( J/ O  I1 A6 ]3 A
    图3
/ C% `$ |7 [$ a  S# k* I& l. i) {' [    15:7位:保留不使用;
& n  C$ f: T$ v# N4 h5 X/ F8 r, A+ K( f    6位:I2C从设备使能位,’0’表示从设备使能,’1’表示从设备不可用,该位不一定要软件设置,但是要保证如果该位为’0’则该寄存器的第0位也为’0’;" X7 y* j# c9 M! Z
    5位:当作为主设备时,是否发送重启条件,’0’表示不可以,’1’表示可以;
1 Q% U2 J  s7 I" [    4位:作为主设备时,决定以7位地址还是10位地址开始发送,’0’表示7位地址,’1’表示10位地址;2 N9 w% N; E! B9 J7 Z
    3位:作为从设备时,决定以7位地址还是10位地址开始发送,’0’表示7位地址,’1’表示10位地址;2 V: L& D* m/ N1 g' m
    2:1位:I2C通信速度选择,1表示标准速度(100Kbit/s),2表示快速(400Kbit/s);
7 [  x4 n, d0 f; V$ j, ~    0位:I2C主设备使能,’0’表示主设备不可用,’1’表示主设备使能,要保证如果该位为’1’则该寄存器的第6位也为’1’;- m& v# l. p& J; Z
7 H' e' v; e3 D9 r
    2.2.2 I2C目标地址寄存器$ |/ _1 L9 z% b  E

$ l% p7 y. r- k- c
0 I$ q# C" F! c  [1 r% A     0 _/ G/ n% |4 T5 d5 L+ g& k; \3 w
    图4
! M2 d3 h1 h/ L2 g    15:12位:保留不使用;
6 _/ ]$ r4 U- t8 {# i% l7 K, S    11位:该位决定软件是否进行广播或者开始字节命令,’0’表示忽略第10位GC_OR_START并且正常使用IC_TAR;
3 G$ d/ M* ~& G0 J" S3 _' R    10位:如果第11位设置为’1’,则该位表示控制器是否进行广播或开始字节命令,’0’表示发送广播地址,之后只能进行写操作,如果进行读操作则导致TX_ABRT置位,控制器一直停留在广播模式,直到第11位被清除,’1’表示发送开始字节;
, T7 F; o+ b6 v) P8 x' Z; O/ t) x    9:0位:这是主设备发送的目标地址,如果发送广播则该位被忽略,CPU只需要写一次这些位;注意如果目标地址与从设备地址相同则存在回路,但是FIFO为主从共用,所以完全回路是可行的,只支持单方向的回路,一个主设备不能给自己发送数据只能发送给从设备。& }: G+ e) t3 U( e& G/ h$ P
, a' E. |; Y* J; B+ J
    2.2.3 I2C接收发送数据缓存与命令寄存器
. \0 M( a: W( J7 W/ C
  y; U; H; G* e
# X8 m' E! q. H' d- a   6 @" s+ i: ?6 K
    图5
# Z6 g# Y  B3 l     15:9位:保留不使用;
/ v# g+ F' r( a4 ^. W1 ?        8位:读写控制位,作为从设备时不能控制方向,只能作为主设备时使用,’0’表示写,’1’表示读;4 \! ~9 z8 U+ J: V; `
        7:0位:存储I2C总线上发送或接收的数据,如果你正在操作该寄存器并且要进行读操作则该位被忽略,如果你读该寄存器则该位存储的是接收到的数据。. e3 i% p+ y0 s  x

* o5 Q: ^  v+ t6 T2 r    2.2.4 I2C清除TX_ABRT中断
5 w9 z0 n! K) p8 w; D# l" _
7 G. i- c& Y- l. d7 u    
0 A( `2 D4 T: F9 @' d    图6& K1 `0 E5 [# g+ P% K
      15:1位:保留不使用;4 \4 |# X9 u/ A8 a; e
        0位:清除发送异常停止位,读该位则清除发送异常停止中断位,和发送异常停止源寄存器位。同时发送FIFO从刷新/复位状态中释放出来,可以允许更多写入。
' ~  @5 [: a3 G) _( }! m! k+ F9 R1 @( b5 U1 u) W& x
    2.2.5 I2C使能寄存器, h+ K  L0 _+ U) y( ~( M
0 c% a4 S' j3 b1 W

) T& W. f! n: P1 K& Z' R4 u    
. e" f" F, d) \' i- `6 M6 L    图73 [5 [7 N6 u/ ~* K4 D
        15:1位:保留不使用;% q  t- e" s, n; J
        0位:控制器使能位;
9 }: b: o" c2 M- _8 {, \; u! \  Q
* i& a) }, d% n$ X! `4 C    2.2.6 I2C状态寄存器, c: h' x; C+ v6 n3 ^, T
2 I- U' i# }  Z+ b3 E* i

+ R4 X  C. {; V( U$ e3 k       `' R7 ?6 [" Z
    图8  X, _0 {- |9 ^1 ?8 I' Y7 N
    15:7位:保留不使用;. ^6 ~7 o/ [0 Z
    6位:判断从设备是否活动;
" B- N1 q6 h& s# S6 i2 H8 W. N    5位:判断主设备是否活动;
2 ~5 _3 F' y7 m1 Q2 b+ x    4位:判断接收FIFO是否全满;8 @: a. J$ f1 p- Z& N
    3位:判断接收FIFO是否为空;
3 u* Y; f- c; ^    2位:判断发送FIFO是否全满;
/ J, }' ^: Q6 n0 w    1位:判断发送FIFO是否为空;9 J. s6 G6 ^9 V
    0位:判断I2C模块是否活动。4 H' i& S2 p5 V3 I' A% B
5 D8 r' A/ B8 N3 O
    2.2.7 I2C接收FIFO数目寄存器
: s/ M) U7 q$ ^  B9 h
* X. [6 i% {: x, D  L  H7 {     6 b+ R9 H7 [) |2 H% i1 }6 @! T
    图9  M+ ?/ E' j$ o. {4 b. U
    15:6位:保留不使用;1 [# D4 V/ k; \1 E2 e
    5:0位:接收FIFO可以接收多少字节。
& q0 G  E0 C, ]1 f, k2 Q7 Q- p- O9 h/ g; @
    2.2.8 I2C发送异常终止源寄存器
+ p) v/ n2 J/ ?3 A- O( ~% ?% _( B- K. j! r3 H

% J4 |) a( U) k0 N$ i- u, F' y5 h2 S0 L    
+ G5 G0 \, H1 A& _- N    图10+ v: T, @: T: f$ X3 R
    15位:当主设备需要发送数据时,却进入读数据状态;3 M1 N- P3 y8 M& M
    14位:当发送数据时,从设备丢失总线;
8 a8 f- r3 M8 P1 R    13位:当从设备要接收数据时,FIFO中已经有一些数据;0 h: p3 x. W$ O
    12位:失去仲裁;" c% P4 O1 L$ n  e
    11位:当主设备不可用时,用户进行主设备的操作;( A% x/ u+ P& x" B
    10位:重启不可用,并且主设备在10位地址模式下发送读命令;
% f5 a. Y- X% S5 p3 i    9位:重启不可用,但是用户发送一个开始字节;- d. M$ M6 l( M# u) W
    8位:重启不可用,但是用户试图在高速模式下发送数据;  A& W2 t7 d2 P! @7 z
    7位:主设备已经发送了一个开始字节,并且开始字节被确认;
1 p3 w. d+ x: h" _6 N! X4 E8 b    6位:主设备在高速模式下,并且被确认;" {/ }' m- U/ c; x/ L9 p8 n
    5位:主设备控制器广播之后进行读操作;
5 W  f6 f$ N9 q) |1 u    4位:主设备发送广播,但是没有从设备确认;
" G- J8 X* Z5 O& F% [7 L) u    3位:只有主设备有效,主设备已经发送地址,并确认,但是发送数据得不到确认信号;3 f) x; p$ w' @3 n
    2位:主设备使用10位地址模式,10位地址的第二个字节没有被任何从设备确认;
; v% h+ c- M  k    1位:主设备使用10位地址模式,10位地址的第一个字节没有被任何从设备确认;
6 i/ b# A; [' N3 k- D5 n    0位:主设备使用7位地址模式,但是没有被任何从设备确认。8 H. k" _3 R$ n! ]7 A3 X) ~! z
9 K  P# v. e. `( u4 v0 \/ z
    2.3 寄存器配置讲解+ }; ?0 `3 h3 T4 t9 ]
' V8 I. x+ j) Z( j. B
    #define CLK_PER_REG                (* ( volatile uint16*)0x50000004)" b. I8 A8 K, D) M
    #define I2C_CON_REG                (* ( volatile uint16*)0x50001300). S8 c; ?  J  q* a, B
    #define I2C_TAR_REG                 (* ( volatile uint16*)0x50001304)
7 ?" X8 V" h( w' H    #define I2C_DATA_CMD_REG           (* ( volatile uint16*)0x50001310)
/ J* T1 J( x4 D6 E. T& W    #define I2C_CLR_TX_ABRT_REG         (* ( volatile uint16*)0x50001354)- n: O* ~" ?  i1 v# F* P3 I
    #define I2C_ENABLE_REG              (* ( volatile uint16*)0x5000136C)
% ?: C# Y6 R: v/ o, z# A    #define I2C_STATUS_REG              (* ( volatile uint16*)0x50001370)+ D0 c) ?; ^$ R
    #define I2C_RXFLR_REG               (* ( volatile uint16*)0x50001378)+ m7 @+ z) @" R* E4 d' h
    #define I2C_TX_ABRT_SOURCE_REG     (* ( volatile uint16*)0x50001380)9 V. C7 P6 F7 f, Z4 B0 p- l4 b1 r  a
    启动I2C模块的时钟:CLK_PER_REG |= 0x0020;
# Y. R4 i: G7 O. P% Q( H1 s* M    I2C的初始化寄存器配置:
3 N; B' K! o  f    先关闭I2C控制器, I2C_ENABLE_REG=0x00;1 g1 c2 g, @  ]4 E' a$ B# L
        设置为主模式,关闭从模式,可以重复开始,速度设置为快速,地址为7位模式(0x0000000001100101), I2C_ CON _REG =0x0065;. ]& X) }* ~( x( v7 ]
        设置目标设备地址为0x51, I2C_TAR_REG =0x51;
2 `2 |  w; A1 ?! x+ n        打开I2C控制器, I2C_ENABLE_REG=0x01;' x& t0 y5 i6 \5 @# b, t/ l6 T
        等待控制器准备好,while( (I2C_STATUS_REG & 0x20) != 0 );
/ O! o1 D; n+ [" ~    读取地址为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;0 [. Y% P  P4 [% O6 s
    向地址为0x98处写入一个字节0xaa,先发送地址I2C_DATA_CMD_REG = 0x98;等待发送完毕while((I2C_STATUS_REG&0x0002)==0);发送数据I2C_DATA_CMD_REG = 0xaa; 等待发送完毕while((I2C_STATUS_REG&0x0004)==0);8 Q& k6 K/ s, F. o( o3 n
& v/ g. e1 y6 @  w1 q

: r- S8 U! Z# A" E0 t  h7 o. b3 J9 n: K4 k/ m/ [
$ N. I! y: m# O3 j
    第三节 I2C实验0 m$ `, ~. d' w1 ]0 d

3 p+ H: f9 p/ x" S- Q& T1 z    实验需要使用的模块有:手机开发板底板,Jlink调试工具,杜邦线、心率体温模块、3.7V锂电池或Mocro USB线。4 Q  m, p9 W- O- ]. e
    将心率体温模块通过杜邦线连接到主控底板上,连接方式如下:
2 \7 n9 O( Z% V  g: u; g    (1)心率体温模块一端主需要使用杜邦线连接心率体温模块的3V3、GND、SCL、SDA四个引脚,如下图所示:. M" p6 b: \9 W/ ]0 H
+ {* P. x) t9 x4 D4 _3 B' o
   
: A3 m& N6 ^0 T1 ]2 D- y    图11
( j0 Z+ `' x1 x. t0 ?    (2)手机主控板一端需要使用杜邦线连接J4的2个引脚以及J10的两个引脚与心率体温模块的引脚一一对应,如下图所示
$ X& Z; V7 `  W$ i( \" c
: Q9 H/ i- M  ]6 z. B/ Z0 \
0 d5 t& l* H* b1 E' d5 i: V7 h9 r
* G& m9 }) R/ D0 n( Y! p    
* M5 C; J) u- l% T    图12
1 u8 s1 ~7 f/ n4 r    使用JLINK通过杜邦线连接手机蓝牙位于手机主控底板,连接方式如下:
: B- ^& q! d3 z' V) \3 |. ^    (1)JLINK一端只需要使用杜邦线连接JLINK的SWC、SWD、GND三个引脚,如下图所示:
4 p! J0 j% @$ _9 i+ J& I. ]& ]2 Q/ ~  e! @' l" m
% C/ \# O" h5 L0 G: Z) S) S
    图13% j7 `; ]' P  _
    (2)手机蓝牙一端需要使用杜邦线连接上方右侧的J3三个引脚,与JLINK的连接引脚一一对应,分别为SWC-->SWCLK、SWD-->SWDIO、GND-->GND,如下图所示:
3 p; d' P% S! j, o# K8 [. A
) H* d7 z, C: T9 C/ j$ b% Z     ( Z5 ~6 |$ y; x& |! K( L
    图14$ b1 d  B& T0 ]; k9 X! N9 j/ r
    将JLINK插上电脑的USB接口,连接好之后给手机主控底板供电,详细的介绍可以参考《如何上电》教程,路径为:..\WT_Mobile\0.从这里开始\0.开机测试。
' x* ?0 _5 A$ O/ S  _0 g    打开I2C实验的Keil工程i2c_eeprom.uvproj,位于目录:
2 |% x5 L! e1 m  D    ..\WT_Mobile\1.初级教程\DA14580\5_初级_I2C\projects\target_apps\peripheral_examples\i2c\i2c_eeprom\Keil_5,如下图所示:6 e1 g$ E: r9 M; b* h% V

' E! E( j) [2 I3 l. A     : p4 b6 r, ~* R- m
    图15
. B, v& j: s9 d' b( W. D+ [, v    在KEIL中编译源代码,点击DEBUG,然后点击全速运行,在存储温度数据的变量下方打上断点,当程序运行到断点时就会停止。将该变量添加进变量查看窗口中,可以看到温度值,如下图所示:. ]3 o0 l1 k1 G; ~$ R

6 j! t. J( [3 _4 r- J5 }* R; | : _- f; A; B$ g% V  S  C

% Y4 O+ k# q. K6 p / ~3 K: |, a$ Z9 c

1 H+ k) }9 r$ e4 P
' @5 f( }2 R3 ?. ~& s4 e+ i) u6 j) P, k; i+ m& \
   
8 A5 C& C. J/ ^. g+ |1 C& S% |! Y1 g    图16  a! J8 j8 X! y/ R' l

/ b" w+ ]4 j* _9 S/ g
. k' V8 E: M, _$ c1 Z* B/ P
" N) o8 P2 v% ^    配套资料:http://www.fengke.club
; C: v  a+ P5 `: F/ O9 R0 ~  Q    套件地址:http://shop115904315.taobao.com/) ^/ F0 E. X( Z( G# {' X0 y# S# W: t
    文件下载请点击: I2C教程.pdf (1.53 MB, 下载次数: 0)
0 b: l. R5 ^8 E; |2 u$ g# Y. V0 z- q2 v; Y' h8 o
! x( T0 A2 _1 ^4 X
* I* F0 X, {" J! |; a
  • 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 23:11 , Processed in 0.203125 second(s), 26 queries , Gzip On.

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

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

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