📄 spidriv.lst
字号:
C51 COMPILER V8.01 SPIDRIV 09/30/2007 11:14:55 PAGE 1
C51 COMPILER V8.01, COMPILATION OF MODULE SPIDRIV
OBJECT MODULE PLACED IN SPIDriv.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE SPIDriv.c LARGE BROWSE DEBUG OBJECTEXTEND CODE SYMBOLS
line level source
1 #define __SPIDRIV_H__
2
3 #include "Config.h"
4
5 #define WREN 0x06 //写使能
6 #define WRDI 0x04 //写禁止
7 #define RDSR 0x05 //读状态寄存器
8 #define WRSR 0x01 //写状态寄存器
9
10 #define READH 0x0B //读存储器的高半部分
11 #define READL 0x03 //读存储器的低半部分
12 #define WRITEH 0x0A //写存储器的高半部分
13 #define WRITEL 0x02 //写存储器的低半部分
14
15 /********************************************************************************************************
16 **函数名称: SPIInit
17 **函数功能: SPI接口初始化
18 **输 入: 无
19 **输 出: 无
20 ********************************************************************************************************/
21 void SPIInit(void)
22 {
23 1 PERIPHEN1 |= (BIT7 | BIT6); //SPI接口使能;SPI CS禁止,作为通用IO口(CS0除外)
24 1 //--------------------------------------------------------------------
25 1 #ifdef DOWNLOAD
26 1 while((SPISTATUS & BIT3) == 0x00); //等待SPI准备好
27 1 #endif
28 1 //--------------------------------------------------------------------
29 1 SPICTRL = (0 | BIT6 | BIT5 | 0 | 0 | 0 | BIT1 | BIT0); //上升沿采样,休眠时停留为高电平
30 1 //通信速率sysclk/32;
31 1 //CS0使能
32 1 //SPI模式0(模式3也可以)
33 1 //SPI主模式
34 1
35 1 SPICONFIG = (BIT7 | 0 | 0 | 0 | 0 | 0 | 0 | 0); //CS手动控制
36 1 //片选自动控制
37 1 //CS3正常模式
38 1 //正常传输模式
39 1 //接收溢出中断禁止
40 1 //接收中断禁止
41 1 //发送缓冲空使能
42 1 SPISTATUS = 0x00; //正常模式
43 1 //至少一个片选有效
44 1 //中断标志清零
45 1 //SPISIZE = 0x07; //8位传输模式
46 1 }
47
48 /********************************************************************************************************
49 **函数名称: FMSPIWrite
50 **函数功能: 写数据到存储器
51 **输 入: Src: 要写入到存储器的数据的缓冲区指针
52 Dst: 要写入的存储器的地址
53 DataLen: 要写入的数据长度
54 **输 出: 无
55 ********************************************************************************************************/
C51 COMPILER V8.01 SPIDRIV 09/30/2007 11:14:55 PAGE 2
56 void FMSPIWrite(uchar * Src, uint Dst, uint DataLen)
57 {
58 1 uchar Temp;
59 1 //-----------------------------------------
60 1 //因为只发送一个字节,所以用自动模式即可
61 1 SPICONFIG &= ~BIT7;
62 1 //-----------------------------------------
63 1
64 1 Temp = SPIRXTX0; //DummyRead to clear SPIRXAV flag 清接收标志
65 1 SPIRXTX0 = WREN; //在写之前先发送写使能
66 1 #ifdef DOWNLOAD
67 1 while((SPISTATUS & BIT1) == 0); //等待发送完成
68 1 #endif
69 1 //-----------------------------------------
70 1 //下面要发送多个字节故转为/CS手动控制方式
71 1 SPICONFIG |= BIT7; //转换为手动模式
72 1 //-----------------------------------------
73 1
74 1 if(Dst < 0x100) //如果是写低半部分
75 1 {
76 2 Temp = SPIRXTX0; //DummyRead to clear SPIRXAV flag 清接收标志
77 2 SPIRXTX0 = WRITEL; //低半部写
78 2 #ifdef DOWNLOAD
79 2 while((SPISTATUS & BIT1) == 0); //等待发送完成
80 2 #endif
81 2
82 2 Temp = SPIRXTX0; //DummyRead to clear SPIRXAV flag 清接收标志
83 2 SPIRXTX0 = (uchar)(Dst & 0x00FF); //发送字节地址
84 2 #ifdef DOWNLOAD
85 2 while((SPISTATUS & BIT1) == 0); //等待发送完成
86 2 #endif
87 2 }
88 1 else //写高半部分
89 1 {
90 2 Temp = SPIRXTX0; //DummyRead to clear SPIRXAV flag 清接收标志
91 2 SPIRXTX0 = WRITEH; //高半部写
92 2 #ifdef DOWNLOAD
93 2 while((SPISTATUS & BIT1) == 0); //等待发送完成
94 2 #endif
95 2
96 2 Temp = SPIRXTX0; //DummyRead to clear SPIRXAV flag 清接收标志
97 2 SPIRXTX0 = (uchar)(Dst & 0x00FF); //发送字节地址
98 2 #ifdef DOWNLOAD
99 2 while((SPISTATUS & BIT1) == 0); //等待发送完成
100 2 #endif
101 2 }
102 1
103 1 for(; DataLen --; DataLen > 0)
104 1 {
105 2 Temp = SPIRXTX0; //读清标志
106 2 SPIRXTX0 = *Src; //写数据
107 2
108 2 #ifdef DOWNLOAD
109 2 while((SPISTATUS & BIT1) == 0); //等待数据发送完成
110 2 #endif
111 2
112 2 Src ++; //指向下一个要发送的数据
113 2 }
114 1
115 1 //-----------------------------------------
116 1 //必须在一个操作完成之后再置高/CS
117 1 SPICONFIG &= ~BIT7; //拉高CS,(同时设为自动模式)
C51 COMPILER V8.01 SPIDRIV 09/30/2007 11:14:55 PAGE 3
118 1 //-----------------------------------------
119 1 }
120
121 /********************************************************************************************************
122 **函数名称:FMSPIRead
123 **函数功能:读入数据数据到存储器
124 **输 入:DSt: 要存储读到的数据的缓冲区指针
125 Src: 要读数据的存储器的地址
126 DataLen: 要写入的数据长度
127 **输 出:读回的数据存储到DST指向的缓冲
128 ********************************************************************************************************/
129 void FMSPIRead(uchar * Dst, uint Src, uint DataLen)
130 {
131 1 uchar Temp;
132 1 //-----------------------------------------
133 1 //由于要读写多字节,设为为手动模式,手动控制/CS
134 1 SPICONFIG |= BIT7;
135 1 //-----------------------------------------
136 1 Temp = SPIRXTX0; //DummyRead 清标志
137 1
138 1 if(Src < 0x100) //读低字节
139 1 {
140 2 Temp = SPIRXTX0; //DummyRead to clear SPIRXAV flag 清接收标志
141 2 SPIRXTX0 = READL;
142 2 #ifdef DOWNLOAD
143 2 while((SPISTATUS & BIT1) == 0); //等待发送完成
144 2 #endif
145 2
146 2 Temp = SPIRXTX0; //DummyRead to clear SPIRXAV flag 清接收标志
147 2 SPIRXTX0 = (uchar)(Src & 0x00FF); //发送字节地址
148 2 #ifdef DOWNLOAD
149 2 while((SPISTATUS & BIT1) == 0); //等待发送完成
150 2 #endif
151 2 }
152 1 else //读高字节
153 1 {
154 2 Temp = SPIRXTX0; //DummyRead to clear SPIRXAV flag 清接收标志
155 2 SPIRXTX0 = READH;
156 2 #ifdef DOWNLOAD
157 2 while((SPISTATUS & BIT1) == 0); //等待发送完成
158 2 #endif
159 2
160 2 Temp = SPIRXTX0; //DummyRead to clear SPIRXAV flag 清接收标志
161 2 SPIRXTX0 = (uchar)(Src & 0x00FF); //发送字节地址
162 2 #ifdef DOWNLOAD
163 2 while((SPISTATUS & BIT1) == 0); //等待发送完成
164 2 #endif
165 2 }
166 1
167 1 for(; DataLen --; DataLen > 0)
168 1 {
169 2 Temp = SPIRXTX0;
170 2 SPIRXTX0 = 0x00; //产生接收数据时钟
171 2
172 2 #ifdef DOWNLOAD
173 2 while((SPISTATUS & BIT1) == 0);
174 2 #endif
175 2 *Dst = SPIRXTX0; //读回数据
176 2 Dst ++;
177 2 }
178 1 //-----------------------------------------
179 1 //必须在一个操作完成之后再置高/CS
C51 COMPILER V8.01 SPIDRIV 09/30/2007 11:14:55 PAGE 4
180 1 SPICONFIG &= ~BIT7; //拉高CS
181 1 //-----------------------------------------
182 1 }
183
184 /********************************************************************************************************
185 **函数名称:FM25L04Test
186 **函数功能:25CL04数据存储器测试
187 **输 入: 无
188 **输 出: 无
189 ********************************************************************************************************/
190 void FM25L04Test(void)
191 {
192 1 //-----------------------------------------------
193 1 //SPI接口存储器FM25L04测试时用到的变量
194 1 //-----------------------------------------------
195 1 uint xdata FM25L04ADDR;
196 1 uchar xdata FM25L04DatWR; //写入的数据
197 1 uchar xdata FM25L04WRStore[512]; //写入数据存储的数组
198 1 uchar xdata FM25L04RDStore[512]; //读取的数据存储殊组
199 1 //-----------------------------------------------
200 1
201 1 FM25L04ADDR = 0x0000; //25L04的地址计数器
202 1
203 1 //memset(FM25L04WRStore, 512, 0); //清空写RAM
204 1 //memset(FM25L04RDStore, 512, 0); //清空读RAM
205 1
206 1 UART0_Printf("\n ->FM25L04 test begin: \n");
207 1
208 1 //-----------------------------------------------
209 1 //先将待写的数据存储,方便用写多字节的方法一次写入
210 1 //-----------------------------------------------
211 1 for(FM25L04ADDR = 0x00; FM25L04ADDR < 512; FM25L04ADDR ++)
212 1 {
213 2 FM25L04DatWR = (int)rand();
214 2 FM25L04WRStore[FM25L04ADDR] = FM25L04DatWR;
215 2 }
216 1 FMSPIWrite(FM25L04WRStore, 0x00, 512); //写入512字节数据
217 1
218 1 #ifdef FM25L04DATASHOW
UART0_Printf("\n\n Write to 0x:%x \n",0x0000);
for(FM25L04ADDR = 0x00; FM25L04ADDR < 512; FM25L04ADDR ++)
{
UART0_Printf(" %d ",(int)FM25L04WRStore[FM25L04ADDR]);
}
#endif
225 1
226 1 //-------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -