📄 new_download.lst
字号:
C51 COMPILER V8.08 NEW_DOWNLOAD 08/06/2008 15:58:38 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE NEW_DOWNLOAD
OBJECT MODULE PLACED IN new_download.OBJ
COMPILER INVOKED BY: C:\Program Files\Keil\C51\BIN\C51.EXE new_download.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <Reg52.h>
2 #include <absacc.h>
3 #include <stdio.h>
4 #include <intrins.h>
5
6 //#define DATA
7
8 #include "dsp_boot_code.h"
9 #include "dsp_code.h"
10
11 #ifdef DATA
#include "dsp_data.h"
#endif
14
15 /* 定义宏 */
16 #define uint16 unsigned short
17 #define uint8 unsigned char
18 #define int16 short
19 #define int8 char
20
21 #define VOL1 0x81
22 #define VOL2 0x82
23
24 /* TLV320AIC23寄存器地址 */
25 #define L_LINE_VOLUME 0x00 // 左线输入通道音量控制寄存器
26 #define R_LINE_VOLUME 0x01 // 右线输入通道音量控制寄存器
27 #define L_HEADPHONE_VOLUME 0x02 // 左通道耳机音量控制寄存器
28 #define R_HEADPHONE_VOLUME 0x03 // 右通道耳机音量控制寄存器
29 #define A_AUDIO_PATH 0x04
30 #define D_AUDIO_PATH 0x05
31 #define POWER_CON 0x06
32 #define D_AUDIO_INTERFACE 0x07
33 #define SAMPLE_RATE 0x08
34 #define D_INTERFACE_ACT 0x09
35 #define RESET 0x0f
36
37 /* 定义寄存器端口地址
38 ---------------------------------------------------------------
39 A15 A14 A13 A12 A11 A10 A9 A8
40 ---------------------------------------------------------------
41 X X X nHCS HR/nW HCNTL1 HCNTL0 HBIL
42 ---------------------------------------------------------------*/
43 #define WR_HPICL XBYTE[0xe000]
44 #define WR_HPICH XBYTE[0xe100]
45 #define WR_HPID0L XBYTE[0xe200] // HCNTL0 = 0,HCNTL0 = 1,每写1次,HPIA事先增1
46 #define WR_HPID0H XBYTE[0xe300]
47 #define WR_HPIAL XBYTE[0xe400] // 只代表第一个字节,先高字节还是低字节由BOB位来决定
48 #define WR_HPIAH XBYTE[0xe500]
49 #define WR_HPID1L XBYTE[0xe600] // HCNTL0 = 1,HCNTL0 = 1,HPIA寄存器不受影响
50 #define WR_HPID1H XBYTE[0xe700]
51
52 #define RD_HPID0L XBYTE[0xeA00] // HCNTL0 = 0,HCNTL0 = 1,每读1次,HPIA事后增1
53 #define RD_HPID0H XBYTE[0xeB00]
54 #define RD_HPID1L XBYTE[0xeE00] // HCNTL0 = 1,HCNTL0 = 1,HPIA寄存器不受影响
55 #define RD_HPID1H XBYTE[0xeF00]
C51 COMPILER V8.08 NEW_DOWNLOAD 08/06/2008 15:58:38 PAGE 2
56
57 #define WR_CR XBYTE[0x7100]
58 #define WR_PARA XBYTE[0x7000]
59
60 // Addresses used for hand-shaking flags
61 #define DSP_READY 0x0300
62 #define PROG_BUF_READY DSP_READY + 1
63 #define DATA_BUF_READY DSP_READY + 2
64 #define COPY_DONE DSP_READY + 3
65 #define PMST_VAL DSP_READY + 4
66
67 // Boot buffer address
68 #define BOOT_BUF_START 0x0400
69
70 #define APP_PROG 0
71 #define APP_DATA 1
72
73 sbit DSPRST = P1^2;
74 sbit NETRST = P1^3;
75 sbit USBRST = P1^4;
76 sbit LCDRST = P1^5;
77
78 sbit CS = P3^3; // SPI
79 sbit SDIN = P3^4;
80 sbit SCLK = P3^5;
81
82 bit ok,readT,key_down;
83 unsigned char time,stoptime,ms,DSPorder;
84 unsigned char volume;
85
86 void wr_dsp_code(void);
87 void delay(uint16 wu);
88 void load_dsp_prog(void);
89 void init_51(void);
90 void init_aic23(void);
91 void write_aic23(uint8 addr, uint16 dat);
92 void dsp_rst(void);
93 void usb_rst(void);
94 void lcd_rst(void);
95 void net_rst(void);
96 unsigned char rd_hpi(uint16 addr);
97 unsigned char getDSP();
98
99 int main(void)
100 {
101 1 init_aic23();
102 1
103 1 delay(10000);
104 1 net_rst();
105 1 dsp_rst();
106 1 lcd_rst();
107 1 usb_rst();
108 1 load_dsp_prog();
109 1 init_51();
110 1
111 1 delay(30000);
112 1 volume = 108;
113 1 write_aic23(L_HEADPHONE_VOLUME, 0x0180+volume);
114 1
115 1 while(1);
116 1
117 1 return 0;
C51 COMPILER V8.08 NEW_DOWNLOAD 08/06/2008 15:58:38 PAGE 3
118 1 }
119
120 void delay(uint16 wu)
121 {
122 1 for (wu; wu > 0; wu--);
123 1 }
124
125 void lcd_rst(void)
126 {
127 1 LCDRST = 0;
128 1 delay(200);
129 1 LCDRST = 1;
130 1 delay(200);
131 1 }
132
133 void dsp_rst(void)
134 {
135 1 DSPRST = 0;
136 1 delay(200);
137 1 DSPRST = 1;
138 1 delay(200);
139 1 }
140
141 void usb_rst(void)
142 {
143 1 USBRST = 0;
144 1 delay(200);
145 1 USBRST = 1;
146 1 delay(200);
147 1 }
148
149 void net_rst(void)
150 {
151 1 NETRST = 1;
152 1 delay(200);
153 1 NETRST = 0;
154 1 delay(200);
155 1 }
156
157 void load_dsp_prog(void)
158 {
159 1 wr_dsp_code();
160 1 }
161 /*
162 unsigned char rd_hpi(uint16 addr)
163 {
164 int16 i;
165 WR_HPIAL = addr / 256;
166 WR_HPIAH = addr % 256;
167 i = RD_HPID0L;
168 i = (i << 8) | RD_HPID0H;
169 return(i);
170 }
171
172 void wr_hpi(uint16 addr, uint16 dat)
173 {
174 WR_HPIAL = addr / 256;
175 WR_HPIAH = addr % 256;
176 WR_HPID1L = dat / 256;
177 WR_HPID1H = dat % 256;
178 }
179 */
C51 COMPILER V8.08 NEW_DOWNLOAD 08/06/2008 15:58:38 PAGE 4
180 void wr_dsp_code(void)
181 {
182 1 const uint16 *dspptr, *temp;
183 1 uint16 len;
184 1 uint16 addr;
185 1 uint8 i, correct, app_stage;
186 1
187 1 //console_init();
188 1 //aic23_init();
189 1
190 1 printf("HPI boot begins...\n");
191 1
192 1 WR_HPICL = 0x08; // clear HPIint,least is first BOB = 0,第1字节为高字节
193 1 WR_HPICH = 0x08; // HPIC是16位寄存器,主机写HPIC,第一字节与第二字节内容必须相同
194 1
195 1 // 第一阶段
196 1 dspptr = dsp_boot_program;
197 1 printf("The first stage:Load DSP boot program.\n");
198 1
199 1 len = *dspptr++;
200 1
201 1 while(len != 0) // 第一个字节表示数据长度(字节数),第二、三字节表示起始地址,高位字节在前
202 1 {
203 2 addr = *dspptr++;
204 2 temp = dspptr; // dspptr已经指向了准备写入的len长度的数据的首字节,将该地址保存起来
205 2
206 2 addr--; // HCNTL0 = 0,HCNTL0 = 1,每写1次,HPIA事先增1
207 2 WR_HPIAL = addr / 256; // 256 = 0x100,BOB = 0,第1字节为高字节,地址高8位
208 2 WR_HPIAH = addr % 256; // 地址低8位
209 2
210 2 for (i = 0; i < len; i++)
211 2 {
212 3 WR_HPID0L = *dspptr / 256; // 第一字节,16位数据高8位
213 3 WR_HPID0H = *dspptr % 256; // 第二字节,16位数据低8位
214 3
215 3 dspptr++;
216 3 }
217 2
218 2 dspptr = temp; // 指针回到刚刚写完的len长度数据的首字节,以便读出进行校验
219 2
220 2 addr++; // HCNTL0 = 0,HCNTL0 = 1,每读1次,HPIA事后增1
221 2 WR_HPIAL = addr / 256;
222 2 WR_HPIAH = addr % 256;
223 2
224 2 for (i = 0; i < len; i++)
225 2 {
226 3 if (RD_HPID0L != *dspptr / 256) // 写入的数据不等于读出的数据
227 3 {
228 4 dspptr = temp - 2; // 将dspptr指回到该len长度的首字节,以便重新写该len长度的数据
229 4 printf("Error occurs!\n");
230 4 break;
231 4 }
232 3
233 3 if (RD_HPID0H != *dspptr % 256)
234 3 {
235 4 dspptr = temp - 2;
236 4 printf("Error occurs!\n");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -