📄 sub.lst
字号:
C51 COMPILER V8.02 SUB 11/29/2006 17:29:51 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE SUB
OBJECT MODULE PLACED IN .\obj\sub.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE sub.c BROWSE DEBUG OBJECTEXTEND OBJECT(.\obj\sub.obj)
line level source
1 #define SUB //定义子函数
2
3 #include "reg51.h"
4 #include "intrins.h"
5 #include "absacc.h"
6 #include "io.h"//AT89C2051的IO定义
7 #include "spi.h"//将SPI子函数定义为外部函数
8 #include "sub.h"//激活子函数定义为外部函数
9 #include "ch.h"//通道子函数定义为外部函数
10
11 /*********软件复位函数**********/
12
13 void reset()//软件复位,NR0地址0-000,数据1000
14 {
15 1 _nop_();
16 1 writedata(0X08,8);//0-000-1000 复位
17 1 delayus(100); //大于6个时钟周期
18 1 writedata(0x00,8);//0-000-0000 复位后恢复正常
19 1 }
20
21 /********选择NT AUTO-eoc初始化**********/
22
23 void NT_initial()
24 {
25 1 _nop_();
26 1 writedata(0x70,8);//M4 Channel transmit BR0地址0111-0000
27 1 _nop_();
28 1 writedata(0x77,8);//BR0数据77
29 1 _nop_();
30 1 writedata(0x71,8);//M4 Channel receive BR1先写入地址0111-0001
31 1 _nop_();
32 1 writedata(0x7F,8);//如果是NT写入数据7F-01111111
33 1 _nop_();
34 1 writedata(0x72,8);//M5/M6 channel BR2先写入地址0111-0010
35 1 _nop_();
36 1 writedata(0xF0,8);//如果是NT写入数据F0-11110000
37 1 _nop_();
38 1 writedata(0x79,8);//EOC/M4/M5/M6 channel control BR9先写入地址0111-1001
39 1 _nop_();
40 1 writedata(0x1C,8);//如果是NT写入数据1C-00011100//automatic eoc mode->00----non auto eoc->10
41 1 _nop_();
42 1 writedata(0x7A,8);//BR10先写入地址0111-1010
43 1 _nop_();
44 1 writedata(0x01,8);//写入数据01-00000001 选择overlay reg有效
45 1 _nop_();
46 1 writedata(0x01,8);//OR7(bo)置1,M4通道模式
47 1 _nop_();
48 1 writedata(0x7A,8);//BR10先写入地址0111-1010
49 1 _nop_();
50 1 writedata(0x00,8);//bo为0 选择overlay reg无效
51 1 _nop_();
52 1 writedata(0x4A,8);//NR4中断使能1010,IRQ1,IRQ3使能
53 1 delayms(50);
54 1 }
55
C51 COMPILER V8.02 SUB 11/29/2006 17:29:51 PAGE 2
56
57 /*******选择NT AUTO-eco中断处理*********/
58
59
60 unsigned char NT_interrupt()
61 {
62 1 unsigned char dat,val;
63 1 if(dat&0x38==0x38)//NR3(b3) = 1
64 1 {
65 2 //Test for successful initial activation
66 2 if((dat&0x1a==0x1a)||(dat&0x1b==0x1b))//IF NR1 = A or B AND initial activation
67 2 {
68 3 writedata(0x74,8);//BR4 address
69 3 _nop_();
70 3 writedata(0x00,8);//write BR4-00
71 3 _nop_();
72 3 writedata(0x75,8);//BR5 address
73 3 _nop_();
74 3 writedata(0x00,8);//write BR5-00
75 3 _nop_();
76 3 if(dat&0x02==0x02) //IF S/T interface is active- M4的b1位:sai为1 for S/T activity
77 3 {
78 4 writedata(0x70,8);//BR0地址0111-0000
79 4 _nop_();
80 4 writedata(0xf7,8);//BR0数据f7
81 4 _nop_();
82 4 }
83 3 }
84 2 else if(dat&0x14==0x14) //NR1 = 0100
85 2 {
86 3 //disable interrupts activation unsuccessfull
87 3 }
88 2 return(val);
89 2 }
90 1 else
91 1 {
92 2 if(dat&0x32==0x32)//NR3(b1) = 1
93 2 {
94 3 //IF BR1(b7) = 1 AND last received BR1(b7) = 0 AND BR1(b6) = 1
95 3 if(1)
96 3 {
97 4 writedata(0x29,8);//NR2(b0)=1
98 4 }
99 3 else
100 3 {
101 4 //handle other M4 status changes here
102 4 }
103 3 }
104 2 }
105 1
106 1 }
107
108 /*******选择NT AUTO-eoc激活********/
109 //激活:1.软件复位;2. 初始化相关寄存器;3.设置激活请求;4.若有激活请求中断进入中断处理
110
111 void NT_activation()
112 {
113 1 _nop_();
114 1 reset();
115 1 _nop_();
116 1 NT_initial();
117 1 _nop_();
C51 COMPILER V8.02 SUB 11/29/2006 17:29:51 PAGE 3
118 1 writedata(0x28,8);//NR2的b3置1激活请求
119 1 _nop_();
120 1 //判断是否有激活中断请求
121 1 //进入中断处理
122 1 NT_interrupt();
123 1 }
124
125
126 /********LT 初始化**********/
127 void LT_initial()
128 {
129 1 _nop_();
130 1 writedata(0x70,8);//BR0地址0111-0000
131 1 _nop_();
132 1 writedata(0x7F,8);//M4发送数据,BR0数据7F-01111111
133 1 _nop_();
134 1 writedata(0x71,8);//BR1先写入地址0111-0001
135 1 _nop_();
136 1 writedata(0x7F,8);//M4写入数据,BR1数据7F-01111111
137 1 _nop_();
138 1 writedata(0x72,8);//BR2写入地址0111-0010
139 1 _nop_();
140 1 writedata(0xF0,8);//M5和M6写入数据,BR2数据F0-11110000
141 1 _nop_();
142 1 writedata(0x79,8);//BR9先写入地址0111-1001
143 1 _nop_();
144 1 writedata(0x8C,8);//BR9写入数据8C-10001100
145 1 _nop_();
146 1 writedata(0x7A,8);//BR10先写入地址0111-1010
147 1 _nop_();
148 1 writedata(0x01,8);//写入数据01-00000001 选择overlay reg有效
149 1 _nop_();
150 1 writedata(0x01,8);//OR7(bo)置1,M4通道模式
151 1 _nop_();
152 1 writedata(0x7A,8);//BR10先写入地址0111-1010
153 1 _nop_();
154 1 writedata(0x00,8);//写入数据00-00000000 选择overlay reg无效
155 1 _nop_();
156 1 writedata(0x61,8);//R6地址0-110和前4位数据0001
157 1 _nop_();
158 1 writedata(0xFF,8);//R6后8位数据11111111
159 1 _nop_();
160 1 writedata(0x4E,8);//NR4中断使能1110,IRQ1,IRQ2,IRQ3使能
161 1 delayms(50);
162 1 }
163
164
165 /*******LT中断处理*********/
166 unsigned char LT_interrupt()
167 {
168 1 unsigned char dut;
169 1 if(1)
170 1 {
171 2
172 2 ; }
173 1 else
174 1 {
175 2 ;}
176 1 return(dut);
177 1 }
178
179
C51 COMPILER V8.02 SUB 11/29/2006 17:29:51 PAGE 4
180 /*******LT激活********/
181 //激活:1.软件复位;2. 初始化相关寄存器;3.设置激活请求;4.若有激活请求中断进入中断处理
182
183 void LT_activation()
184 {
185 1 _nop_();
186 1 reset();
187 1 _nop_();
188 1 LT_initial();
189 1 _nop_();
190 1 writedata(0x28,8);//NR2的b3置1激活请求
191 1 //判断是否有激活中断请求
192 1 //进入中断处理
193 1 LT_interrupt();
194 1 }
195
196 /******初始化各控制寄存器*******/
197
198 void initial_reg()
199 {
200 1 delayms(100);
201 1
202 1 //unsigned char x,y;
203 1 /*****************************************************
204 1 Nibble registers NR0~NR5为8位 地址是高4位的后3位为0-A2-A1-A0 低4位为数据
205 1 //3位地址与NR0~NR5对应;地址6和7有其他作用
206 1 //例如:NR1对应地址001
207 1 ******************************************************/
208 1
209 1
210 1 //WRITE NR2 有效控制寄存器
211 1 writedata(0x24,8);//地址0-010,数据0100
212 1
213 1 //WRITE NR4 中断使能寄存器
214 1 writedata(0x4F,8); //IRQ使能都有效,地址0-100,数据1111
215 1
216 1 //WRITE NR5 IDL2数据控制寄存器
217 1 writedata(0x51,8);//地址0-101,block阻塞B1,B2通道,数据0001 0001不阻塞B1,B2通道
218 1
219 1
220 1
221 1 /****************************************************
222 1 Nibble register R6为双8位,R6的地址是前8位的高4位0-A2-A1-A0后12位为数据
223 1 //固定地址6: 写地址为0-A2-A1-A0为0110读数据0-A2-A1-A0为1110
224 1 // R6写读都可以为8位和16位选择
225 1 ******************************************************/
226 1
227 1 //R6 eoc 数据寄存器 Embedded Operations Channel (eoc)
228 1
229 1
230 1
231 1
232 1
233 1 /****************************************************
234 1 Byte registers BR0~BR15为双8位,前8位的低4位为地址0111-A3-A2-A1-A0后8位为数据
235 1 //4位地址与BR0~BR15对应?
236 1 // BR0~BR15写读都可以为8位和16位选择
237 1 ******************************************************/
238 1
239 1 //WRITE BR0 M4发送数据寄存器
240 1
241 1 writedata(0x70,8);// 先写入地址0111-0000
C51 COMPILER V8.02 SUB 11/29/2006 17:29:51 PAGE 5
242 1 writedata(0xfd,8);// (选择写入数据)如果是网络到NT写入数据11111101/uoa-只有u接口有效置0
243 1 writedata(0x8f,8);// 如果是NT到网络写入数据10001111/
244 1
245 1 //WRITE BR1 M4接收数据寄存器
246 1 writedata(0x71,8);//先写入地址0111-0001
247 1 writedata(0xfd,8);// (选择写入数据)如果是网络到NT写入数据11111101/uoa-只有u接口有效置0
248 1 writedata(0x8f,8);// 如果是NT到网络写入数据10001111/
249 1
250 1 //WRITE BR2 M5与M6发送数据寄存器
251 1
252 1 writedata(0x72,8); //先写入地址0111-0010
253 1 writedata(0xf0,8); //b0-b3必须为0
254 1
255 1 //WRITE BR3 M5与M6接收数据寄存器
256 1
257 1 writedata(0x73,8); //先写入地址0111-0011
258 1 writedata(0xf0,8); //
259 1
260 1 //WRITE BR4 febe 计数器
261 1 //WRITE BR5 nebe 计数器
262 1 //WRITE BR6 loopback IDL2 控制
263 1 //WRITE BR7 IDL2 配置
264 1 //WRITE BR8 发送帧和模式控制
265 1 //WRITE BR9 主通道配置
266 1 //WRITE BR10 覆盖选择寄存器
267 1
268 1 //WRITE BR13 eco canceller测试寄存器
269 1 //WRITE BR14 测试寄存器
270 1 //WRITE BR15 校订数寄存器
271 1
272 1 }
273
274 /**********************读出各状态寄存器的信息的函数***************/
275 unsigned char read_statusReg()
276 {
277 1 unsigned char ddt;
278 1
279 1 //READ NR1 有效状态寄存器
280 1
281 1 //reaad BR1 and BR3
282 1
283 1 //READ BR11 有效状态寄存器
284 1
285 1 //READ BR12 有效状态测试寄存器
286 1
287 1 return(ddt);
288 1 }
289
290
291 //延时程序us和ms
292
293 void delayus(unsigned int a)//OSC-in用11.0592MHz
294 {
295 1 while(a--)
296 1 {
297 2 _nop_();//每一个nop指令周期为1us
298 2 }
299 1 }
300
301
302 void delayms(unsigned int b)//OSC-in用11.0592MHz
303 {
C51 COMPILER V8.02 SUB 11/29/2006 17:29:51 PAGE 6
304 1 unsigned int c;
305 1 while(b--)
306 1 {
307 2 for(c=0;c<1001;c++)//1000us=1ms
308 2 {
309 3 _nop_();
310 3 }
311 2 }
312 1 }
313
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 544 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 4
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -