⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 radiocontrol.lst

📁 一个WSN的树状路由,对于那些学WSN路由方面的朋友应该有说帮助.
💻 LST
📖 第 1 页 / 共 3 页
字号:
   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 + -