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

📄 fun.c

📁 基于cc1000和avr128处理器的指定路由多跳网络的试验程序
💻 C
字号:
/*
****************************************************************************
*              宁波中科集成电路设计中心  版权所有 Copyright 2005
*						http:\\www.nbicc.com
*文件名:  fun.c
*程序员:  夏鹏		xpsonny@nbicc.com
*主要内容:常用函数
*
*如有问题或BUG,请登录www.wsn.net.cn 提问或用邮件和作者联系
****************************************************************************
*/

#include "fun.h"
#include "os.h"
#include "global.h"
//extern uint8_t  OS_LOCAL_ADDRESS;

	/*uint16_t __attribute((__progmem__)) crcTable[256] = { 
		0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 
		0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 
		0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 
		0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 
		0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, 
		0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, 
		0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, 
		0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 
		0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, 
		0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, 
		0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 
		0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, 
		0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 
		0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 
		0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, 
		0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, 
		0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, 
		0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, 
		0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 
		0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, 
		0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, 
		0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 
		0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, 
		0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, 
		0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, 
		0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, 
		0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, 
		0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 
		0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 
		0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 
		0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 
		0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 };
		*/
	
static uint16_t RandomLFSR_shiftReg;
static uint16_t RandomLFSR_initSeed;
static uint16_t RandomLFSR_mask;
	
static bool HPLPowerManagementM_disabled = TRUE;
	
	enum {
		HPLPowerManagementM_IDLE = 0, 
			HPLPowerManagementM_ADC_NR = 1 << 3, 
			HPLPowerManagementM_POWER_DOWN = 1 << 4, 
			HPLPowerManagementM_POWER_SAVE = (1 << 3) + (1 << 4), 
			HPLPowerManagementM_STANDBY = (1 << 2) + (1 << 4), 
			HPLPowerManagementM_EXT_STANDBY = (1 << 3) + (1 << 4) + (1 << 2)
	};
	
	void OSH_SET_GREEN_LED_PIN(void)
	{
		* (volatile unsigned char *)(0x1B + 0x20) |= 1 << 1;
	}
	
	void OSH_SET_YELLOW_LED_PIN(void)
	{
		* (volatile unsigned char *)(0x1B + 0x20) |= 1 << 0;
	}
	
	void OSH_SET_RED_LED_PIN(void)
	{
		* (volatile unsigned char *)(0x1B + 0x20) |= 1 << 2;
	}
	
	void OSH_SET_FLASH_SELECT_PIN(void)
	{
		* (volatile unsigned char *)(0x1B + 0x20) |= 1 << 3;
	}
	
	void OSH_MAKE_FLASH_CLK_OUTPUT(void)
	{
		* (volatile unsigned char *)(0x11 + 0x20) |= 1 << 5;
	}
	
	void OSH_MAKE_FLASH_OUT_OUTPUT(void)
	{
		* (volatile unsigned char *)(0x11 + 0x20) |= 1 << 3;
	}
	
	void OSH_MAKE_FLASH_SELECT_OUTPUT(void)
	{
		* (volatile unsigned char *)(0x1A + 0x20) |= 1 << 3;
	}
	
	void OSH_CLR_SERIAL_ID_PIN(void)
	{
		* (volatile unsigned char *)(0x1B + 0x20) &= ~(1 << 4);
	}
	
	void OSH_MAKE_SERIAL_ID_INPUT(void)
	{
		* (volatile unsigned char *)(0x1A + 0x20) &= ~(1 << 4);
	}
	
	void OSH_MAKE_SPI_OC1C_INPUT(void)
	{
		* (volatile unsigned char *)(0x17 + 0x20) &= ~(1 << 7);
	}
	
	void OSH_MAKE_MISO_INPUT(void)
	{
		* (volatile unsigned char *)(0x17 + 0x20) &= ~(1 << 3);
	}
	
	void OSH_MAKE_CC_PCLK_OUTPUT(void)
	{
		* (volatile unsigned char *)(0x11 + 0x20) |= 1 << 6;
	}
	
	void OSH_MAKE_CC_PDATA_OUTPUT(void)
	{
		* (volatile unsigned char *)(0x11 + 0x20) |= 1 << 7;
	}
	
	void OSH_MAKE_CC_PALE_OUTPUT(void)
	{
		* (volatile unsigned char *)(0x11 + 0x20) |= 1 << 4;
	}
	
	void OSH_MAKE_PW0_OUTPUT(void)
	{
		* (volatile unsigned char *)(0x14 + 0x20) |= 1 << 0;
	}
	
	void OSH_MAKE_PW1_OUTPUT(void)
	{
		* (volatile unsigned char *)(0x14 + 0x20) |= 1 << 1;
	}
	
	void OSH_MAKE_PW2_OUTPUT(void)
	{
		* (volatile unsigned char *)(0x14 + 0x20) |= 1 << 2;
	}
	
	void OSH_MAKE_PW3_OUTPUT(void)
	{
		* (volatile unsigned char *)(0x14 + 0x20) |= 1 << 3;
	}
	
	void OSH_MAKE_PW4_OUTPUT(void)
	{
		* (volatile unsigned char *)(0x14 + 0x20) |= 1 << 4;
	}
	
	void OSH_MAKE_PW5_OUTPUT(void)
	{
		* (volatile unsigned char *)(0x14 + 0x20) |= 1 << 5;
	}
	
	void OSH_MAKE_PW6_OUTPUT(void)
	{
		* (volatile unsigned char *)(0x14 + 0x20) |= 1 << 6;
	}
	
	void OSH_MAKE_PW7_OUTPUT(void)
	{
		* (volatile unsigned char *)(0x14 + 0x20) |= 1 << 7;
	}
	
	void OSH_MAKE_CC_CHP_OUT_INPUT(void)
	{
		* (volatile unsigned char *)(0x1A + 0x20) &= ~(1 << 6);
	}
	
	void OSH_MAKE_GREEN_LED_OUTPUT(void)
	{
		* (volatile unsigned char *)(0x1A + 0x20) |= 1 << 1;
	}
	
	void OSH_MAKE_YELLOW_LED_OUTPUT(void)
	{
		* (volatile unsigned char *)(0x1A + 0x20) |= 1 << 0;
	}
	
	void OSH_MAKE_RED_LED_OUTPUT(void)
	{
		* (volatile unsigned char *)(0x1A + 0x20) |= 1 << 2;
	}
	
	result_t RandomInit(void)
	{
		uint8_t random = OS_LOCAL_ADDRESS;
		{ uint8_t atomic = AtomicStart();
		{
			//RandomLFSR_shiftReg = (119 * 119 * (OS_LOCAL_ADDRESS + 1)&0xffff);
			RandomLFSR_shiftReg = 119 * 119 * (random + 1);
			RandomLFSR_initSeed = RandomLFSR_shiftReg;
			//RandomLFSR_mask = 137 * 29 * (OS_LOCAL_ADDRESS + 1);
			RandomLFSR_mask = 137 * 29 * (random + 1);
		}
		AtomicEnd(atomic); }
		return SUCCESS;
	}
	
	void OSH_SET_CC_PCLK_PIN(void)
	{
		* (volatile unsigned char *)(0x12 + 0x20) |= 1 << 6;
	}
	
	void OSH_SET_CC_PDATA_PIN(void)
	{
		* (volatile unsigned char *)(0x12 + 0x20) |= 1 << 7;
	}
	
	void OSH_SET_CC_PALE_PIN(void)
	{
		* (volatile unsigned char *)(0x12 + 0x20) |= 1 << 4;
	}
	
	void OSH_MAKE_MOSI_INPUT(void)
	{
		* (volatile unsigned char *)(0x17 + 0x20) &= ~(1 << 2);
	}
	
	void OSH_MAKE_SPI_SCK_INPUT(void)
	{
		* (volatile unsigned char *)(0x17 + 0x20) &= ~(1 << 1);
	}
	
	void OSH_CLR_CC_PALE_PIN(void)
	{
		* (volatile unsigned char *)(0x12 + 0x20) &= ~(1 << 4);
	}
	
	void OSH_CLR_CC_PDATA_PIN(void)
	{
		* (volatile unsigned char *)(0x12 + 0x20) &= ~(1 << 7);
	}
	
	void OSH_CLR_CC_PCLK_PIN(void)
	{
		* (volatile unsigned char *)(0x12 + 0x20) &= ~(1 << 6);
	}
	
	void OSH_MAKE_CC_PDATA_INPUT(void)
	{
		* (volatile unsigned char *)(0x11 + 0x20) &= ~(1 << 7);
	}
	
	int OSH_READ_CC_PDATA_PIN(void)
	{
		return (* (volatile unsigned char *)(0x10 + 0x20) & (1 << 7)) != 0;
	}
	
	uint8_t GetPowerLevel(void)
	{
		uint8_t diff;
		
		if (* (volatile unsigned char *)(0x37 + 0x20) & ~((1 << 1) | (1 << 0))) {
			
			return HPLPowerManagementM_IDLE;
		}
		else {
			if (* (volatile unsigned char *)(0x0D + 0x20) & (1 << 7)) {
				return HPLPowerManagementM_IDLE;
			}
			else {
				if (* (volatile unsigned char *)(0x06 + 0x20) & (1 << 7)) {
					return HPLPowerManagementM_ADC_NR;
				}
				else {
					if (* (volatile unsigned char *)(0x37 + 0x20) & ((1 << 1) | (1 << 0))) {
						diff = * (volatile unsigned char *)(0x31 + 0x20) - * (volatile unsigned char *)(0x32 + 0x20);
						if (diff < 16) {
							return HPLPowerManagementM_EXT_STANDBY;
						}
						return HPLPowerManagementM_POWER_SAVE;
					}
					else 
					{
						return HPLPowerManagementM_POWER_DOWN;
					}
				}
			}
		}
	}
	
	void PowerAdjustment(void)
	{
		uint8_t foo;
		uint8_t mcu;
		
		foo = GetPowerLevel();
		mcu = * (volatile unsigned char *)(0x35 + 0x20);
		mcu &= 0xe3;
		if (foo == HPLPowerManagementM_EXT_STANDBY || foo == HPLPowerManagementM_POWER_SAVE) {
			mcu |= HPLPowerManagementM_IDLE;
			while ((* (volatile unsigned char *)(0x30 + 0x20) & 0x7) != 0) {
				asm volatile ("nop");}
			
			mcu &= 0xe3;
		}
		mcu |= foo;
		* (volatile unsigned char *)(0x35 + 0x20) = mcu;
		* (volatile unsigned char *)(0x35 + 0x20) |= 1 << 5;
	}
	
	uint8_t PowerManagementAdjust(void)
	{
		uint8_t mcu;
		
		if (!HPLPowerManagementM_disabled) {
			OSPostTask(PowerAdjustment);
		}
		else 
		{
			mcu = * (volatile unsigned char *)(0x35 + 0x20);
			mcu &= 0xe3;
			mcu |= HPLPowerManagementM_IDLE;
			* (volatile unsigned char *)(0x35 + 0x20) = mcu;
			* (volatile unsigned char *)(0x35 + 0x20) |= 1 << 5;
		}
		return 0;
	}
	
	void OSH_CLR_YELLOW_LED_PIN(void)
	{
		* (volatile unsigned char *)(0x1B + 0x20) &= ~(1 << 0);
	}
	
	void OSH_MAKE_MOSI_OUTPUT(void)
	{
		* (volatile unsigned char *)(0x17 + 0x20) |= 1 << 2;
	}
	
	void OSH_MAKE_MISO_OUTPUT(void)
	{
		* (volatile unsigned char *)(0x17 + 0x20) |= 1 << 3;
	}
	
	void OSH_CLR_RED_LED_PIN(void)
	{
		* (volatile unsigned char *)(0x1B + 0x20) &= ~(1 << 2);
	}
	
	void OSH_CLR_GREEN_LED_PIN(void)
	{
		* (volatile unsigned char *)(0x1B + 0x20) &= ~(1 << 1);
	}
	
	/*uint16_t crcByte(uint16_t oldCrc, uint8_t byte)
	{
		
		uint16_t *table = crcTable;
		uint16_t newCrc;
		
		asm ("eor %1,%B3\n"
			"\tlsl %1\n"
			"\tadc %B2, __zero_reg__\n"
			"\tadd %A2, %1\n"
			"\tadc %B2, __zero_reg__\n"
			"\tlpm\n"
			"\tmov %B0, %A3\n"
			"\tmov %A0, r0\n"
			"\tadiw r30,1\n"
			"\tlpm\n"
			"\teor %B0, r0" : 
		"=r"(newCrc), "+r"(byte), "+z"(table) : "r"(oldCrc));
		return newCrc;
	}
	*/
	uint16_t RandomLFSRGen(void)
	{
		bool endbit;
		uint16_t tmpShiftReg;
		
		{ uint8_t atomic = AtomicStart();
		{
			tmpShiftReg = RandomLFSR_shiftReg;
			endbit = (tmpShiftReg & 0x8000) != 0;
			tmpShiftReg <<= 1;
			if (endbit) {
				tmpShiftReg ^= 0x100b;
			}
			tmpShiftReg++;
			RandomLFSR_shiftReg = tmpShiftReg;
			tmpShiftReg = tmpShiftReg ^ RandomLFSR_mask;
		}
		AtomicEnd(atomic); }
		return tmpShiftReg;
	}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -