本帖最后由 pla155 于 2019-8-6 08:15 编辑 . k% D9 C, p% w
$ G) O- `, _& K% h' PIIC总体特征 Ø SDA和SCL都是双向线路,通过一个电流源或上拉电阻连接到正的电源电压。 Ø 当总线空闲时这两条线路都是高电平。 Ø 连接到总线的器件输出级必须是漏极开路或集电极开路才能执行线与的功能。 Ø 总线上数据的传输速率在标准模式下可达100kbit/s,在快速模式下可达400kbit/s,在高速模式下可达3.4Mbit/s。 Ø 在SCL线是高电平期间SDA线上的数据必须保持稳定。 Ø 在SCL线是低电平期间SDA线的高或低电平状态可以改变。 Ø 在SCL线是高电平期间SDA线从高电平向低电平切换表示起始信号。 Ø 在SCL线是高电平期间SDA线从低电平向高电平切换表示停止信号。 Ø 发送到SDA线上的每个字节必须为8位。 Ø 首先传输的是数据的最高位。 Ø 每次传输可以发送的字节数量不受限制。 Ø 每个字节传输后必须从机需给一个响应位。 Ø 响应时钟脉冲SCL由主机产生。 Ø 在响应的时钟脉冲期间主机释放SDA线(高电平)。 Ø 在响应的时钟脉冲期间从机需将SDA线拉低并保持稳定。 Ø 如果从机不能立刻接收或发送下数据字节,可以使时钟线SCL保持低电平迫使主机进入等待状态。当从机准备好后,应该释放时钟线SCL。 * T+ r0 u+ J4 O. m" c* I
第一个字节的位定义 第一个字节的头7位组成了从机地址。最低位LSB是第8位它决定了报文的方向。最低位是0 表示主机写信息到被选中的从机,最低位是1 表示主机向从机读信息。
( {) e8 l$ r7 g$ T9 ?: i' X0 X2 {# K& Z% R% V! g. E' Z* G9 f
对应这个驱动芯片,也就是很简单的三个函数。
3 u2 e, O4 U+ ?: W- [启动总线函数" V) Z$ m) j# z# {8 G
// extern void IIC_START( void );
* t% |1 z& @ z2 ~+ f* p RSEG ?PR?IIC_START?IIC
& k z* }+ f% I8 x T2 K! EIIC_START:6 m4 [" B. p" a9 O3 }8 q
SETB IIC_SDA
% J3 k% P. C2 R4 C" |0 A& C' C* ] m_IIC_CLK. c- F F- t6 v) z5 J9 E/ u
SETB IIC_SCL
/ K6 }$ H+ d' _: |' d; C m_IIC_CLK# s. k3 o$ `1 e) S. b
CLR IIC_SDA
- O/ M: h) ^. H1 i# k m_IIC_CLK% c g( t& ?% C; t D& h6 h3 z7 C
CLR IIC_SCL8 k: ^4 g% f0 ^5 }9 Q, r* R, l
RET1 J' G3 A: {% @- O& ]1 T" ^- p3 I
;---------------------------------------
. k- y4 ?% g: Q. J6 B. L) K& s$ F4 _! ]
1 m; f5 D4 w# K9 |+ V9 M" ~# A结束总线函数1 x% z! o# e) ^2 [
// extern void IIC_STOP( void );! C- D7 P6 T$ q
RSEG ?PR?IIC_STOP?IIC
) c$ l9 p# w; x2 ~. q2 \3 l; xIIC_STOP:
6 W$ Y: B$ L$ A3 A7 t3 T: M CLR IIC_SDA
( a9 W1 }$ O; s- \: g) Y m_IIC_CLK
4 H' I v4 d' Y SETB IIC_SCL
; b% g2 b) |/ n# G3 o0 v; Y0 [" Y9 F m_IIC_CLK
& N* h+ |: W" ]' Y, \* F SETB IIC_SDA
% f% B! S4 {; k' F8 x1 x m_IIC_CLK
3 P9 j6 j1 }. e m_IIC_CLK& T2 l: U, d& s) W) }* I, L( M
RET- u$ `9 H5 U' B
;-------------------------------------------------------------------------------
3 A/ w2 m; f- N, `: Y w0 \; U" j) B发送数据函数
7 y! M% M$ d7 _- R0 T// extern bit IIC_WriteByte( unsigned char cDATA );! r! q/ b3 T3 q# x9 l
RSEG ?PR?_IIC_WriteByte?IIC9 _' x9 W( q: l" f
_IIC_WriteByte:
1 N" k+ e1 M: L MOV A , R7
/ L/ S7 W0 d* R- a! Z( J2 V MOV R7 , #008H# p! [% p7 L2 B8 b1 H ^! c
JP0_IIC_WriteByte:" f2 P4 p$ ]+ P9 ?5 e ~
RLC A ; 首先传输的是数据的最高位
5 d9 R8 V. m. j6 m1 P MOV IIC_SDA , C
3 Z; X9 x0 r. X9 ~7 ^1 F, y m_IIC_CLK
: b8 m* t, E9 [$ p4 k; L5 u SETB IIC_SCL
: U8 V3 T/ g& s: V6 J% G" q m_IIC_CLK) j5 _8 \5 }: a
CLR IIC_SCL) W" p) b& N$ k: H
DJNZ R7 , JP0_IIC_WriteByte
9 N& J) [/ w& w' D) S ;在响应的时钟脉冲期间主机释放SDA线(高电平)
8 R$ q. C7 v* \3 K2 }% ]' m m_IIC_CLK* R) V- I: X/ A9 s/ w/ j4 E
SETB IIC_SDA- N `" P" z# H0 U; P
m_IIC_CLK
& A* C, C( ^" { ^/ i% e p SETB IIC_SCL
w# [* b0 q( Y. o9 I/ b" l m_IIC_CLK( V s! {7 j. N; Y; m8 V, \9 {# F9 r
; 每个字节传输后必须从机需给一个响应位3 }0 P- J$ G% Q$ u: V ]
MOV C , IIC_SDA
3 L7 A, g, D) p1 H4 S. K; B CLR IIC_SCL
& O9 d5 |! ^4 Y( X1 m RET, F) z' f# e. k3 X5 i; q+ w" M
+ B: W: P0 }& A" S6 d
, C ?5 G) F2 X+ S0 D
6 g8 x/ W5 `8 R! r首先启动IIC总线,然后按照要求发送控制字和数据,最后释放总线。(高电平)
" L5 @- V+ B$ o( `; X |