📄 i2c.lst
字号:
C51 COMPILER V7.20 I2C 11/06/2008 20:27:10 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN I2C.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE I2C.c BROWSE DEBUG OBJECTEXTEND
line level source
1
2 #include "I2C.h"
3
4
5 /*****************************************************
6 宏定义:I2C_Delay()
7 功能:延时,模拟I2C总线专用
8 *****************************************************/
9 void I2C_Delay()
10 {
11 1 unsigned char i;
12 1 for(i=0;i<250;i++);
13 1 }
14
15
16
17 /*****************************************************
18 函数:I2C_Init()
19 功能:I2C总线初始化,使总线处于空闲状态
20 说明:在main()函数的开始处,通常应当要执行一次本函数
21 *****************************************************/
22 void I2C_Init()
23 {
24 1 I2C_SCL = 1; I2C_Delay();
25 1 I2C_SDA = 1; I2C_Delay();
26 1 }
27
28
29
30 /*****************************************************
31 函数:I2C_Start()
32 功能:产生I2C总线的起始状态
33 说明:
34 SCL处于高电平期间,当SDA出现下降沿时启动I2C总线
35 不论SDA和SCL处于什么电平状态,本函数总能正确产生起始状态
36 本函数也可以用来产生重复起始状态
37 本函数执行后,I2C总线处于忙状态
38 *****************************************************/
39 void I2C_Start()
40 {
41 1 I2C_SDA = 1; I2C_Delay();
42 1
43 1 I2C_SCL = 1; I2C_Delay();
44 1
45 1 I2C_SDA = 0; I2C_Delay();
46 1
47 1 I2C_SCL = 0; I2C_Delay();
48 1
49 1 }
50
51
52
53 /*****************************************************
54 函数:I2C_Write()
55 功能:向I2C总线写1个字节的数据
C51 COMPILER V7.20 I2C 11/06/2008 20:27:10 PAGE 2
56 参数:
57 dat:要写到总线上的数据
58 *****************************************************/
59 void I2C_Write(char dat)
60 {
61 1 unsigned char t = 8;
62 1 do
63 1 {
64 2 I2C_SDA = (bit)(dat & 0x80);
65 2 dat <<= 1;
66 2 I2C_SCL = 1;
67 2 I2C_Delay();
68 2 I2C_SCL = 0;
69 2 I2C_Delay();
70 2 } while ( --t != 0 );
71 1
72 1 }
73
74
75
76 /*****************************************************
77 函数:I2C_Read()
78 功能:从从机读取1个字节的数据
79 返回:读取的一个字节数据
80 *****************************************************/
81 char I2C_Read()
82 {
83 1 char dat = 0;
84 1 unsigned char t = 8;
85 1 I2C_SDA = 1; //在读取数据之前,要把SDA拉高
86 1 do
87 1 {
88 2 I2C_SCL = 1;
89 2 I2C_Delay();
90 2 dat <<= 1;
91 2 if ( I2C_SDA ) dat |= 0x01;
92 2 I2C_SCL = 0;
93 2 I2C_Delay();
94 2 } while ( --t != 0 );
95 1 return dat;
96 1 }
97
98
99
100 /*****************************************************
101 函数:I2C_GetAck()
102 功能:读取从机应答位
103 返回:
104 0:从机应答
105 1:从机非应答
106 说明:
107 从机在收到每个字节的数据后,要产生应答位
108 从机在收到最后1个字节的数据后,一般要产生非应答位
109 *****************************************************/
110 void I2C_GetAck()
111 {
112 1 /* bit ack;
113 1 I2C_SDA = 1; I2C_Delay();
114 1
115 1 I2C_SCL = 1; I2C_Delay();
116 1
117 1 ack = I2C_SDA;
C51 COMPILER V7.20 I2C 11/06/2008 20:27:10 PAGE 3
118 1 I2C_SCL = 0; I2C_Delay();
119 1
120 1 return ack;*/
121 1
122 1 I2C_SDA = 0; I2C_Delay();
123 1 I2C_SCL = 1; I2C_Delay();
124 1 I2C_SCL = 0; // SCL为低电平, SDA才允许改变
125 1 }
126
127
128
129 /*****************************************************
130 函数:I2C_PutAck()
131 功能:主机产生应答位或非应答位
132 参数:
133 ack=0:主机产生应答位
134 ack=1:主机产生非应答位
135 说明:
136 主机在接收完每一个字节的数据后,都应当产生应答位
137 主机在接收完最后一个字节的数据后,应当产生非应答位
138 *****************************************************/
139 void I2C_PutAck(bit ack)
140 {
141 1 I2C_SDA = ack; I2C_Delay();
142 1 I2C_SCL = 1; I2C_Delay();
143 1 I2C_SCL = 0; I2C_Delay();
144 1 }
145
146
147
148
149 /*****************************************************
150 函数:I2C_Stop()
151 功能:产生I2C总线的停止状态
152 说明:
153 SCL处于高电平期间,当SDA出现上升沿时停止I2C总线
154 不论SDA和SCL处于什么电平状态,本函数总能正确产生停止状态
155 本函数执行后,I2C总线处于空闲状态
156 *****************************************************/
157 void I2C_Stop()
158 {
159 1 unsigned char j,i;
160 1 I2C_SDA = 0; I2C_Delay();
161 1 I2C_SCL = 1; I2C_Delay();
162 1 I2C_SDA = 1; I2C_Delay();
163 1
164 1 for( i=0;i<20;i++ )
165 1 for( j=0;j<200;j++ ); // 在下一次产生Start之前,要加一定的延时
166 1 } // 一次延时0.1ms,共延时2ms
167
168
169
170 /*****************************************************
171 函数:I2C_Gets()
172 功能:I2C总线综合接收函数,从从机接收多个字节的数据
173 参数:
174 SlaveAddr:从机地址(7位纯地址,不含读写位)
175 SubAddr:从机的子地址
176 *dat:保存接收到的数据
177 Size:数据的字节数
178 返回:
179
C51 COMPILER V7.20 I2C 11/06/2008 20:27:10 PAGE 4
180 说明:
181 本函数能够很好地适应所有常见的I2C器件,不论其是否有子地址
182 当从机没有子地址时,参数SubAddr任意,而SubMod应当为0
183 *****************************************************/
184 void I2C_Gets
185 (
186 unsigned char SlaveAddr,
187 unsigned char SubAddr,
188 char *dat,
189 unsigned int Size
190 )
191 {
192 1 unsigned char i;
193 1 unsigned char a[3];
194 1
195 1 a[0] = SlaveAddr; // 准备从机地址
196 1 a[1] = SubAddr; // 准备子地址
197 1
198 1 I2C_Start(); // 发送从机地址,接着发送子地址
199 1 for ( i=0; i<2; i++ )
200 1 {
201 2 I2C_Write(a[i]);
202 2 I2C_GetAck();
203 2 }
204 1
205 1 //这里的I2C_Start()对于有子地址的从机是重复起始状态
206 1 //对于无子地址的从机则是正常的起始状态
207 1 I2C_Start();
208 1
209 1 I2C_Write(a[0]+1); // 发送从机地址,读器件
210 1 I2C_GetAck();
211 1
212 1 for (;;)
213 1 {
214 2 *dat = I2C_Read();
215 2 if ( --Size == 0 )
216 2 {
217 3 I2C_PutAck(1);
218 3 break;
219 3 }
220 2 I2C_PutAck(0);
221 2 dat++;
222 2 }
223 1
224 1 I2C_Stop(); //接收完毕,停止I2C总线,并返回结果
225 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 216 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 10
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -