📄 24c04.lst
字号:
C51 COMPILER V8.02 24C04 05/18/2008 16:43:11 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE 24C04
OBJECT MODULE PLACED IN 24c04.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 24c04.C LARGE BROWSE DEBUG OBJECTEXTEND
line level source
1 /*******************************************************************************
2 * 版权所有(c) 豪恩科技有限公司
3 *
4 * 文件名称: 24C04.H
5 * 文件标识:
6 * 内容摘要: 24C04的基本读写程序。但没有定义SDA,SCL。
7 * 先定义SDA,SCL。还需要定义24C04的A2,A1。
8 * 再包含该文件。
9 * 函数有, I2CStart , I2CStop ,
10 * 其他说明: 所有子函数要求在退出时统一都保证SCL为高,带返回值的,成功返回0,失败返回1
11 * 当前版本: 00.000
12 * 作 者: 涂常亮
13 * 完成日前: 2005
14 * 修改记录1:
15 * 修改日期:
16 * 版 本 号:
17 * 修 改 人:
18 * 修改内容:
19 * 修改记录2:
20 *******************************************************************************/
21 #include <intrins.h>
22 #include<reg54.h>
23
24 //#define USE_SEQ_RD
25
26 //定义 24C04_H不合理 ???
27 #ifndef AT24C04_H
28 #define AT24C04_H
29
30 #ifdef ADD_24C04_A2A1
#define ADD_WRITE_24C04 0xA0 | ADD_24C04_A2A1
#define ADD_READ_24C04 0xA1 | ADD_24C04_A2A1
#else
34 #define ADD_WRITE_24C04 0xA0
35 #define ADD_READ_24C04 0xA1
36 #endif
37
38 //定义24C04的响应等待时间,Datasheet是10ms,
39 #define WAIT_ACK_TIME 11
40
41 //读写24C04的返回值
42 #define WR_SUCC_RTN 0
43 #define RD_SUCC_RTN 0
44 #define WR_FAIL_RTN 0xFF
45 #define RD_FAIL_RTN 0xFF
46 #define ERR_TIME_OV 1
47 #define ERR_ILLEGAL_ADD 2
48 //写入后读出值和写入值不同
49 #define ERR_WRT_WRONG_RESULT 1
50 //连续读时地址超出范围
51 #define ERR_ADD_OV
52
53 sbit pin_SCL = P1^3;
54 sbit pin_SDA = P1^4;
55 //sbit pin_WP = P4^1;
C51 COMPILER V8.02 24C04 05/18/2008 16:43:11 PAGE 2
56
57 #define SDA pin_SDA
58 #define SCL pin_SCL
59
60 extern volatile unsigned char idata g_ucTimer24C04Ack;
61 extern bit g_FlagWaiting24C04Ack;
62
63 void I2CStart(void);
64 void I2CStop(void);
65 bit ReadAck(void);
66 void SendAck(void);
67 void Send8Bit(unsigned char uc8BitSend);
68 unsigned char Recev8Bit(void);
69 bit WriteByte(unsigned char ucDataWrite, unsigned int uiAddWrite);
70 unsigned char ReadByte(unsigned int uiAddRead);
71 unsigned char PageWrite(unsigned char const idata *pucDataWrt,
72 unsigned int uiAddStart_PgWr,
73 unsigned char ucLength_PgWr);
74 unsigned char PageFill(unsigned char const idata ucDataPgFill,
75 unsigned int uiAddStart_Fill,
76 unsigned char ucLengthFill);
77 bit SeqRead(unsigned int uiAddStart_SqRd, unsigned char ucLength_SqRd,
78 unsigned char *pucDataStr);
79
80 /*******************************************************************************
81 * 函数名称: void I2CStart(void);
82 * 功能描述: 发送I2C起始位
83 * 输入参数: 无
84 * 输出参数: 无
85 * 返 回 值: 无
86 * 其他说明:
87 * 修改日期 版 本 号 修 改 人 修改内容
88 *-------------------------------------------------------------------------------
89 *
90 *******************************************************************************/
91 void I2CStart(void)
92 {
93 1 //SCL = 0; //在多机时有用
94 1 //_nop_();
95 1 SDA = 1;
96 1 _nop_();
97 1 SCL = 1;
98 1 _nop_();
99 1 SDA = 0;
100 1 SCL = 0;
101 1 }
102
103 /*******************************************************************************
104 * 函数名称: void I2CStop(void)
105 * 功能描述: 发送I2C停止位
106 * 输入参数: 无
107 * 输出参数: 无
108 * 返 回 值: 无
109 * 其他说明:
110 * 修改日期 版 本 号 修 改 人 修改内容
111 *-------------------------------------------------------------------------------
112 *
113 *******************************************************************************/
114 void I2CStop(void)
115 {
116 1 SCL = 0;
117 1 _nop_();
C51 COMPILER V8.02 24C04 05/18/2008 16:43:11 PAGE 3
118 1 SDA = 0;
119 1 _nop_();
120 1 SCL = 1;
121 1 _nop_();
122 1 SDA = 1;
123 1 }
124
125 /*******************************************************************************
126 * 函数名称: bit ReadAck(void);
127 * 功能描述: 主机读取I2C总线的应答信号
128 * 输入参数: 无
129 * 输出参数: 无
130 * 返 回 值: 位变量,应答期间SDA的为高返回1,为低返回0
131 * 其他说明:
132 * 修改日期 版 本 号 修 改 人 修改内容
133 *-------------------------------------------------------------------------------
134 *
135 *******************************************************************************/
136 bit ReadAck(void)
137 {
138 1 bit FlagAck;
139 1 //SCL = 0;
140 1 SDA = 1;
141 1 _nop_();
142 1 SCL = 1;
143 1 _nop_();
144 1 FlagAck = SDA;
145 1 SCL = 0;
146 1 return (FlagAck);
147 1 }
148
149 /*******************************************************************************
150 * 函数名称: void Send8Bit(unsigned char uc8BitSend);
151 * 功能描述: 在I2C总线上发送一个字节
152 * 输入参数: 1个字节的发送数据
153 * 输出参数: 无
154 * 返 回 值: 位变量。
155 * 其他说明:
156 * 修改日期 版 本 号 修 改 人 修改内容
157 *-------------------------------------------------------------------------------
158 *
159 *******************************************************************************/
160 void Send8Bit(unsigned char uc8BitSend)
161 {
162 1 unsigned char idata i;
163 1 for (i = 8; i != 0; i--)
164 1 {
165 2 //SCL = 0;
166 2 uc8BitSend += uc8BitSend;
167 2 SDA = CY;//SDA = uc8BitSend &0x80;
168 2 SCL = 1;
169 2 _nop_();
170 2 SCL = 0;
171 2 }
172 1 }
173
174 /*******************************************************************************
175 * 函数名称: unsigned char Recev8Bit(void);
176 * 功能描述: 接收8位数据
177 * 输入参数: 无
178 * 输出参数: 无
179 * 返 回 值: 接收到的8位数据
C51 COMPILER V8.02 24C04 05/18/2008 16:43:11 PAGE 4
180 * 其他说明:
181 * 修改日期 版 本 号 修 改 人 修改内容
182 *-------------------------------------------------------------------------------
183 *
184 *******************************************************************************/
185 unsigned char Recev8Bit(void)
186 {
187 1 unsigned char idata i;
188 1 unsigned char idata uc8BitRecev = 0;
189 1 for (i = 8; i != 0; i--)
190 1 {
191 2 //SCL = 0;
192 2 //_nop_();
193 2 SCL = 1;
194 2 uc8BitRecev <<= 1;
195 2 uc8BitRecev |=SDA;
196 2 _nop_();
197 2 SCL = 0;
198 2 }
199 1 return uc8BitRecev;
200 1 }
201
202 /********************************************************************************
203 * 函数名称: bit WriteByte(unsigned char ucDataWrite, unsigned char uiAddWrite);
204 * 功能描述: 写一个字节到指定地址
205 * 输入参数: ucDataWrite:要写入的数据, uiAddWrite: 写入地址
206 * 输出参数: 无
207 * 返 回 值: 位变量.写入成功返回0
208 * 其他说明:
209 * 修改日期 版 本 号 修 改 人 修改内容
210 *-------------------------------------------------------------------------------
211 *
212 ********************************************************************************/
213 bit WriteByte(unsigned char ucDataWrite, unsigned int uiAddWrite)
214 {
215 1
216 1 g_ucTimer24C04Ack = WAIT_ACK_TIME;
217 1 g_FlagWaiting24C04Ack = 0;
218 1 do{
219 2 if ((g_FlagWaiting24C04Ack) && (0 == g_ucTimer24C04Ack)) //10ms等待
220 2 {
221 3 I2CStop();
222 3 return ERR_TIME_OV;
223 3 }
224 2 I2CStart();
225 2 //判断地址范围,是否超出24C04范围,要选第一页还是第二页
226 2 if (0 != (uiAddWrite >> 9))
227 2 {
228 3 I2CStop();
229 3 return ERR_ILLEGAL_ADD;
230 3 }
231 2 else if (0 != (uiAddWrite >> 8))
232 2 {
233 3 Send8Bit(ADD_WRITE_24C04 | 0x02);
234 3 }
235 2 else
236 2 {
237 3 Send8Bit(ADD_WRITE_24C04);
238 3 }
239 2 g_FlagWaiting24C04Ack = 1;
240 2 }while (ReadAck()); //判断24C04是否忙
241 1
C51 COMPILER V8.02 24C04 05/18/2008 16:43:11 PAGE 5
242 1 Send8Bit(uiAddWrite);
243 1 ReadAck();
244 1 Send8Bit(ucDataWrite);
245 1 ReadAck();
246 1 I2CStop();
247 1 if (ucDataWrite != ReadByte(uiAddWrite))
248 1 {
249 2 return ERR_WRT_WRONG_RESULT;
250 2 }
251 1 return WR_SUCC_RTN;
252 1 }
253
254 /*******************************************************************************
255 * 函数名称: unsigned char ReadByte(unsigned int uiAddRead);
256 * 功能描述: 读取指定地址的一个字节数据
257 * 输入参数: 要读取的字节地址
258 * 输出参数: 无
259 * 返 回 值: 读出的地址内容
260 * 其他说明:
261 * 修改日期 版 本 号 修 改 人 修改内容
262 *-------------------------------------------------------------------------------
263 *
264 *******************************************************************************/
265 unsigned char ReadByte(unsigned int idata uiAddRead)
266 {
267 1 unsigned char ucDataRead;
268 1 g_ucTimer24C04Ack = WAIT_ACK_TIME;
269 1 g_FlagWaiting24C04Ack = 0;
270 1 do
271 1 {
272 2 I2CStart();
273 2 if (g_FlagWaiting24C04Ack && (0 == g_ucTimer24C04Ack))
274 2 {
275 3 I2CStop();
276 3 return ERR_TIME_OV;
277 3 }
278 2
279 2 //判断地址范围,是否超出24C04范围,要选第一页还是第二页
280 2 if (0 != (uiAddRead >> 9))
281 2 {
282 3 I2CStop();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -