📄 cat24wc64p.lst
字号:
24
25
26 #define CAT24WC64P_ADDRESS 0xA0 // I2C write address of CAT24WC64P
27
28
29 /*******************************************************************
30 检查CAT24WC64P忙
31 函数原型: bit CAT24WC64P_ready();
32 功能: 检查CAT24WC64P
33 返回0--CAT24WC64P忙
34 返回1--CAT24WC64P准备
35 *******************************************************************/
36
37 bit CAT24WC64P_ready()
38 {
39 1 I2C_GetBus(); /*启动总线*/
40 1
41 1 I2C_Send(CAT24WC64P_ADDRESS); /*发送器件地址,若无应答则返回0*/
42 1 if(S1STA!=0X18)
43 1 {
44 2 S1CON=0XD5;
45 2 return(0);
46 2 }
47 1
48 1 return(1); /*发送器件地址,应答则返回1*/
49 1 }
50
51
52 /*******************************************************************
53 从CAT24WC64P器件随机地址读入N字节数据函数(N<=8192)(地址:0-8191)
54 函数原型: bit fnRead_Eeprom(uint uiAddress,uchar ucSize, uchar *uc_Data);
55 功能: 从启动总线到发送地址、子地址、读数据、结束总线的全过程,器件
56 数据地址(0-1FFF),读入的内容在指向的存储区N个字节。
57 如果返回1,表示操作成功,否则操作有误。
58 ********************************************************************/
59 bit fnRead_Eeprom(uint uiAddress,uchar ucSize, uchar *uc_Data)
60 {
61 1 uchar i;
62 1 uchar suba_high,suba_low;
63 1
64 1 suba_high = uiAddress/256;
65 1 suba_low = uiAddress%256;
66 1
67 1 while(!CAT24WC64P_ready()); //等待CAT24WC64P的准备就绪
68 1
69 1
70 1 I2C_GetBus(); //启动总线
71 1
72 1 I2C_Send(CAT24WC64P_ADDRESS); //发送器件地址,若无应答则返回
73 1 if(S1STA!=0X18)
74 1 {
75 2 S1CON=0XD5;
76 2 return(0);
77 2 }
78 1
79 1 I2C_Send(suba_high); //发送器件子地址高字节,若无应答则返回
80 1 if(S1STA!=0X28)
81 1 {
82 2 S1CON=0XD5;
83 2 return(0);
84 2 }
85 1
C51 COMPILER V7.06 CAT24WC64P 09/08/2003 11:40:01 PAGE 7
86 1 I2C_Send(suba_low); //发送器件子地址低字节,若无应答则返回
87 1 if(S1STA!=0X28)
88 1 {
89 2 S1CON=0XD5;
90 2 return(0);
91 2 }
92 1
93 1
94 1 S1CON=0XE5; //重新启动总线
95 1 while(SI==0);
96 1
97 1 I2C_Send(CAT24WC64P_ADDRESS+1); //发送器件地址,若无应答则返回
98 1 if(S1STA!=0X40)
99 1 {
100 2 S1CON=0XD5;
101 2 return(0);
102 2 }
103 1
104 1 for(i=0;i<ucSize-1;i++)
105 1 {
106 2 S1CON=0XC5; //接收一字节数据并发送应答位
107 2 while(SI==0); //等待接收数据
108 2 if(S1STA!=0X50)
109 2 {
110 3 S1CON=0XD5;
111 3 return(0);
112 3 }
113 2
114 2 *uc_Data = S1DAT; //读取数据
115 2 uc_Data++;
116 2 }
117 1
118 1 S1CON=0XC1; //接收最后一字节数据并发送非应答位
119 1 while(SI==0);
120 1 *uc_Data=S1DAT;
121 1
122 1 S1CON=0XD5; //结束总线
123 1
124 1 return(1);
125 1 }
126
127
128 /*******************************************************************
129 向CAT24WC64P器件页写入N字节数据函数
130 函数原型: bit CAT24WC64P_PageW(uint suba,uchar suba_size,uchar *s)
131 功能: 从启动总线到发送地址、子地址、读数据、结束总线的全过程,器件
132 数据页地址suba(0-FF),写入的内容在s指向的存储区读N个字节。
133 如果返回1,表示操作成功,否则操作有误。
134 ********************************************************************/
135 bit CAT24WC64P_PageW(uint suba,uchar suba_size,uchar *s)
136 {
137 1 uchar i;
138 1 uchar suba_high,suba_low;
139 1
140 1 suba_high = suba/256;
141 1 suba_low = suba%256;
142 1
143 1 while(!CAT24WC64P_ready()); //等待CAT24WC64P的准备就绪
144 1
145 1
146 1 I2C_GetBus(); //启动总线
147 1
C51 COMPILER V7.06 CAT24WC64P 09/08/2003 11:40:01 PAGE 8
148 1 I2C_Send(CAT24WC64P_ADDRESS); //发送器件地址,若无应答则返回
149 1 if(S1STA!=0X18)
150 1 {
151 2 S1CON=0XD5;
152 2 return(0);
153 2 }
154 1
155 1 I2C_Send(suba_high); //发送器件子地址高字节,若无应答则返回
156 1 if(S1STA!=0X28)
157 1 {
158 2 S1CON=0XD5;
159 2 return(0);
160 2 }
161 1
162 1 I2C_Send(suba_low); //发送器件子地址低字节,若无应答则返回
163 1 if(S1STA!=0X28)
164 1 {
165 2 S1CON=0XD5;
166 2 return(0);
167 2 }
168 1
169 1 for(i=0;i<suba_size;i++)
170 1 {
171 2 I2C_Send(*s); //发送数据,若无应答则返回
172 2 if(S1STA!=0X28)
173 2 {
174 3 S1CON=0XD5;
175 3 return(0);
176 3 }
177 2 s++;
178 2 }
179 1
180 1 S1CON=0XD5; //结束总线
181 1
182 1 return(1);
183 1
184 1
185 1
186 1 }
187
188 /*******************************************************************
189 从CAT24WC64P器件随机地址写入N字节数据函数(N<=32)(地址:0-8191)
190 函数原型: bit fnWrite_Eeprom(uint uiAddress,uchar ucSize, uchar *uc_Data);
191 功能: 从启动总线到发送地址、子地址、读数据、结束总线的全过程,器件
192 数据地址(0-1FFF),写入的内容在指向的存储区N个字节。
193 如果返回1,表示操作成功,否则操作有误。
194 ********************************************************************/
195 bit fnWrite_Eeprom(uint uiAddress,uchar ucSize, uchar *uc_Data)
196 {
197 1 char i;
198 1
199 1 i = (uiAddress%32) + ucSize - 32;
200 1
201 1 if( i > 0 )
202 1 {
203 2 CAT24WC64P_PageW(uiAddress,ucSize - i,uc_Data);
204 2 CAT24WC64P_PageW(uiAddress + ucSize - i,i,uc_Data);
205 2 return(1);
206 2 }
207 1 else
208 1 {
209 2 CAT24WC64P_PageW(uiAddress,ucSize,uc_Data);
C51 COMPILER V7.06 CAT24WC64P 09/08/2003 11:40:01 PAGE 9
210 2 return(1);
211 2 }
212 1
213 1 }
214
215
C51 COMPILER V7.06 CAT24WC64P 09/08/2003 11:40:01 PAGE 10
ASSEMBLY LISTING OF GENERATED OBJECT CODE
; FUNCTION CAT24WC64P_ready (BEGIN)
; SOURCE LINE # 37
; SOURCE LINE # 38
; SOURCE LINE # 39
0000 120000 E LCALL I2C_GetBus
; SOURCE LINE # 41
0003 7FA0 MOV R7,#0A0H
0005 120000 E LCALL _I2C_Send
; SOURCE LINE # 42
0008 E5D9 MOV A,S1STA
000A 6418 XRL A,#018H
000C 6005 JZ ?C0001
; SOURCE LINE # 43
; SOURCE LINE # 44
000E 75D8D5 MOV S1CON,#0D5H
; SOURCE LINE # 45
0011 C3 CLR C
0012 22 RET
; SOURCE LINE # 46
0013 ?C0001:
; SOURCE LINE # 48
0013 D3 SETB C
; SOURCE LINE # 49
0014 ?C0002:
0014 22 RET
; FUNCTION CAT24WC64P_ready (END)
; FUNCTION _fnRead_Eeprom (BEGIN)
; SOURCE LINE # 59
0000 8E00 R MOV uiAddress,R6
0002 8F00 R MOV uiAddress+01H,R7
0004 8D00 R MOV ucSize,R5
0006 8B00 R MOV uc_Data,R3
0008 8A00 R MOV uc_Data+01H,R2
000A 8900 R MOV uc_Data+02H,R1
; SOURCE LINE # 60
; SOURCE LINE # 64
000C E500 R MOV A,uiAddress
000E F500 R MOV suba_high,A
; SOURCE LINE # 65
0010 8F00 R MOV suba_low,R7
0012 ?C0003:
; SOURCE LINE # 67
0012 120000 R LCALL CAT24WC64P_ready
0015 50FB JNC ?C0003
0017 ?C0004:
; SOURCE LINE # 70
0017 120000 E LCALL I2C_GetBus
; SOURCE LINE # 72
001A 7FA0 MOV R7,#0A0H
001C 120000 E LCALL _I2C_Send
; SOURCE LINE # 73
001F E5D9 MOV A,S1STA
0021 6418 XRL A,#018H
0023 6002 JZ ?C0005
; SOURCE LINE # 74
; SOURCE LINE # 75
; SOURCE LINE # 76
0025 8044 SJMP ?C0036
C51 COMPILER V7.06 CAT24WC64P 09/08/2003 11:40:01 PAGE 11
; SOURCE LINE # 77
0027 ?C0005:
; SOURCE LINE # 79
0027 AF00 R MOV R7,suba_high
0029 120000 E LCALL _I2C_Send
; SOURCE LINE # 80
002C E5D9 MOV A,S1STA
002E 6428 XRL A,#028H
0030 6002 JZ ?C0007
; SOURCE LINE # 81
; SOURCE LINE # 82
0032 ?C0033:
; SOURCE LINE # 83
0032 8037 SJMP ?C0036
; SOURCE LINE # 84
0034 ?C0007:
; SOURCE LINE # 86
0034 AF00 R MOV R7,suba_low
0036 120000 E LCALL _I2C_Send
; SOURCE LINE # 87
0039 E5D9 MOV A,S1STA
003B 6428 XRL A,#028H
003D 6002 JZ ?C0008
; SOURCE LINE # 88
; SOURCE LINE # 89
003F ?C0034:
; SOURCE LINE # 90
003F 802A SJMP ?C0036
; SOURCE LINE # 91
0041 ?C0008:
; SOURCE LINE # 94
0041 75D8E5 MOV S1CON,#0E5H
0044 ?C0009:
; SOURCE LINE # 95
0044 30DBFD JNB SI,?C0009
0047 ?C0010:
; SOURCE LINE # 97
0047 7FA1 MOV R7,#0A1H
0049 120000 E LCALL _I2C_Send
; SOURCE LINE # 98
004C E5D9 MOV A,S1STA
004E 6440 XRL A,#040H
0050 6002 JZ ?C0011
; SOURCE LINE # 99
; SOURCE LINE # 100
0052 ?C0035:
; SOURCE LINE # 101
0052 8017 SJMP ?C0036
; SOURCE LINE # 102
0054 ?C0011:
; SOURCE LINE # 104
;---- Variable 'i' assigned to Register 'R7' ----
0054 E4 CLR A
0055 FF MOV R7,A
0056 ?C0012:
0056 E500 R MOV A,ucSize
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -