📄 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是发送或接收标志位,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[]; //选择字节,还是字容量?//
28 uint SPI_TxBuf[]; //选择字节,还是字容量?//
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数组赋初值*/
71 1 }
72 /**********************************************************************/
73 /****CRC校验程序*******************************************************/
74 /****data为待计算CRC的数据的地址,lenght为参与CRC计算的数据长度*********/
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 /*把电压电流等参数赋给对应的数组
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];//开入状态//
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];//系统设置//
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发送/接收一帧
149 //******************************************
150 void spi_RT(int SPI_RT_LENGTH)
151 {
152 1 if(RT&0x01) //如果TXD(spi_m)为0,表明是接收状态
153 1 {
154 2 if ( SPI_RxHead > SPI_RT_LENGTH ) //如果是接收帧的最后一个数据
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; //计数还原
169 4 MSTR=1; //接收完成,将SPI设回主方式?????
170 4 SPIE=0; //清空中断申请//
171 4 SPIF=1; //置接收完成标志 ,置传输结束标志//
172 4 }
173 3 }
174 2 else
175 2 {
176 3 SPI_RxBuf[SPI_RxHead] = SPDR; //将接收到的数据存入接收缓存区
177 3 SPI_RxHead++; //已接收数据计数器加1
178 3 }
179 2 }
C51 COMPILER V7.07 SPI 09/29/2006 15:11:00 PAGE 4
180 1 else //如果spi_m为1,表明是发送状态
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) //如果要发送的数据还未全部发完
188 3 {
189 4 SPDR = SPI_TxBuf[SPI_TxHead]; //从发送缓存区取数发送
190 4 SPI_TxHead++; //已发送数据计数器加1
191 4 //while(1);
192 4 }
193 3 else //如果要发送的数据已全部发完
194 3 {
195 4 SPI_TxHead=0; //已发送数据计数器还原
196 4 //SET_SPI_MODE=1; //释放总线,以便接收方进入主发送。
197 4 //spi_m=0;
198 4 MSTR=1;
199 4 SPIE=0; //清空中断申请//
200 4 SPIF=1; //清空发送中标记 ,置传输结束标志//
201 4
202 4 }
203 3 }
204 2 if(SPI_RxBuf[0]&0x55)
205 2 {
206 3 if ( SPI_TxHead <= SPI_RT_LENGTH) //如果要发送的数据还未全部发完
207 3 {
208 4 SPDR = SPI_TxBuf[SPI_TxHead]; //从发送缓存区取数发送
209 4 SPI_TxHead++; //已发送数据计数器加1
210 4 //while(1);
211 4 }
212 3 else //如果要发送的数据已全部发完
213 3 {
214 4 SPI_TxHead=0; //已发送数据计数器还原
215 4 //SET_SPI_MODE=1; //释放总线,以便接收方进入主发送。
216 4 //spi_m=0;
217 4 MSTR=1;
218 4 SPIE=0; //清空中断申请//
219 4 SPIF=1; //清空发送中标记 ,置传输结束标志//
220 4 }
221 3 }
222 2
223 2 /*根据dis_enter和key_enter值定时发送设定值//
224 2 }
225 2
226 2 //******************************************
227 2 //发送数据 中断服务程序
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; //开始发送,接收方接收到的第一个数据为0xFF应忽略
233 3 delay_us(10);
234 3 spi_RT(); //执行数据接发//
235 3 }
236 2
C51 COMPILATION COMPLETE. 1 WARNING(S), 1 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -