?? spi.lst
字號:
C51 COMPILER V7.07 SPI 09/29/2006 15:11:00 PAGE 1
C51 COMPILER V7.07, COMPILATION OF MODULE SPI
OBJECT MODULE PLACED IN SPI.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE SPI.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 //******************************************************//
2 /*spi_m是發(fā)送或接收標志位,SPIE為中斷允許位,scon中TI,RI怎么考慮??
3 /********************************************************/
4 #include <AT89X52.H>
5 #include <stdio.h>
6 #define uchar unsigned char;
7 #define uint unsigned int;
8
9 #define MOSI P1_5;
10 #define MISO P1_6;
11 #define SCK P1_7;
12 #define SS P1_4;
13 #define TXD P3_1;
14
15 sfr SPCR = 0xD5;
16 sfr SPSR = 0xAA;
17 sfr SPDR = 0x86;
18 sbit SPIF = 0xB1;
19 sbit WCOL = 0xB0;
20 sbit MSTR = 0xD9;
21 sbit SPIE = 0xDC;
22 /****定義變量*****************/
23 //SPSR=00h;
24 //SPDR=00h;
25 uchar SPI_RxHead;
26 uchar SPI_TxHead;
27 uint SPI_RxBuf[]; //選擇字節(jié),還是字容量?//
28 uint SPI_TxBuf[]; //選擇字節(jié),還是字容量?//
29 uint ReSend_FLAG[];
30 uchar crc_array[];
31 uint array_sscl[];
32 uint array_krzt[];
33 uint array_bwjl[];
34 uint array_sjjl[];
35 uint array_fwjl[];
36 uint array_xtsz[];
37 uint array_ddz[];
38
39 uchar RT;
40 int crc_buf;
41 /******************************************************/
42 /*模擬量裝入
43 /******************************************************/
44
45 /*******************************************************/
46 /*SPI初始化
47 /*******************************************************/
48 void int_spi(void)
49 {
50 1 SPCR =0x50; //spe=1,mstr=1:主方式,4倍分頻//
51 1 SPSR =0x40;
52 1 IE =0x90; //ES=1:允許串行中斷/
53 1 //SS=0; //spi為主器件//
54 1 SPI_RxHead=0;
55 1 SPI_TxHead=0;
C51 COMPILER V7.07 SPI 09/29/2006 15:11:00 PAGE 2
56 1 ReSend_FLAG[0]=0x55;
57 1 ReSend_FLAG[1]=0x55;
58 1 ReSend_FLAG[2]=0x55;
59 1 ReSend_FLAG[3]=0x55;
60 1 ReSend_FLAG[4]=0x55;
61 1 RT=TXD;
62 1 }
63 /**************************************/
64 /*CRC校驗初始化
65 /**************************************/
66 void inti_crc(void)
67 {
68 1 char i;
69 1 for(i=0;i<16;i++)
70 1 crc_array[i]=0x1021*i ;/*為CRC數(shù)組賦初值*/
71 1 }
72 /**********************************************************************/
73 /****CRC校驗程序*******************************************************/
74 /****data為待計算CRC的數(shù)據(jù)的地址,lenght為參與CRC計算的數(shù)據(jù)長度*********/
75 /**********************************************************************/
76 void crc_cal(int *crc_data,int length)
77 {
78 1 int n1;
79 1 int n2;
80 1 for(;length!=0;length--)
81 1 {
82 2 n2=*crc_data++ ;
83 2 n1=(crc_buf>>12)&0xf ; /*取此前CRC的高4位*/
84 2 crc_buf<<=4 ; /*將此前CRC左移4位*/
85 2 crc_buf^=crc_array[n1^((n2>>4&0xf))];
86 2 n1=(crc_buf>>12)&0xf ; /*取此前CRC的高4位*/
87 2 crc_buf<<=4 ; /*將此前CRC左移4位*/
88 2 crc_buf^=crc_array[n1^(n2&0xf)] ;
89 2 }
90 1 return;
91 1 }
92 /********************************************/
93 /*把電壓電流等參數(shù)賦給對應(yīng)的數(shù)組
94 /********************************************/
95
96 /*******************************************/
97 /*判斷接收的是哪種類型BianMa_J()
98 /*******************************************/
99 void BianMa_J(void)
100 {
101 1 if(SPI_RxBuf[0]&0x10&&SPI_RxBuf[1]&0x01)
102 1 {
103 2 int i;
104 2 for(;i>=0;i--)array_sscl[i]=SPI_RxBuf[i];//實時測量//
105 2 }
106 1 if(SPI_RxBuf[0]&0x10&&SPI_RxBuf[1]&0x02)
107 1 {
108 2 int i;
109 2 for(;i>=0;i--)array_krzt[i]=SPI_RxBuf[i];//開入狀態(tài)//
110 2 }
111 1 if(SPI_RxBuf[0]&0x10&&SPI_RxBuf[1]&0x03)
112 1 {
113 2 int i;
114 2 for(;i>=0;i--)array_bwjl[i]=SPI_RxBuf[i];//變位記錄//
115 2 }
116 1 if(SPI_RxBuf[0]&0x10&&SPI_RxBuf[1]&0x04)
117 1 {
C51 COMPILER V7.07 SPI 09/29/2006 15:11:00 PAGE 3
118 2 int i;
119 2 for(;i>=0;i--)array_sjjl[i]=SPI_RxBuf[i];//事件記錄//
120 2 }
121 1 if(SPI_RxBuf[0]&0x10&&SPI_RxBuf[1]&0x05)
122 1 {
123 2 int i;
124 2 for(;i>=0;i--)array_fwjl[i]=SPI_RxBuf[i];//復位記錄//
125 2 }
126 1 if(SPI_RxBuf[0]&0x10&&SPI_RxBuf[1]&0x06)
127 1 {
128 2 int i;
129 2 for(;i>=0;i--)array_ddz[i]=SPI_RxBuf[i];//讀定值//
130 2 }
131 1 if(SPI_RxBuf[0]&0x10&&SPI_RxBuf[1]&0x07)
132 1 {
133 2 int i;
134 2 for(;i>=0;i--)array_xtsz[i]=SPI_RxBuf[i];//系統(tǒng)設(shè)置//
135 2 }
136 1 //未完//
137 1
138 1 }
139 /*******************************************/
140 /*fill_tx_buffer()
141 /*******************************************/
142 fill_tx_buffer()
143 {
144 1 BianMa_J(); //判斷//
145 1
146 1 }
147 //******************************************
148 // SPI發(fā)送/接收一幀
149 //******************************************
150 void spi_RT(int SPI_RT_LENGTH)
151 {
152 1 if(RT&0x01) //如果TXD(spi_m)為0,表明是接收狀態(tài)
153 1 {
154 2 if ( SPI_RxHead > SPI_RT_LENGTH ) //如果是接收幀的最后一個數(shù)據(jù)
155 2 {
156 3
157 3 crc_cal(SPI_RxBuf,SPI_RT_LENGTH);//CRC校驗
158 3 if(crc_buf!=0)RT=1;
159 3 else
160 3 {
161 4 if(SPI_RxBuf[0]&0x55)RT=1;
162 4 else
163 4 {
164 5 BianMa_J(); //判斷//
165 5
166 5
167 5 }
168 4 SPI_RxHead = 0; //計數(shù)還原
169 4 MSTR=1; //接收完成,將SPI設(shè)回主方式?????
170 4 SPIE=0; //清空中斷申請//
171 4 SPIF=1; //置接收完成標志 ,置傳輸結(jié)束標志//
172 4 }
173 3 }
174 2 else
175 2 {
176 3 SPI_RxBuf[SPI_RxHead] = SPDR; //將接收到的數(shù)據(jù)存入接收緩存區(qū)
177 3 SPI_RxHead++; //已接收數(shù)據(jù)計數(shù)器加1
178 3 }
179 2 }
C51 COMPILER V7.07 SPI 09/29/2006 15:11:00 PAGE 4
180 1 else //如果spi_m為1,表明是發(fā)送狀態(tài)
181 1 {
182 2 SPI_TxHead = 0;
183 2 if(crc_buf!=0)
184 2 {
185 3 char j;
186 3 for(j=0;;j++)SPI_TxBuf[j]=ReSend_FLAG[j];
187 3 if ( SPI_TxHead <= SPI_RT_LENGTH) //如果要發(fā)送的數(shù)據(jù)還未全部發(fā)完
188 3 {
189 4 SPDR = SPI_TxBuf[SPI_TxHead]; //從發(fā)送緩存區(qū)取數(shù)發(fā)送
190 4 SPI_TxHead++; //已發(fā)送數(shù)據(jù)計數(shù)器加1
191 4 //while(1);
192 4 }
193 3 else //如果要發(fā)送的數(shù)據(jù)已全部發(fā)完
194 3 {
195 4 SPI_TxHead=0; //已發(fā)送數(shù)據(jù)計數(shù)器還原
196 4 //SET_SPI_MODE=1; //釋放總線,以便接收方進入主發(fā)送。
197 4 //spi_m=0;
198 4 MSTR=1;
199 4 SPIE=0; //清空中斷申請//
200 4 SPIF=1; //清空發(fā)送中標記 ,置傳輸結(jié)束標志//
201 4
202 4 }
203 3 }
204 2 if(SPI_RxBuf[0]&0x55)
205 2 {
206 3 if ( SPI_TxHead <= SPI_RT_LENGTH) //如果要發(fā)送的數(shù)據(jù)還未全部發(fā)完
207 3 {
208 4 SPDR = SPI_TxBuf[SPI_TxHead]; //從發(fā)送緩存區(qū)取數(shù)發(fā)送
209 4 SPI_TxHead++; //已發(fā)送數(shù)據(jù)計數(shù)器加1
210 4 //while(1);
211 4 }
212 3 else //如果要發(fā)送的數(shù)據(jù)已全部發(fā)完
213 3 {
214 4 SPI_TxHead=0; //已發(fā)送數(shù)據(jù)計數(shù)器還原
215 4 //SET_SPI_MODE=1; //釋放總線,以便接收方進入主發(fā)送。
216 4 //spi_m=0;
217 4 MSTR=1;
218 4 SPIE=0; //清空中斷申請//
219 4 SPIF=1; //清空發(fā)送中標記 ,置傳輸結(jié)束標志//
220 4 }
221 3 }
222 2
223 2 /*根據(jù)dis_enter和key_enter值定時發(fā)送設(shè)定值//
224 2 }
225 2
226 2 //******************************************
227 2 //發(fā)送數(shù)據(jù) 中斷服務(wù)程序
228 2 //******************************************/
229 2 main()
*** WARNING C206 IN LINE 229 OF SPI.C: 'main': missing function-prototype
230 2 {
*** ERROR C141 IN LINE 230 OF SPI.C: syntax error near '{'
231 3 int_spi(); //初始化spi為主方式
232 3 SPDR=0xFF; //開始發(fā)送,接收方接收到的第一個數(shù)據(jù)為0xFF應(yīng)忽略
233 3 delay_us(10);
234 3 spi_RT(); //執(zhí)行數(shù)據(jù)接發(fā)//
235 3 }
236 2
C51 COMPILATION COMPLETE. 1 WARNING(S), 1 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -