📄 at45main.lst
字号:
C51 COMPILER V8.02 AT45MAIN 08/18/2007 20:06:55 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE AT45MAIN
OBJECT MODULE PLACED IN AT45main.OBJ
COMPILER INVOKED BY: C:\Keil\UV3\C51\BIN\c51.exe AT45main.c DB OE
line level source
1
2 //----------------------------------------------------------------
3 // C8051F020实验核心模块测试程序
4 // SPI总线和AT45DBXX实验
5 //
6 // 实现功能:通过交叉开关,将SPI配置到P02,P03,P04引脚上,实现通过SPI总线访问AT45DB041B/081B/161D:
7 // 1.通过计算机向模块发送命令对FLASH进行操作
8 //
9 // 实验条件:
10 // 1.底板上拨码开关JP1的1,2,4,6设置为ON状态
11 // //
12 // 注意:本例程中包括了两个c文件,如果用户使用silab的集成开发环境,
13 // 如果自己建立新的工程,一定注意要将两个C文件都加入到编译列表中
14 //
15 // 说明:
16 // 本模块中配套的测试程序都是以消息驱动的.
17 //
18 // 实验程序中的命令都可以使用windows系统中自带的超级终端进行调试
19 //
20 //---------------------------------------------------------------
21 // 修改记录
22 // 版本 时间 人员 内容
23 // 1.0 2007/5/3 scj 建立文件,实现基本功能
24 // 1.1 07/05/04 scj 增加了Flash操作命令
25 // 1.2 07/06/04 scj 根据V122底板调整了具体的实验
26 //----------------------------------------------------------------------------------------------------
27 // 命令说明:
28 // 字符通信协议,所有的命令以回车符结束
29 // 命令字符不区分大小写
30 // 键盘控制字符支持Backspace,其它控制键不支持
31 //
32 // 应答:命令操作成功,最后都将返回\r\nOK\r\n
33 // 命令错误,返回\r\nError\r\n
34 // 具体命令:
35 // 1.控制LED
36 // 命令格式:setled=灯序号,开关状态 \r
37 // 参数: 灯序号: 2,LED2
38 // 开关状态:ON,打开灯;OFF,关闭灯
39 // 应答: \r\nOK\r\n
40 // 2.擦除指定页面
41 // 命令格式:erasepage=页面序号\r
42 // 参数: 页面序号,要擦除的页面的序号,从0到器件的页面最大编号,由使用的器件决定
43 // 应答: \r\nOK\r\n
44 // 3.擦除指定的块
45 // 命令格式:eraseblock=块序号\r
46 // 参数: 块序号,要擦除的块的序号,每个块包含8个PAGE
47 // 应答: \r\nOK\r\n;\r\nError\r\n
48 // 4.向指定的页面写入字符串,该页面原有内容均被删除掉
49 // 命令格式:writepage=页面序号,要写入的字符串
50 // 参数: 页面序号:欲写入的页面;
51 // 要写入的字符串:命令总长度不能超过RECVBUF_LEN;字符长度不超过页面大小
52 // 应答: \r\nOK\r\n
53 // 5.读指定页面
54 // 命令格式:readpage=页面序号
55 // 参数: 页面序号:要读取的页面的序号
C51 COMPILER V8.02 AT45MAIN 08/18/2007 20:06:55 PAGE 2
56 // 应答: 16进制的方式显示264个字节的内容;同时每个16字节后的括号内显示该字符;字节间用空格隔开
57 //
58 //---------------------------------------------------------------------------------------------------
59
60 #include <string.h>
61 #include <ctype.h>
62 #include <stdlib.h>
63
64 #include "F020.h"
65 #include "datatype.h"
66 #include "at45.h"
67
68
69 //--------------------------------------------
70 // 数据类型定义
71 //--------------------------------------------
72
73 // 结构体
74 typedef struct
75 {
76 BYTE base; // DIDA次数
77 BYTE second; // 秒
78 BYTE minute; // 分
79
80 }S_TIME;
81
82
83 //--------------------------------------------
84 // 引脚定义
85 //--------------------------------------------
86 #define P_LED2 P31
87
88
89 //--------------------------------------------
90 // 宏定义
91 //--------------------------------------------
92
93 // 系统消息定义
94 #define SECD_SIGNAL 0x01
95 #define MINU_SIGNAL 0x02
96 #define UART0RECV_SIGNAL 0x04
97
98
99 // 常量定义
100 code BYTE ASCII_CODE[]={"0123456789ABCDEF"};
101
102
103 //--------------------------------------------
104 //定时器0定时,使用SYSCLK/12作为时钟源
105 //定时计算方法,TH0:TL0= 65536-t*SYSCLK/12
106 //定时25ms,TH0:TL0=0x4C 00
107 //--------------------------------------------
108 #define TMR0H 0x4C
109 #define TMR0L 0x00
110
111 #define TICKS_PER_SEC 40
112
113 #define RECVBUF_LEN 300
114
115 //--------------------------------------------
116 // 函数声明
117 //--------------------------------------------
C51 COMPILER V8.02 AT45MAIN 08/18/2007 20:06:55 PAGE 3
118 void CommandProc(char *pRecvString);
119 void SendString(char *pSendString);
120 void SendHex(BYTE buf);
121 void SendBuffer(BYTE *pSend,WORD len);
122
123 char strncmps(char *pString1,char *pString2,int iLen);
124 void Dlyms(WORD ms);
125
126 //--------------------------------------------
127 // 全局变量定义
128 // 全局变量以g_开头
129 // 位变量: g_b
130 // 无符号字节变量: g_c
131 // 无符号双字节变量: g_w
132 // 无符号4字节变量: g_dw
133 // 有符号数在类型前加s,比如char型位g_sc
134 // 结构体为g_s后为大写
135 //--------------------------------------------
136 data BYTE g_cMainSignal; // 主消息变量
137
138 data S_TIME g_sTime; // 主时钟
139
140 data BYTE g_cRecvPointer; // 接收指针
141 data BYTE g_cRecvLength; // 接收数据长度
142 xdata BYTE g_cRecvBuffer[RECVBUF_LEN]; // 接收缓冲区,字符均被转换为小写
143
144 xdata BYTE g_cFlashReadBuffer[520]; // 读取Flash缓冲区
145
146 //-----------------------------------------------
147 // 初始化函数
148 //
149 //-----------------------------------------------
150 void Timer_Init()
151 {
152 1
153 1 PCON = 0;
154 1 //.......................................
155 1 // 设置定时器的时钟信号
156 1 // - T4M T2M T1M T0M - - -
157 1 // 0 1 0 1 0 0 0 0
158 1 // 1:使用SYSCLK;0:使用SYSCLK/12
159 1 // 定时器0,1,2,4均使用SYSCLK
160 1 //.......................................
161 1 CKCON = 0x70;
162 1
163 1
164 1 //......................................
165 1 // 定时0工作在16位定时器模式
166 1 // 定时器1工作在8位重载模式
167 1 //......................................
168 1
169 1 TMOD = 0x21;
170 1
171 1 //....................................
172 1 // T0作为系统节拍时钟
173 1 // 定时计算方法= 65536-t*SYSCLK
174 1 //.....................................
175 1 TH0 = TMR0H;
176 1 TL0 = TMR0L;
177 1
178 1 //.......................................
179 1 // T1作为串口0时钟
C51 COMPILER V8.02 AT45MAIN 08/18/2007 20:06:55 PAGE 4
180 1 // 串口0波特率=SYSCLK/16*(256-TMR1LOAD)
181 1 // T1波特率=9600
182 1 //.......................................
183 1
184 1 TH1 = 0xB8;
185 1 TL1 = 0xB8;
186 1
187 1 TCON = 0x00;
188 1
189 1
190 1 //..................................................
191 1 // T2 and T3 not used
192 1 //..................................................
193 1 RCAP2H = 0x00; // Timer 2 Capture Register High Byte
194 1 RCAP2L = 0x00; // Timer 2 Capture Register Low Byte
195 1 TH2 = 0x00; // Timer 2 High Byte
196 1 TL2 = 0x00; // Timer 2 Low Byte
197 1 T2CON = 0x00; // Timer 2 Control Register
198 1
199 1 TMR3RLL = 0x00; // Timer 3 Reload Register Low Byte
200 1 TMR3RLH = 0x00; // Timer 3 Reload Register High Byte
201 1 TMR3H = 0x00; // Timer 3 High Byte
202 1 TMR3L = 0x00; // Timer 3 Low Byte
203 1 TMR3CN = 0x00; // Timer 3 Control Register
204 1
205 1 //.....................................................
206 1 // T4 作为串口1波特率发生器
207 1 // T4波特率=SYSCLK/32*(65536-RCAP4H:RCAP4L)
208 1 // T4波特率=19200
209 1 //.....................................................
210 1 RCAP4H = 0xFF; // Timer 4 Capture Register High Byte
211 1 RCAP4L = 0xDC; // Timer 4 Capture Register Low Byte
212 1 TH4 = 0xFF; // Timer 4 High Byte
213 1 TL4 = 0xDC; // Timer 4 Low Byte
214 1 T4CON = 0x30; // Timer 4 Control Register
215 1
216 1
217 1 }
218
219 //...........................................................
220 // 功能:UART0初始化
221 // 输入参数:无
222 // 输出参数:无
223 // 注意:1.应该首先使用交叉开关为UART0分配相应的引脚
224 // 2.初始化定时器1作为波特率发生器
225 //..........................................................
226 void UART0_Init()
227 {
228 1
229 1 SCON0 = 0x50; // 8位波特率异步通信模式
230 1
231 1 REN0 = 1; // 使能UART0接收
232 1 TR1 = 1; // 启动定时器1
233 1 }
234
235 //---------------------------------------------------------------------
236 // 功能:初始化SMBUS
237 // 说明:1.必须在Port_I0_Init中设置交叉开关,并将SMBUS分配到P06,P07引脚上
238 // 2.SMBUS的位速率必须小于400K(这是由PCF8563决定的)
239 //---------------------------------------------------------------------
240 void InitSMBus()
241 {
C51 COMPILER V8.02 AT45MAIN 08/18/2007 20:06:55 PAGE 5
242 1 SMB0CR=0xE4; // SMBUS速率:307K<400K
243 1 SMB0CN=0x40; // 使能SMBUS
244 1 }
245 //.....................................................
246 // 功能:配置XRAM的扩展方式
247 // 输入参数:无
248 // 输出参数:无
249 // 说明:仅仅使用内部XRAM
250 // 由于本实验中使用的RAM较少,所以只使用C8051F020的内部RAM
251 //.....................................................
252 void EMI_Init()
253 {
254 1 EMI0CF = 0x23;
255 1 }
256
257 // Peripheral specific initialization functions,
258 // Called from the Init_Device() function
259 void SPI_Init()
260 {
261 1 SPI0CFG = 0xC7; // SCK空闲为高电平,第二个边沿开始采样,8位数据
262 1 SPI0CN = 0x03; // SPI0操作在MASTER模式
263 1 SPI0CKR = 0x01; // SPI波特率应小于8MHZ,fclk=SYSCLK/2*(SPI0CKR+1)
264 1 }
265
266 void Port_IO_Init()
267 {
268 1 // P0.0 - TX0 (UART0), Open-Drain, Digital
269 1 // P0.1 - RX0 (UART0), Open-Drain, Digital
270 1 // P0.2 - SCK (SPI0), Open-Drain, Digital
271 1 // P0.3 - MISO (SPI0), Open-Drain, Digital
272 1 // P0.4 - MOSI (SPI0), Open-Drain, Digital
273 1 // P0.5 - NSS (SPI0), Open-Drain, Digital
274 1 // P0.6 - SDA (SMBus), Open-Drain, Digital
275 1 // P0.7 - SCL (SMBus), Open-Drain, Digital
276 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -