📄 at45db081.lst
字号:
C51 COMPILER V7.06 AT45DB081 07/17/2007 18:22:24 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE AT45DB081
OBJECT MODULE PLACED IN .\output\at45db081.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE at45db081.C BROWSE DEBUG OBJECTEXTEND OBJECT(.\output\at45db081.obj)
stmt level source
1
2 #include <STC89C51RC_RD_PLUS.H>
3 #include <intrins.h>
4 #include <absacc.h>
5
6 #define uint unsigned int
7 #define uchar unsigned char
8 #define ulong unsigned long
9
10
11 #define PAGE_ERASE 0x81
12 #define BLOCK_RERASE 0x50
13 #define STATUS_REGISTER_READ 0xD7
14 #define MAIN_MEMORY_PAGE_READ 0xd2
15 #define MAIN_MEMORY_PAGE_WRITE_THROUGH_BUFFER1 0x82
16
17
18 #define READY 1
19 #define BUSY 0
20
21 sbit SCK = P1^4;
22 sbit SI = P1^5;
23 sbit SO = P1^6;
24 sbit CS = P1^3;
25
26 sbit LED = P1^0;
27 //#define P40 LED
28 /*
29 一片45DB081包括4096页,每页264字节
30 页擦除时间:最多8毫秒
31 页编程时间:最多14毫秒
32 芯片使用spi模式0
33
34 commond:0x84 -->write buffer1
35 commond:0x87 -->write buffer2
36
37 commond:0x82 -->Main Memory Page Program Through Buffer 1
38 commond:0x85 -->Main Memory Page Program Through Buffer 2
39
40 commond:0x81 -->Page Erase
41
42 commond:0xd2 -->Main Memory Page Read
43 commond:0x54 -->Buffer 1 Read
44 commond:0x56 -->Buffer 2 Read
45 */
46
47 /*延时1ms-11.0592MHz
48 void Delay(uint number)
49 {
50 uint j;
51 uint i;
52 for(j=0;j<number;j++)
53 {
54 for(i=0;i<110;i++);
55 }
C51 COMPILER V7.06 AT45DB081 07/17/2007 18:22:24 PAGE 2
56 }*/
57 /*延时1ms-22.1184MHz*/
58 void Delay(uint number)
59 {
60 1 uint j;
61 1 uint i;
62 1 for(j=0;j<number;j++)
63 1 {
64 2 for(i=0;i<220;i++);
65 2 }
66 1 }
67 /*************************************************/
68 /*函数原型:
69 /*输入参数:无
70 /*返回参数:无
71 /*************************************************/
72 void SPI_Init(void)
73 {
74 1 CS = 1;
75 1 SCK = 0;
76 1 SI = 1;
77 1 SO = 1;
78 1 Delay(20);//20ms
79 1 }
80 /*************************************************/
81 /*函数原型:
82 /*输入参数:要发送的命令或数据
83 /*返回参数:无
84 /*************************************************/
85 void SPI_SendByte(uchar SendData)
86 {
87 1 uchar i;
88 1 for(i=0;i<8;i++)
89 1 {
90 2 SI = (bit)(SendData&0x80);
91 2 SendData <<= 1;
92 2 SCK = 1;
93 2 SCK = 0;
94 2 }
95 1 }
96 /*************************************************/
97 /*函数原型:
98 /*输入参数:无
99 /*返回参数:读得的一字节数据
100 /*************************************************/
101 uchar SPI_ReadByte(void)
102 {
103 1 uchar i,RecData = 0;
104 1 for(i=0;i<8;i++)
105 1 {
106 2 SCK = 1;
107 2 RecData <<= 1;
108 2 if(SO)RecData += 1;
109 2 SCK = 0;
110 2 _nop_();
111 2 }
112 1 return (RecData);
113 1 }
114
115
116 //指定页擦除
117 void PageErase(uint Page)
C51 COMPILER V7.06 AT45DB081 07/17/2007 18:22:24 PAGE 3
118 {
119 1 uchar i;
120 1 CS = 0;
121 1 SPI_SendByte(PAGE_ERASE);
122 1 i = Page>>7;
123 1 SPI_SendByte(i);
124 1 i = Page&0xff;
125 1 i = i<<1;
126 1 SPI_SendByte(i);
127 1 i=0;
128 1 SPI_SendByte(i);
129 1 CS = 1;
130 1 Delay(8);
131 1 }
132 //块擦除
133 void BlockErase(uint Block)
134 {
135 1 uchar i;
136 1 CS = 0;
137 1 SPI_SendByte(BLOCK_RERASE);
138 1 i = Block>>4;
139 1 SPI_SendByte(i);
140 1 i = Block & 0x000f;
141 1 i<<=4;
142 1 SPI_SendByte(i);
143 1 i=0;
144 1 SPI_SendByte(i);
145 1 CS = 1;
146 1 Delay(12);
147 1 }
148 //芯片擦除
149 void ChipErase(void)
150 {
151 1 uint i;
152 1 for(i=0;i<512;i++)BlockErase(i);
153 1 }
154 //读芯片状态寄存器
155 bit ReadStatus(void)//status register read
156 {
157 1 uchar i;
158 1 CS = 0;
159 1 SPI_SendByte(STATUS_REGISTER_READ);
160 1 i = SPI_ReadByte();
161 1 CS = 1;
162 1 return((bit)(i&0x80));
163 1 }
164 //直接从存储空间读到缓冲区
165 void MainMemPageRead(uint Page,uint InPageAdd,uchar *Buffer,uint Num)
166 {
167 1 uchar i = 0;
168 1 CS = 0;
169 1 SPI_SendByte(MAIN_MEMORY_PAGE_READ);
170 1 i = Page>>7;
171 1 SPI_SendByte(i);
172 1 i = Page&0xff;
173 1 i = i<<1;
174 1 Page = InPageAdd>>8;
175 1 Page += i;
176 1 SPI_SendByte(i);
177 1 SPI_SendByte(InPageAdd&0xff);
178 1 for(i=0;i<32;i++){SCK = 1;SCK = 0;}//dummy
179 1 for(i=0;i<Num;i++)Buffer[i] = SPI_ReadByte();
C51 COMPILER V7.06 AT45DB081 07/17/2007 18:22:24 PAGE 4
180 1 CS = 1;
181 1 }
182 //通过buffer1编程flash
183 void MainMemoryPageProgramThroughBuffer(uint Page,uint InPageAdd,uchar *Buffer,uint Num)
184 {
185 1 uchar i = 0;
186 1 CS = 0;
187 1 SPI_SendByte(MAIN_MEMORY_PAGE_WRITE_THROUGH_BUFFER1);
188 1 i = Page>>7;
189 1 SPI_SendByte(i);
190 1 i = Page&0xff;
191 1 i = i<<1;
192 1 Page = InPageAdd>>8;
193 1 Page += i;
194 1 SPI_SendByte(i);
195 1 SPI_SendByte(InPageAdd&0xff);
196 1 for(i=0;i<Num;i++) SPI_SendByte(Buffer[i]);
197 1 CS = 1;
198 1 }
199
200 #define XIO XBYTE[0x8000]
201
202 void main(void)
203 {
204 1 bit flag=0;
205 1 uchar i ;
206 1 uchar code buffer[30]="012345678901234567890123456789";
207 1 uchar buf[30];
208 1 SPI_Init();
209 1 /*
210 1 uint i;
211 1 uchar c,a;
212 1
213 1 while(1)
214 1 {
215 1 for(i=0;i<32768;i++)
216 1 {
217 1 c=i%256;
218 1 XBYTE[i]=c;
219 1 a = XBYTE[i];
220 1 if(a!=c){flag = 1;break;}
221 1 }
222 1 if(flag)LED = 0;
223 1 else
224 1 {
225 1 for(i=0;i<5;i++)
226 1 {
227 1 LED = 0;
228 1 Delay(10);
229 1 LED = 1;
230 1 Delay(10);
231 1 }
232 1 }
233 1 while(1);
234 1 }*/
235 1 /*LED = ReadStatus();
236 1 while(1);
237 1 */
238 1
239 1 ChipErase();
240 1
241 1 LED = 0;
C51 COMPILER V7.06 AT45DB081 07/17/2007 18:22:24 PAGE 5
242 1 MainMemoryPageProgramThroughBuffer(110,0,buffer,255);//需要45ms@11.0592 20ms@22.1184
243 1 LED = 1;
244 1 Delay(15);
245 1 LED = 0;
246 1 MainMemPageRead(110,0,buf,255);//需要37ms@11.0592 18ms@22.1184
247 1 LED = 1;
248 1
249 1
250 1 for(i=0;i<30;i++)
251 1 {
252 2 SPI_SendByte(buf[i]);
253 2 Delay(1000);
254 2 }
255 1
256 1 for(i=0;i<30;i++)
257 1 {
258 2 if(buf[i]!=buffer[i])flag=1;
259 2 }
260 1 if(flag==0)
261 1 {
262 2 for(i=0;i<5;i++)
263 2 {
264 3 LED = 0;
265 3 Delay(300);
266 3 LED = 1;
267 3 Delay(300);
268 3 }
269 2 }
270 1 else LED = 0;
271 1
272 1 while(1);
273 1 }
274
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 578 ----
CONSTANT SIZE = 30 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 48
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 + -