📄 spidrv.lst
字号:
C51 COMPILER V7.50 SPIDRV 09/25/2008 17:18:42 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE SPIDRV
OBJECT MODULE PLACED IN spidrv.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE spidrv.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /****************************************************************************/
2 /* 深圳恒森微电子有限公司 (华邦单片机香港及中国区代理商) */
3 /* 香港恒森科技有限公司 (华邦单片机香港及中国区代理商) */
4 /* 陈文 email:chenwen@hengsen.cn (有 bug 请提交) */
5 /****************************************************************************/
6 /* 文件名: spidrv.c */
7 /* 版本 1.0 */
8 /* 创建日期: 2007-10-29 10:58 */
9 /* 概述: 本文件为 w79e823 读写 SPI flash程序 */
10 /*--------------------------------------------------------------------------*/
11 /* 历史修改记录: */
12 /* 名字 日期 注释 */
13 /* 陈文 2007.10.28 ver 1.0 */
14 /****************************************************************************/
15 #include <w79e825.h>
16 #include <intrins.h>
17 #define uint8 unsigned char
18 #define uint16 unsigned int
19 #define uchar unsigned char
20 #define uint unsigned int
21 #define uint32 unsigned long
22
23 sbit _cs= P1^2;
24 sbit _do= P1^3;
25 sbit _wp= P1^4;
26 //sbit _hold= P1^5;
27 sbit _clk= P1^6;
28 sbit _di= P1^7;
29
30 #define W25P_WriteEnable 0x06
31 #define W25P_WriteDisable 0x04
32 #define W25P_ReadStatusReg 0x05
33 #define W25P_WriteStatusReg 0x01
34 #define W25P_ReadData 0x03
35 #define W25P_FastReadData 0x0B
36 #define W25P_PageProgram 0x02
37 #define W25P_SectorErase 0xD8 // 64KB
38 #define W25P_ChipErase 0xC7
39 #define W25P_PowerDown 0xB9
40 #define W25P_ReleasePowerDown 0xAB
41 #define W25P_DeviceID 0xAB
42 #define W25P_ManufactDeviceID 0x90
43
44 void init_cpu(void);
45 void IO_Send_Byte(uchar out);
46 uchar IO_Get_Byte();
47 void delay(uchar tt);
48 void IO_Wait_Busy();
49 void IO_init();
50 uchar IO_Read_StatusReg();
51 void IO_Write_StatusReg(byte);
52 void IO_Write_Enable();
53 void IO_PowerDown();
54 void IO_ReleasePowerDown();
55 uchar IO_Read_ID1();
C51 COMPILER V7.50 SPIDRV 09/25/2008 17:18:42 PAGE 2
56 uint IO_Read_ID2(uchar ID_Addr);
57 uchar IO_Read_Byte(uint32 Dst_Addr);
58 void IO_Read_nBytes(uint32 Dst_Addr, uchar nBytes_128);
59 uchar IO_FastRead_Byte(uint32 Dst_Addr);
60 void IO_FastRead_nBytes(uint32 Dst_Addr, uchar nBytes_128);
61 void IO_Write_Byte(uint32 Dst_Addr, uchar byte);
62 void IO_Write_nBytes(uint32 Dst_Addr, uchar nBytes_128);
63 void IO_Erase_Chip();
64 void IO_Erase_Sector(uint32 Dst_Addr);
65 void Verify(uchar byte, uchar cor_byte);
66 void IO_Write_Disable();
67 void trace(uchar *str,uchar len);
68 uint IO_Read_ID3();
69 void test_page(uchar addr);
70 void read_page(uchar addr);
71
72 uint8 Rxtemp;
73 bit MYTI;
74 uint8 tx_buff[16];
75 uint8 upper_128[16];
76 bit rx_ok;
77 #define nop() _nop_()
78
79 void delay_nms(uchar i)
80 {
81 1 uchar j;
82 1 i=i*2;
83 1 for(;i>0;i--)
84 1 {
85 2 j = 246;
86 2 while(--j);
87 2 }
88 1 }
89
90 void main(void)
91 {
92 1 uint i;
93 1
94 1 init_cpu();
95 1 IO_init();
96 1 for(;;)
97 1 {
98 2 if(rx_ok == 1)
99 2 {
100 3 rx_ok = 0;
101 3 switch(Rxtemp)
102 3 {
103 4 case 0x01:
104 4 Rxtemp = 0;
105 4 tx_buff[0] = IO_Read_ID1();
106 4 trace(tx_buff,1);
107 4 break;
108 4 case 0x02:
109 4 i = IO_Read_ID2(0x00);
110 4 tx_buff[1] = (uchar)i;
111 4 tx_buff[0] = (uchar)(i>>8);
112 4 trace(tx_buff,2);
113 4
114 4 break;
115 4 case 0x03:
116 4 i = IO_Read_ID3();
117 4 tx_buff[1] = (uchar)i;
C51 COMPILER V7.50 SPIDRV 09/25/2008 17:18:42 PAGE 3
118 4 tx_buff[0] = (uchar)(i>>8);
119 4 trace(tx_buff,3);
120 4 break;
121 4 case 0x04:
122 4 tx_buff[0] = IO_Read_Byte(0x00000000);
123 4 trace(tx_buff,1);
124 4 break;
125 4 case 0x05:
126 4 tx_buff[0] = 0x55;
127 4 IO_Write_Byte(0x00000000,0xa5);
128 4 trace(tx_buff,1);
129 4 break;
130 4 case 0x06:
131 4 tx_buff[0] = IO_Read_StatusReg();
132 4 trace(tx_buff,1);
133 4 break;
134 4 case 0x07:
135 4 IO_Write_Enable();
136 4 break;
137 4 case 0x08:
138 4 upper_128[0]=0x01;upper_128[1]=0x02;upper_128[2]=0x03;upper_128[3]=0x04;
139 4 IO_Write_nBytes(0x00000000,4);
140 4
141 4 break;
142 4 case 0x09:
143 4 IO_Erase_Chip();
144 4 break;
145 4 case 0x0a:
146 4 IO_Erase_Sector(0x000ff000);
147 4 while(1)
148 4 {
149 5 tx_buff[0] = IO_Read_StatusReg();
150 5
151 5 if(tx_buff[0] == 0)
152 5 {
153 6 trace(tx_buff,1);
154 6 break;
155 6 }
156 5
157 5 }
158 4 break;
159 4 case 0x0b:
160 4 test_page(0x00);
161 4 break;
162 4 case 0x0c:
163 4 read_page(0x00);
164 4 break;
165 4 default:
166 4 break;
167 4 }
168 3
169 3 }
170 2
171 2 }
172 1 }
173
174 void init_cpu(void)
175 {
176 1 TMOD = 0x21;
177 1 PCON = PCON | 0x80; //波特率加倍
178 1 //CKCON = 0x10; //定时器1采用4分频
179 1 SCON = 0x50; //异步、10位、波特率可变,无校验位
C51 COMPILER V7.50 SPIDRV 09/25/2008 17:18:42 PAGE 4
180 1 // TH1 = 0xf8; //在15M晶振下,波特率是9600,
181 1 // TL1 = 0xf8;
182 1 TH1 = 0xfd; //在11M晶振下,波特率是9600,
183 1 TL1 = 0xfd;
184 1 TR1 = 1; //T1 timer run
185 1 ES = 1; //uart interrupt enable
186 1 EA = 1; //all interrupt enable
187 1
188 1 }
189
190
191 //串口中断程序
192 void UART_isr(void) interrupt 4
193 {
194 1 if(RI)
195 1 {
196 2 RI = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -