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

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

[复制链接]

该用户从未签到

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

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
  • 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-7-30 19:17 , Processed in 0.156250 second(s), 27 queries , Gzip On.

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

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

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