📄 spidrv.lst
字号:
C51 COMPILER V7.50 SPIDRV 01/11/2009 22:30:34 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE SPIDRV
OBJECT MODULE PLACED IN spidrv.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil750\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 <SST89x5xxRD2.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 W25X_WP = P1^3;
24 sbit W25X_CS = P1^4;
25 sbit W25X_DO = P1^5;
26 sbit W25X_DI = P1^6;
27 sbit W25X_CLK= P1^7;
28
29
30 #define W25X_WriteEnable 0x06
31 #define W25X_WriteDisable 0x04
32 #define W25X_ReadStatusReg 0x05
33 #define W25X_WriteStatusReg 0x01
34 #define W25X_ReadData 0x03
35 #define W25X_FastReadData 0x0B
36 #define W25X_FastReadDual 0x3B
37 #define W25X_PageProgram 0x02
38 #define W25X_BlockErase 0xD8
39 #define W25X_SectorErase 0x20
40 #define W25X_ChipErase 0xC7
41 #define W25X_PowerDown 0xB9
42 #define W25X_ReleasePowerDown 0xAB
43 #define W25X_DeviceID 0xAB
44 #define W25X_ManufactDeviceID 0x90
45 #define W25X_JedecDeviceID 0x9F
46
47
48 void init_cpu(void);
49 void delay(uchar tt);
50 void trace(uchar *str,uchar len);
51 void test_page(uchar addr);
52 void read_page(uchar addr);
53 void Verify(uchar byte, uchar cor_byte);
54
55 void SPI_init();
C51 COMPILER V7.50 SPIDRV 01/11/2009 22:30:34 PAGE 2
56
57 void SPI_Send_Byte(uchar out);
58 uchar SPI_Get_Byte();
59 void SPI_Wait_Busy();
60
61 uchar SPI_Read_StatusReg();
62 void SPI_Write_StatusReg(byte);
63 void SPI_Write_Enable();
64 void SPI_PowerDown();
65 void SPI_ReleasePowerDown();
66
67 uchar SPI_Read_Byte(uint32 Dst_Addr);
68 void SPI_Read_nBytes(uint32 Dst_Addr, uchar nBytes_128);
69 uchar SPI_FastRead_Byte(uint32 Dst_Addr);
70 void SPI_FastRead_nBytes(uint32 Dst_Addr, uchar nBytes_128);
71
72 void SPI_Write_Byte(uint32 Dst_Addr, uchar byte);
73 void SPI_Write_nBytes(uint32 Dst_Addr, uchar nBytes_128);
74 void SPI_WriteW25X_Disable();
75
76 void SPI_Erase_Chip();
77 void SPI_Erase_Sector(uint32 Dst_Addr);
78
79 uchar SPI_Read_ID1();
80 uint SPI_Read_ID2(uchar ID_Addr);
81 uint SPI_Read_ID3();
82
83
84
85 uint8 Rxtemp;
86 bit MYTI;
87 uint8 tx_buff[16];
88 uint8 upper_128[16];
89 bit rx_ok;
90 #define nop() _nop_()
91
92 void delay_nms(uchar i)
93 { uchar j;
94 1 i=i*2;
95 1 for(;i>0;i--) { j = 246; while(--j); }
96 1 }
97
98 void main(void)
99 { uint i;
100 1
101 1 init_cpu();
102 1 SPI_init();
103 1
104 1 tx_buff[0]='O';
105 1 tx_buff[1]='K';
106 1 trace(tx_buff,2);
107 1
108 1 for(;;)
109 1 { if(rx_ok == 1)
110 2 { rx_ok = 0;
111 3 switch(Rxtemp)
112 3 { case 0x01:
113 4 Rxtemp = 0;
114 4 tx_buff[0] = SPI_Read_ID1();
115 4 trace(tx_buff,1);
116 4 break;
117 4 case 0x02:
C51 COMPILER V7.50 SPIDRV 01/11/2009 22:30:34 PAGE 3
118 4 i = SPI_Read_ID2(0x00);
119 4 tx_buff[1] = (uchar)i;
120 4 tx_buff[0] = (uchar)(i>>8);
121 4 trace(tx_buff,2);
122 4 break;
123 4 case 0x03:
124 4 i = SPI_Read_ID3();
125 4 tx_buff[1] = (uchar)i;
126 4 tx_buff[0] = (uchar)(i>>8);
127 4 trace(tx_buff,3);
128 4 break;
129 4 case 0x04:
130 4 tx_buff[0] = SPI_Read_Byte(0x00000000);
131 4 trace(tx_buff,1);
132 4 break;
133 4 case 0x05:
134 4 tx_buff[0] = 0x55;
135 4 SPI_Write_Byte(0x00000000,0xa5);
136 4 trace(tx_buff,1);
137 4 break;
138 4 case 0x06:
139 4 tx_buff[0] = SPI_Read_StatusReg();
140 4 trace(tx_buff,1);
141 4 break;
142 4 case 0x07:
143 4 SPI_Write_Enable();
144 4 break;
145 4 case 0x08:
146 4 upper_128[0]=0x01;upper_128[1]=0x02;upper_128[2]=0x03;upper_128[3]=0x04;
147 4 SPI_Write_nBytes(0x00000000,4);
148 4 break;
149 4 case 0x09:
150 4 SPI_Erase_Chip();
151 4 break;
152 4 case 0x0a:
153 4 SPI_Erase_Sector(0x000ff000);
154 4 while(1)
155 4 { tx_buff[0] = SPI_Read_StatusReg();
156 5 if(tx_buff[0] == 0)
157 5 { trace(tx_buff,1);
158 6 break;
159 6 }
160 5 }
161 4 break;
162 4 case 0x0b:
163 4 test_page(0x00);
164 4 break;
165 4 case 0x0c:
166 4 read_page(0x00);
167 4 break;
168 4 default:
169 4 break;
170 4 }
171 3 }
172 2 }
173 1 }
174
175 void init_cpu(void)
176 { TMOD = 0x21;
177 1 PCON = PCON | 0x80; //波特率加倍
178 1 SCON = 0x50; //异步、10位、波特率可变,无校验位
179 1 TH1 = 0xfd; //在11.0592M晶振下,波特率是9600,
C51 COMPILER V7.50 SPIDRV 01/11/2009 22:30:34 PAGE 4
180 1 TL1 = 0xfd;
181 1 TR1 = 1; //T1 timer run
182 1 ES = 1; //uart interrupt enable
183 1 EA = 1; //all interrupt enable
184 1 }
185 //串口中断程序
186 void UART_isr(void) interrupt 4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -