📄 radiocontrol.lst
字号:
1 .file "radiocontrol.c"
2 .arch atmega128
3 __SREG__ = 0x3f
4 __SP_H__ = 0x3e
5 __SP_L__ = 0x3d
6 __tmp_reg__ = 0
7 __zero_reg__ = 1
8 .global __do_copy_data
9 .global __do_clear_bss
11 .text
12 .Ltext0:
75 .global start
76 .data
79 start:
80 0000 33 .byte 51
81 0001 CC .byte -52
82 .text
84 .global RadiocontrolIdle
86 RadiocontrolIdle:
1:radiocontrol.c **** /*
2:radiocontrol.c **** ****************************************************************************
3:radiocontrol.c **** *
4:radiocontrol.c **** * 宁波中科集成电路设计中心 版权所有 Copyright 2005
5:radiocontrol.c **** *
6:radiocontrol.c **** *文件名: Radiocontrol.c
7:radiocontrol.c **** *程序员:
8:radiocontrol.c **** *主要内容:射频通信物理层硬件控制
9:radiocontrol.c **** *完成日期:2005.5.25
10:radiocontrol.c **** ****************************************************************************
11:radiocontrol.c **** */
12:radiocontrol.c ****
13:radiocontrol.c **** #include "radiocontrol.h"
14:radiocontrol.c **** #include "physical.h"
15:radiocontrol.c **** #include "adc.h"
16:radiocontrol.c **** #include "fun.h"
17:radiocontrol.c **** #include "cc1000.h"
18:radiocontrol.c **** #include "mac.h"
19:radiocontrol.c **** #include "led.h"
20:radiocontrol.c **** #include "uartDebug.h"
21:radiocontrol.c ****
22:radiocontrol.c **** enum {
23:radiocontrol.c **** INIT,
24:radiocontrol.c **** SLEEP,
25:radiocontrol.c **** IDLE,
26:radiocontrol.c **** SYNC_START,
27:radiocontrol.c **** RECEIVE,
28:radiocontrol.c **** TRANSMIT
29:radiocontrol.c **** }; // 射频控制模块状态值
30:radiocontrol.c ****
31:radiocontrol.c **** enum {
32:radiocontrol.c **** SYNC_WORD = 0x33cc,
33:radiocontrol.c **** NSYNC_WORD = 0xcc33
34:radiocontrol.c **** };
35:radiocontrol.c ****
36:radiocontrol.c **** enum {
37:radiocontrol.c **** PREAMBLE_LEN = 18,
38:radiocontrol.c **** VALID_PRECURSOR = 5,
39:radiocontrol.c **** BUSY_THRESHOLD = 0xef, // 表示信道忙的RSSI门限值,值越小,信号强度越大
40:radiocontrol.c **** EW_THRESHOLD = 0x120, // 需要进行扩展监听的门限值
41:radiocontrol.c **** NUM_EXT_BYTES = 3
42:radiocontrol.c **** };
43:radiocontrol.c ****
44:radiocontrol.c **** uint8_t state; // 状态变量
45:radiocontrol.c **** uint16_t carrSenTime; // 载波监听次数
46:radiocontrol.c **** uint16_t csVal1; // 上次监听值
47:radiocontrol.c **** uint16_t csValAve; // 上次与本此监听平均值
48:radiocontrol.c **** uint8_t extFlag; // 载波监听扩展标识
49:radiocontrol.c **** uint8_t nextByte; // 缓存下一个要发送的字节
50:radiocontrol.c **** static uint8_t txCount; // 发送字节计数
51:radiocontrol.c ****
52:radiocontrol.c **** bool bManchesterBad;
53:radiocontrol.c **** bool bInvertRxData; // CC1000传来的数据是否反转
54:radiocontrol.c **** bool bRSSIEnable; // RSSI使能标识
55:radiocontrol.c ****
56:radiocontrol.c **** uint8_t PreambleCount; // 导频计数
57:radiocontrol.c **** uint8_t SOFCount; // 同步偏移计数
58:radiocontrol.c ****
59:radiocontrol.c **** union {
60:radiocontrol.c **** uint16_t W;
61:radiocontrol.c **** struct {
62:radiocontrol.c **** uint8_t LSB;
63:radiocontrol.c **** uint8_t MSB;
64:radiocontrol.c **** };
65:radiocontrol.c **** } RxShiftBuf; // 移位缓存,用于同步
66:radiocontrol.c ****
67:radiocontrol.c **** char start[2] = {0x33, 0xcc}; // 同步字节
68:radiocontrol.c **** uint8_t RxBitOffset; //同步结果,即偏移的比特数
69:radiocontrol.c ****
70:radiocontrol.c **** uint16_t LocalAddr;
71:radiocontrol.c ****
72:radiocontrol.c **** /*************************************************************************
73:radiocontrol.c **** *功能描述:射频控制模块初始化,CC1000、SPI初始化
74:radiocontrol.c **** *参数说明:无
75:radiocontrol.c **** *返回值: 成功
76:radiocontrol.c **** **************************************************************************/
77:radiocontrol.c **** result_t RadiocontrolInit()
78:radiocontrol.c **** {
79:radiocontrol.c **** // 状态变量初始化;
80:radiocontrol.c **** state = INIT;
81:radiocontrol.c **** OSH_MAKE_SPI_SCK_INPUT(); // SPI SCK为输入
82:radiocontrol.c **** CC1000ControlStdControlInit(); // CC1000初始化配置
83:radiocontrol.c **** CC1000ControlSelectLock(0x9); // CC1000PLL设置
84:radiocontrol.c **** bInvertRxData = CC1000ControlGetLOStatus(); // CC1000数据是否需要反转
85:radiocontrol.c ****
86:radiocontrol.c **** ADCBindPort(OS_ADC_CC_RSSI_PORT, OSH_ACTUAL_CC_RSSI_PORT);
87:radiocontrol.c **** ADCControlInit(); // 打开ADC RSSI通道
88:radiocontrol.c ****
89:radiocontrol.c **** RadiocontrolIdle();
90:radiocontrol.c ****
91:radiocontrol.c **** return SUCCESS;
92:radiocontrol.c **** }
93:radiocontrol.c ****
94:radiocontrol.c **** /*************************************************************************
95:radiocontrol.c **** *功能描述:射频控制进入空闲状态,CC1000、SPI进入接收状态
96:radiocontrol.c **** *参数说明:无
97:radiocontrol.c **** *返回值: 成功
98:radiocontrol.c **** **************************************************************************/
99:radiocontrol.c **** result_t RadiocontrolIdle()
100:radiocontrol.c **** {
88 .LM1:
89 /* prologue: frame size=0 */
90 /* prologue end (size=0) */
101:radiocontrol.c **** if (state == IDLE)
92 .LM2:
93 0000 8091 0000 lds r24,state
94 0004 8230 cpi r24,lo8(2)
95 0006 99F0 breq .L1
102:radiocontrol.c **** return SUCCESS;
103:radiocontrol.c **** if (state == SYNC_START) {
97 .LM3:
98 0008 8330 cpi r24,lo8(3)
99 000a 71F0 breq .L6
104:radiocontrol.c **** state = IDLE;
105:radiocontrol.c **** return SUCCESS;
106:radiocontrol.c **** }
107:radiocontrol.c **** if (state == SLEEP) { // 打开CC1000
101 .LM4:
102 000c 8130 cpi r24,lo8(1)
103 000e 19F4 brne .L4
108:radiocontrol.c **** CC1000ControlStdControlStart();
105 .LM5:
106 0010 0E94 0000 call CC1000ControlStdControlStart
107 0014 01C0 rjmp .L5
108 .L4:
109:radiocontrol.c **** } else {
110:radiocontrol.c **** * (volatile unsigned char *)(0x0D + 0x20) = 0x00; // 关SPI和SPI中断
110 .LM6:
111 0016 1DB8 out 45-0x20,__zero_reg__
112 .L5:
111:radiocontrol.c **** }
112:radiocontrol.c **** CC1000ControlRxMode(); // CC1000设为接收模式
114 .LM7:
115 0018 0E94 0000 call CC1000ControlRxMode
113:radiocontrol.c **** // 配置SPI为输入
114:radiocontrol.c **** OSH_MAKE_MISO_INPUT();
117 .LM8:
118 001c 0E94 0000 call OSH_MAKE_MISO_INPUT
115:radiocontrol.c **** OSH_MAKE_MOSI_INPUT();
120 .LM9:
121 0020 0E94 0000 call OSH_MAKE_MOSI_INPUT
116:radiocontrol.c **** * (volatile unsigned char *)(0x0D + 0x20) = 0xc0; // 开SPI和SPI中断
123 .LM10:
124 0024 80EC ldi r24,lo8(-64)
125 0026 8DB9 out 45-0x20,r24
126 .L6:
117:radiocontrol.c ****
118:radiocontrol.c **** state = IDLE;
128 .LM11:
129 0028 82E0 ldi r24,lo8(2)
130 002a 8093 0000 sts state,r24
131 .L1:
119:radiocontrol.c **** return SUCCESS;
120:radiocontrol.c **** }
133 .LM12:
134 002e 81E0 ldi r24,lo8(1)
135 0030 90E0 ldi r25,hi8(1)
136 /* epilogue: frame size=0 */
137 0032 0895 ret
138 /* epilogue end (size=1) */
139 /* function RadiocontrolIdle size 26 (25) */
142 .global RadiocontrolInit
144 RadiocontrolInit:
146 .LM13:
147 /* prologue: frame size=0 */
148 /* prologue end (size=0) */
150 .LM14:
151 0034 1092 0000 sts state,__zero_reg__
153 .LM15:
154 0038 0E94 0000 call OSH_MAKE_SPI_SCK_INPUT
156 .LM16:
157 003c 0E94 0000 call CC1000ControlStdControlInit
159 .LM17:
160 0040 89E0 ldi r24,lo8(9)
161 0042 0E94 0000 call CC1000ControlSelectLock
163 .LM18:
164 0046 0E94 0000 call CC1000ControlGetLOStatus
165 004a 8093 0000 sts bInvertRxData,r24
167 .LM19:
168 004e 60E0 ldi r22,lo8(0)
169 0050 862F mov r24,r22
170 0052 0E94 0000 call ADCBindPort
172 .LM20:
173 0056 0E94 0000 call ADCControlInit
175 .LM21:
176 005a 0E94 0000 call RadiocontrolIdle
178 .LM22:
179 005e 81E0 ldi r24,lo8(1)
180 0060 90E0 ldi r25,hi8(1)
181 /* epilogue: frame size=0 */
182 0062 0895 ret
183 /* epilogue end (size=1) */
184 /* function RadiocontrolInit size 24 (23) */
187 .global RadiocontrolSleep
189 RadiocontrolSleep:
121:radiocontrol.c ****
122:radiocontrol.c **** /*************************************************************************
123:radiocontrol.c **** *功能描述:射频控制进入睡眠状态,CC1000、SPI进入关闭状态
124:radiocontrol.c **** *参数说明:无
125:radiocontrol.c **** *返回值: 成功
126:radiocontrol.c **** **************************************************************************/
127:radiocontrol.c **** result_t RadiocontrolSleep()
128:radiocontrol.c **** {
191 .LM23:
192 /* prologue: frame size=0 */
193 /* prologue end (size=0) */
129:radiocontrol.c **** if (state == SLEEP)
195 .LM24:
196 0064 8091 0000 lds r24,state
197 0068 8130 cpi r24,lo8(1)
198 006a 31F0 breq .L8
130:radiocontrol.c **** return SUCCESS;
131:radiocontrol.c **** * (volatile unsigned char *)(0x0D + 0x20) = 0x00; // 关SPI和SPI中断
200 .LM25:
201 006c 1DB8 out 45-0x20,__zero_reg__
132:radiocontrol.c **** CC1000ControlStdControlStop(); // 关CC1000
203 .LM26:
204 006e 0E94 0000 call CC1000ControlStdControlStop
133:radiocontrol.c ****
134:radiocontrol.c **** state = SLEEP;
206 .LM27:
207 0072 81E0 ldi r24,lo8(1)
208 0074 8093 0000 sts state,r24
209 .L8:
135:radiocontrol.c **** return SUCCESS;
136:radiocontrol.c **** }
211 .LM28:
212 0078 81E0 ldi r24,lo8(1)
213 007a 90E0 ldi r25,hi8(1)
214 /* epilogue: frame size=0 */
215 007c 0895 ret
216 /* epilogue end (size=1) */
217 /* function RadiocontrolSleep size 13 (12) */
221 .global RadiocontrolCarrierSenseStart
223 RadiocontrolCarrierSenseStart:
137:radiocontrol.c ****
138:radiocontrol.c **** /*************************************************************************
139:radiocontrol.c **** *功能描述:设置载波监听的比特数(实际监听为字节数,因为每次监听的ADC调用由一
140:radiocontrol.c **** * 次SPI中断调用引发,故一次监听为一个字节的RSSI),
141:radiocontrol.c **** *参数说明:要监听的位数
142:radiocontrol.c **** *返回值: 成功
143:radiocontrol.c **** **************************************************************************/
144:radiocontrol.c **** result_t RadiocontrolCarrierSenseStart(uint16_t numBits)
145:radiocontrol.c **** {
225 .LM29:
226 /* prologue: frame size=0 */
227 /* prologue end (size=0) */
228 007e 9C01 movw r18,r24
146:radiocontrol.c **** if (state != IDLE) // 只有空闲时才允许监听
230 .LM30:
231 0080 8091 0000 lds r24,state
232 0084 8230 cpi r24,lo8(2)
233 0086 19F0 breq .L11
147:radiocontrol.c **** return FAIL;
235 .LM31:
236 0088 80E0 ldi r24,lo8(0)
237 008a 90E0 ldi r25,hi8(0)
238 008c 0895 ret
239 .L11:
148:radiocontrol.c **** extFlag = 0;
241 .LM32:
242 008e 1092 0000 sts extFlag,__zero_reg__
149:radiocontrol.c **** carrSenTime = numBits >> 3; // 转化为字节数
244 .LM33:
245 0092 83E0 ldi r24,3
246 0094 3695 1: lsr r19
247 0096 2795 ror r18
248 0098 8A95 dec r24
249 009a E1F7 brne 1b
250 009c 3093 0000 sts (carrSenTime)+1,r19
251 00a0 2093 0000 sts carrSenTime,r18
150:radiocontrol.c **** csVal1 = 0x180;
253 .LM34:
254 00a4 80E8 ldi r24,lo8(384)
255 00a6 91E0 ldi r25,hi8(384)
256 00a8 9093 0000 sts (csVal1)+1,r25
257 00ac 8093 0000 sts csVal1,r24
151:radiocontrol.c **** return SUCCESS;
259 .LM35:
260 00b0 81E0 ldi r24,lo8(1)
261 00b2 90E0 ldi r25,hi8(1)
152:radiocontrol.c **** }
263 .LM36:
264 00b4 0895 ret
265 /* epilogue: frame size=0 */
266 00b6 0895 ret
267 /* epilogue end (size=1) */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -