📄 at45.lst
字号:
C51 COMPILER V8.02 AT45 08/18/2007 20:06:55 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE AT45
OBJECT MODULE PLACED IN at45.OBJ
COMPILER INVOKED BY: C:\Keil\UV3\C51\BIN\c51.exe at45.c DB OE
line level source
1 //--------------------------------------------
2 // 文件名:AT45DB.C
3 // 操作:基于SPI硬件总线的AT45DB操作文件
4 // 注意:本文件中定义的操作是针对161D处于DataFlash格式的操作,即每个PAGE的页面大小为528B
5 // 如果用户使用的PAGE为512B,则要进行相应的修改
6 // scj
7 // 07/05/04
8 //-----------------------------------------------------------------------
9 // 修改记录
10 // 版本 时间 人员 内容
11 // 1.0 07/05/03 scj 041B操作基本函数
12 // 1.1 07/05/05 scj 增加了041B,081B,161B函数操作
13 // 根据g_cFlashType来标识Flash类型
14 //----------------------------------------------------------------------
15 #include "f020.h"
16 #include "datatype.h"
17 #include "at45.h"
18 #include <intrins.h>
19
20 //--------------------------------------------
21 // 宏定义
22 //--------------------------------------------
23
24 #define DF_RESET {P5 &=~(0x1);_nop_();P5 |= 0x1;_nop_();} // P50,AT45DB复位控制引脚
25 #define DF_PROTECT {P5 &=~(0x02);_nop_();} // P51,AT45DB保护控制
26 #define DF_NONPROTECT {P5 |=0x02;_nop_();} // P51,取消AT45DB保护
27 #define DF_CHIP_SELECT {P5 &= ~(0x04);_nop_();} // P52,AT45DB片选信号
28 #define DF_CHIP_NOSELECT {P5 |= 0x04;_nop_();} // P52,取消AT45DB片选信号
29
30
31
32 // 器件类型
33 code char FLASH_STRING[][20]={"Unknown","AT45DB041","AT45DB081","AT45DB161"};
34 // 器件页面个数
35 code WORD FLASH_PAGE[]={0,2048,4096,4096};
36 // 器件页面字节数
37 code WORD FLASH_PAGE_BYTE[]={0,264,264,528};
38 // 器件BLOCK数
39 code WORD FLASH_BLOCK[]={0,256,512,512};
40 // 页面地址
41 code BYTE PAGE_SHIFT[]={0,1,1,2};
42 // 字节地址
43 code BYTE BYTE_SHIFT[]={0,8,8,8};
44 // 块移位地址
45 code BYTE BLOCK_SHIFT[]={0,4,4,5};
46 //---------------------------------------------
47 // 变量定义
48 //---------------------------------------------
49 char g_cFlashType=0; // Flash类型,目前支持AT45DB041,AT45DB081,AT45DB161
50
51 //---------------------------------------------
52 // 函数声明
53 //---------------------------------------------
54
55 //---------------------------------------------
C51 COMPILER V8.02 AT45 08/18/2007 20:06:55 PAGE 2
56 // 函数实现
57 //---------------------------------------------
58
59 //---------------------------------------------
60 // SPI操作函数
61 //---------------------------------------------
62 void SendSPIByte(BYTE ch)
63 {
64 1 SPIF = 0;
65 1 SPI0DAT = ch;
66 1 while (SPIF == 0); // wait for data transfer to be completed
67 1 }
68
69 BYTE GetSPIByte(void)
70 {
71 1 SPIF = 0;
72 1 SPI0DAT = 0;
73 1 while (SPIF == 0);
74 1 return SPI0DAT; // read data from SPI
75 1 }
76
77 //-----------------------------------------------------------------
78 // Flash操作
79 //-----------------------------------------------------------------
80
81 //-----------------------------------------------------------------
82 // 功能:获取Flash类型,注意,在使用本文件中定义的函数时必须首先调用该函数
83 // 否则,其它函数无法正确判断Flash类型可能导致操作错误
84 // 参数:无
85 // 返回值:Flash类型的描述字符串,该缓冲区是只读的,内容不允许修改
86 //------------------------------------------------------------------
87 const char *GetFlashType()
88 {
89 1 BYTE nDeviceID;
90 1
91 1 nDeviceID =GetFlashInfo();
92 1
93 1 if((nDeviceID&0x20)==0x20)
94 1 {
95 2 nDeviceID&=0x1F;
96 2
97 2 if((nDeviceID>=4)&&(nDeviceID<=6))
98 2 {
99 3 g_cFlashType = nDeviceID-3;
100 3
101 3 }
102 2 else
103 2 {
104 3 g_cFlashType = 0;
105 3 }
106 2 }
107 1 else
108 1 {
109 2 g_cFlashType = 0;
110 2 }
111 1
112 1
113 1 return FLASH_STRING[g_cFlashType];
114 1 }
115
116 //--------------------------------------------------------------------------------
117 // 功能: 读Flash当前状态
C51 COMPILER V8.02 AT45 08/18/2007 20:06:55 PAGE 3
118 // 参数: 无
119 // 返回值:BYTE,Flash当前状态
120 // Bit7=1:空闲 0:忙
121 // Bit6=1:比较结果不匹配 0:匹配
122 // Bit5Bit4Bit3:芯片标志(101:AT45DB161D;100:AT45DB081;011:AT45DB041B)
123 // Bit2=1
124 // Bit1: 扇区保护位,1:保护;0:未保护
125 // Bit0: page大小,1:2^n;0:2^n+8/16 B
126 //--------------------------------------------------------------------------------
127 BYTE GetFlashStatus()
128 {
129 1 BYTE ret;
130 1
131 1 DF_CHIP_SELECT;
132 1
133 1 SendSPIByte(STATUS_REGISTER);
134 1 ret=GetSPIByte();
135 1
136 1 DF_CHIP_NOSELECT;
137 1
138 1 return ret;
139 1 }
140
141 //-------------------------------------------------------------------------------
142 // 功能:读取FLASH芯片的生产设备信息
143 // 参数:无
144 // 返回值:器件容量,高三位为器件系列;后5位为器件容量
145 // 001 00100 ;AT45DB041
146 // 001 00101 ;AT45DB081
147 // 001 00110 ;AT45DB161
148 //-------------------------------------------------------------------------------
149 BYTE GetFlashInfo()
150 {
151 1 BYTE manufacturers; // 生产商
152 1 BYTE density; // 器件容量
153 1 BYTE ret;
154 1
155 1 DF_CHIP_SELECT;
156 1
157 1 SendSPIByte(FLASH_DEVICEID); // 读取设备信息
158 1
159 1 manufacturers=GetSPIByte(); // 生产商
160 1 density=GetSPIByte(); // 器件容量
161 1 ret=GetSPIByte(); // Device Version
162 1 ret=GetSPIByte();
163 1
164 1 DF_CHIP_NOSELECT;
165 1
166 1 return density; // 返回器件容量
167 1 }
168
169
170 //---------------------------------------------------------------------------
171 // 功能:从缓冲区1的指定位置star_addr中读入len长度的数据到pBuffer
172 // 参数:
173 // str_addr,WORD:缓冲区起始位置
174 // len: WORD:数据长度
175 // pBuffer, BYTE *:数据缓存指针
176 // 返回值:BYTE,1:读取成功;0:读取失败
177 //---------------------------------------------------------------------------
178 BYTE FlashBuffer1Read(WORD start_addr,WORD len, BYTE *pBuffer)
179 {
C51 COMPILER V8.02 AT45 08/18/2007 20:06:55 PAGE 4
180 1 WORD i;
181 1
182 1 if((start_addr+len)>FLASH_PAGE_BYTE[g_cFlashType])
183 1 {// 地址长度错误
184 2 return 0;
185 2 }
186 1
187 1 while((GetFlashStatus()&0x80)==0); // 检查器件是否准备就绪
188 1
189 1 DF_CHIP_SELECT; // enable DataFlash
190 1
191 1 SendSPIByte(BUFFER_1_READ);
192 1 SendSPIByte(0);
193 1 SendSPIByte((BYTE)(start_addr>8));
194 1 SendSPIByte((BYTE)start_addr);
195 1 SendSPIByte(0);
196 1 for (i=0;i<len;i++)
197 1 {
198 2 *pBuffer++ = GetSPIByte(); // read data from SPI
199 2 }
200 1
201 1 DF_CHIP_NOSELECT;
202 1
203 1 return 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -