📄 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:
93 .data
96 start:
97 0000 33 .byte 51
98 0001 CC .byte -52
99 .text
101 .global RadiocontrolIdle
103 RadiocontrolIdle:
1:radiocontrol.c **** /*
2:radiocontrol.c **** ****************************************************************************
3:radiocontrol.c **** * 宁波中科集成电路设计中心 版权所有 Copyright 2005
4:radiocontrol.c **** * http:\\www.nbicc.com
5:radiocontrol.c **** *文件名: radiocontrol.c
6:radiocontrol.c **** *程序员: 夏鹏 xpsonny@nbicc.com
7:radiocontrol.c **** *主要内容 射频通信物理层硬件控制
8:radiocontrol.c ****
9:radiocontrol.c **** *如有问题或BUG,请登录www.wsn.net.cn 提问或用邮件和作者联系
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 ****
20:radiocontrol.c **** enum {
21:radiocontrol.c **** INIT,
22:radiocontrol.c **** SLEEP,
23:radiocontrol.c **** IDLE,
24:radiocontrol.c **** SYNC_START,
25:radiocontrol.c **** RECEIVE,
26:radiocontrol.c **** TRANSMIT
27:radiocontrol.c **** }; // 射频控制模块状态值
28:radiocontrol.c ****
29:radiocontrol.c **** enum {
30:radiocontrol.c **** SYNC_WORD = 0x33cc,
31:radiocontrol.c **** NSYNC_WORD = 0xcc33
32:radiocontrol.c **** };
33:radiocontrol.c ****
34:radiocontrol.c **** enum {
35:radiocontrol.c **** PREAMBLE_LEN = 18,
36:radiocontrol.c **** VALID_PRECURSOR = 5,
37:radiocontrol.c **** BUSY_THRESHOLD = 0xef, // 表示信道忙的RSSI门限值,值越小,信号强度越大
38:radiocontrol.c **** EW_THRESHOLD = 0x120, // 需要进行扩展监听的门限值
39:radiocontrol.c **** NUM_EXT_BYTES = 3
40:radiocontrol.c **** };
41:radiocontrol.c **** #define DIFS 8 // 空闲监听间隔
42:radiocontrol.c **** //#define SIFS 1 // CTS,DATA,ACK包之前
43:radiocontrol.c **** //#define EIFS 10 // 802.11在接收到错误帧后的重新监听间隔
44:radiocontrol.c **** #define SLOTTIME 1 // MAC层竞争窗口时隙长度
45:radiocontrol.c **** #define DATA_CW 31 // 数据帧退避窗口最大值
46:radiocontrol.c **** //#define GUARDTIME 5
47:radiocontrol.c **** #define LISTEN_RATE 24
48:radiocontrol.c **** static uint8_t state; // 状态变量
49:radiocontrol.c **** static uint16_t carrSenTime; // 载波监听次数
50:radiocontrol.c **** static uint16_t backofftime; //退避时间
51:radiocontrol.c **** static uint8_t idlecount; //空闲计数
52:radiocontrol.c **** static uint8_t sendslot;
53:radiocontrol.c **** static uint16_t csVal1; // 上次监听值
54:radiocontrol.c **** static uint16_t csValAve; // 上次与本此监听平均值
55:radiocontrol.c **** //static uint8_t extFlag; // 载波监听扩展标识
56:radiocontrol.c **** static uint8_t nextByte; // 缓存下一个要发送的字节
57:radiocontrol.c **** static uint8_t txCount; // 发送字节计数
58:radiocontrol.c ****
59:radiocontrol.c **** static bool bManchesterBad;
60:radiocontrol.c **** static bool bInvertRxData; // CC1000传来的数据是否反转
61:radiocontrol.c **** //static bool bRSSIEnable; // RSSI使能标识
62:radiocontrol.c ****
63:radiocontrol.c **** static uint8_t PreambleCount; // 导频计数
64:radiocontrol.c **** static uint8_t SOFCount; // 同步偏移计数
65:radiocontrol.c ****
66:radiocontrol.c **** union {
67:radiocontrol.c **** uint16_t W;
68:radiocontrol.c **** struct {
69:radiocontrol.c **** uint8_t LSB;
70:radiocontrol.c **** uint8_t MSB;
71:radiocontrol.c **** };
72:radiocontrol.c **** } RxShiftBuf; // 移位缓存,用于同步
73:radiocontrol.c ****
74:radiocontrol.c **** static char start[2] = {0x33, 0xcc}; // 同步字节
75:radiocontrol.c **** static uint8_t RxBitOffset; //同步结果,即偏移的比特数
76:radiocontrol.c ****
77:radiocontrol.c **** //static uint16_t LocalAddr;
78:radiocontrol.c ****
79:radiocontrol.c **** /*************************************************************************
80:radiocontrol.c **** *功能描述:射频控制模块初始化,CC1000、SPI 初始化
81:radiocontrol.c **** *参数说明:无
82:radiocontrol.c **** *返回值: 成功
83:radiocontrol.c **** **************************************************************************/
84:radiocontrol.c **** result_t RadiocontrolInit()
85:radiocontrol.c **** {
86:radiocontrol.c **** // 状态变量初始化;
87:radiocontrol.c **** state = INIT;
88:radiocontrol.c **** backofftime = 0;
89:radiocontrol.c **** carrSenTime = 0;
90:radiocontrol.c **** idlecount = 0;
91:radiocontrol.c **** sendslot = 0;
92:radiocontrol.c **** OSH_MAKE_SPI_SCK_INPUT(); // SPI SCK为输入
93:radiocontrol.c **** CC1000ControlStdControlInit(); // CC1000初始化配置
94:radiocontrol.c **** CC1000ControlSelectLock(0x9); // CC1000PLL设置
95:radiocontrol.c **** bInvertRxData = CC1000ControlGetLOStatus(); // CC1000数据是否需要反转
96:radiocontrol.c ****
97:radiocontrol.c **** ADCBindPort(OS_ADC_CC_RSSI_PORT, OSH_ACTUAL_CC_RSSI_PORT);
98:radiocontrol.c **** ADCControlInit(); // 打开ADC RSSI通道
99:radiocontrol.c ****
100:radiocontrol.c **** RadiocontrolIdle();
101:radiocontrol.c ****
102:radiocontrol.c **** return SUCCESS;
103:radiocontrol.c **** }
104:radiocontrol.c ****
105:radiocontrol.c **** /*************************************************************************
106:radiocontrol.c **** *功能描述:射频控制进入空闲状态,CC1000、SPI进入接收状态
107:radiocontrol.c **** *参数说明:无
108:radiocontrol.c **** *返回值: 成功
109:radiocontrol.c **** **************************************************************************/
110:radiocontrol.c **** result_t RadiocontrolIdle()
111:radiocontrol.c **** {
105 .LM1:
106 /* prologue: frame size=0 */
107 /* prologue end (size=0) */
112:radiocontrol.c **** if (state == IDLE)
109 .LM2:
110 0000 8091 0000 lds r24,state
111 0004 8230 cpi r24,lo8(2)
112 0006 99F0 breq .L1
113:radiocontrol.c **** return SUCCESS;
114:radiocontrol.c **** if (state == SYNC_START) {
114 .LM3:
115 0008 8330 cpi r24,lo8(3)
116 000a 71F0 breq .L6
115:radiocontrol.c **** state = IDLE;
116:radiocontrol.c **** return SUCCESS;
117:radiocontrol.c **** }
118:radiocontrol.c **** if (state == SLEEP) { // 打开CC1000
118 .LM4:
119 000c 8130 cpi r24,lo8(1)
120 000e 19F4 brne .L4
119:radiocontrol.c **** CC1000ControlStdControlStart();
122 .LM5:
123 0010 0E94 0000 call CC1000ControlStdControlStart
124 0014 01C0 rjmp .L5
125 .L4:
120:radiocontrol.c **** } else {
121:radiocontrol.c **** * (volatile unsigned char *)(0x0D + 0x20) = 0x00; // 关SPI和SPI中断
127 .LM6:
128 0016 1DB8 out 45-0x20,__zero_reg__
129 .L5:
122:radiocontrol.c **** }
123:radiocontrol.c **** CC1000ControlRxMode(); // CC1000设为接收模式
131 .LM7:
132 0018 0E94 0000 call CC1000ControlRxMode
124:radiocontrol.c **** // 配置SPI为输入
125:radiocontrol.c **** OSH_MAKE_MISO_INPUT();
134 .LM8:
135 001c 0E94 0000 call OSH_MAKE_MISO_INPUT
126:radiocontrol.c **** OSH_MAKE_MOSI_INPUT();
137 .LM9:
138 0020 0E94 0000 call OSH_MAKE_MOSI_INPUT
127:radiocontrol.c **** * (volatile unsigned char *)(0x0D + 0x20) = 0xc0; // 开SPI和SPI中断
140 .LM10:
141 0024 80EC ldi r24,lo8(-64)
142 0026 8DB9 out 45-0x20,r24
143 .L6:
128:radiocontrol.c ****
129:radiocontrol.c **** state = IDLE;
145 .LM11:
146 0028 82E0 ldi r24,lo8(2)
147 002a 8093 0000 sts state,r24
148 .L1:
130:radiocontrol.c **** return SUCCESS;
131:radiocontrol.c **** }
150 .LM12:
151 002e 81E0 ldi r24,lo8(1)
152 0030 90E0 ldi r25,hi8(1)
153 /* epilogue: frame size=0 */
154 0032 0895 ret
155 /* epilogue end (size=1) */
156 /* function RadiocontrolIdle size 26 (25) */
159 .global RadiocontrolInit
161 RadiocontrolInit:
163 .LM13:
164 /* prologue: frame size=0 */
165 /* prologue end (size=0) */
167 .LM14:
168 0034 1092 0000 sts state,__zero_reg__
170 .LM15:
171 0038 1092 0000 sts (backofftime)+1,__zero_reg__
172 003c 1092 0000 sts backofftime,__zero_reg__
174 .LM16:
175 0040 1092 0000 sts (carrSenTime)+1,__zero_reg__
176 0044 1092 0000 sts carrSenTime,__zero_reg__
178 .LM17:
179 0048 1092 0000 sts idlecount,__zero_reg__
181 .LM18:
182 004c 1092 0000 sts sendslot,__zero_reg__
184 .LM19:
185 0050 0E94 0000 call OSH_MAKE_SPI_SCK_INPUT
187 .LM20:
188 0054 0E94 0000 call CC1000ControlStdControlInit
190 .LM21:
191 0058 89E0 ldi r24,lo8(9)
192 005a 0E94 0000 call CC1000ControlSelectLock
194 .LM22:
195 005e 0E94 0000 call CC1000ControlGetLOStatus
196 0062 8093 0000 sts bInvertRxData,r24
198 .LM23:
199 0066 60E0 ldi r22,lo8(0)
200 0068 862F mov r24,r22
201 006a 0E94 0000 call ADCBindPort
203 .LM24:
204 006e 0E94 0000 call ADCControlInit
206 .LM25:
207 0072 0E94 0000 call RadiocontrolIdle
209 .LM26:
210 0076 81E0 ldi r24,lo8(1)
211 0078 90E0 ldi r25,hi8(1)
212 /* epilogue: frame size=0 */
213 007a 0895 ret
214 /* epilogue end (size=1) */
215 /* function RadiocontrolInit size 36 (35) */
218 .global RadiocontrolSleep
220 RadiocontrolSleep:
132:radiocontrol.c ****
133:radiocontrol.c **** /*************************************************************************
134:radiocontrol.c **** *功能描述:射频控制进入睡眠状态,CC1000、SPI进入关闭状态
135:radiocontrol.c **** *参数说明:无
136:radiocontrol.c **** *返回值: 成功
137:radiocontrol.c **** **************************************************************************/
138:radiocontrol.c ****
139:radiocontrol.c **** result_t RadiocontrolSleep()
140:radiocontrol.c **** {
222 .LM27:
223 /* prologue: frame size=0 */
224 /* prologue end (size=0) */
141:radiocontrol.c **** if (state == SLEEP)
226 .LM28:
227 007c 8091 0000 lds r24,state
228 0080 8130 cpi r24,lo8(1)
229 0082 31F0 breq .L8
142:radiocontrol.c **** return SUCCESS;
143:radiocontrol.c **** * (volatile unsigned char *)(0x0D + 0x20) = 0x00; // 关SPI和SPI中断
231 .LM29:
232 0084 1DB8 out 45-0x20,__zero_reg__
144:radiocontrol.c **** CC1000ControlStdControlStop(); // 关CC1000
234 .LM30:
235 0086 0E94 0000 call CC1000ControlStdControlStop
145:radiocontrol.c ****
146:radiocontrol.c **** state = SLEEP;
237 .LM31:
238 008a 81E0 ldi r24,lo8(1)
239 008c 8093 0000 sts state,r24
240 .L8:
147:radiocontrol.c **** return SUCCESS;
148:radiocontrol.c **** }
242 .LM32:
243 0090 81E0 ldi r24,lo8(1)
244 0092 90E0 ldi r25,hi8(1)
245 /* epilogue: frame size=0 */
246 0094 0895 ret
247 /* epilogue end (size=1) */
248 /* function RadiocontrolSleep size 13 (12) */
252 .global RadiocontrolCarrierSenseStart
254 RadiocontrolCarrierSenseStart:
149:radiocontrol.c ****
150:radiocontrol.c **** /*************************************************************************
151:radiocontrol.c **** *功能描述:设置载波监听的比特数(实际监听为字节数,因为每次监听的ADC调用由一
152:radiocontrol.c **** * 次SPI中断调用引发,故一次监听为一个字节的RSSI),
153:radiocontrol.c **** *参数说明:要监听的位数
154:radiocontrol.c **** *返回值: 成功
155:radiocontrol.c **** **************************************************************************/
156:radiocontrol.c **** result_t RadiocontrolCarrierSenseStart(uint16_t numBits)
157:radiocontrol.c **** {
256 .LM33:
257 /* prologue: frame size=0 */
258 /* prologue end (size=0) */
259 0096 9C01 movw r18,r24
158:radiocontrol.c **** uint8_t random;
159:radiocontrol.c **** if (state != IDLE) // 只有空闲时才允许监听
261 .LM34:
262 0098 8091 0000 lds r24,state
263 009c 8230 cpi r24,lo8(2)
264 009e 19F0 breq .L11
160:radiocontrol.c **** return FAIL;
266 .LM35:
267 00a0 80E0 ldi r24,lo8(0)
268 00a2 90E0 ldi r25,hi8(0)
269 00a4 0895 ret
270 .L11:
161:radiocontrol.c ****
162:radiocontrol.c **** carrSenTime = numBits >> 3; // 转化为字节数
272 .LM36:
273 00a6 43E0 ldi r20,3
274 00a8 3695 1: lsr r19
275 00aa 2795 ror r18
276 00ac 4A95 dec r20
277 00ae E1F7 brne 1b
278 00b0 3093 0000 sts (carrSenTime)+1,r19
279 00b4 2093 0000 sts carrSenTime,r18
163:radiocontrol.c **** random = RandomLFSRGen() % (uint16_t)DATA_CW;
281 .LM37:
282 00b8 0E94 0000 call RandomLFSRGen
283 00bc 6FE1 ldi r22,lo8(31)
284 00be 70E0 ldi r23,hi8(31)
285 00c0 0E94 0000 call __udivmodhi4
164:radiocontrol.c **** backofftime = ((SLOTTIME * random * LISTEN_RATE)>>3) + 2;
287 .LM38:
288 00c4 98E1 ldi r25,lo8(24)
289 00c6 899F mul r24,r25
290 00c8 C001 movw r24,r0
291 00ca 1124 clr r1
292 00cc 23E0 ldi r18,3
293 00ce 9595 1: asr r25
294 00d0 8795 ror r24
295 00d2 2A95 dec r18
296 00d4 E1F7 brne 1b
297 00d6 0296 adiw r24,2
298 00d8 9093 0000 sts (backofftime)+1,r25
299 00dc 8093 0000 sts backofftime,r24
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -