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

📄 radiocontrol.lst

📁 adhoc信息节点程序源代码(点对多点)——for atmega128
💻 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:
  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 + -