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

📄 zigbee.c

📁 stk300 target Zigbee test module code.
💻 C
字号:
/* ========================================================================== */
/*	             zigbee.c : Zigbee source    		                	      */
/*	                                                           	              */
/*	             Program  : Quantumbase Inc.            	                  */
/*	                                                           	              */
/*	             Hardware : MCU(Atmel ATmega128 - 8MHz, 32.768kHz)            */
/*	                        LED(port : 4, bus : 8)                            */
/*	                        FND(bus : 4, 7-segment + DP)         			  */
/*	                        LCD(bus : 1, 16 x 2 line)                         */
/*	                        Key(port : 4, 2-polling, 2-interrupt)             */
/*	                        SPI EEPROM(port : 4, AT93C46)                     */
/*	                        RS232(port : 2, MAX232A, DB-9 pin)                */
/*	                        ISP(port : 4, DB-25 pin)                          */
/*	                                                                          */
/*	             Software : Simulation, Emulation(Atmel AVR Studio 4.0)       */
/*	                        C/C++ Complier(WINAVR AVR-GCC)                    */
/*	                        ISP(ponyprog2000 : parallel)                      */
/*	                                                                          */
/*	             Version  : 1.000 - 2007/07/02                                */
/*	                                                                          */
/* ========================================================================== */

#include <zigbee.h>


/* --- zigbee information --- */
void zigbee_init(void)		// zigbee init
{
	MyZigbeeInit();

	zbfCDIndex = 0;    // Length - Command + Data
	zbfCheckSum = 0;    // CheckSum
	zbfDCEIndex = 0;   // Data + CheckSum + ETX

	zbfTid = 0x0000;           // Remote Target ID
	zbfDataSeq = 0x00;         // Data Squence

	// Uart
	rxDataLength = 0;
	txDataLength = 0;

	rxStat = RXSTAT_IDLE;     // RX status

	// Uart Tx
	txCmd = ZI_CMD_NONE;

	/* --- control --- */
	ledListIndex = 0;

}

void MyZigbeeInit(void)
{
	zbiMy.gid = 0x5000;
	zbiMy.tid = 0xFFFF;
	zbiMy.did = 0x0001;
	zbiMy.rxmode = 0xff;
	zbiMy.txpower = 0x0;
	zbiMy.rfchannel = 0xf;
	zbiMy.txretry = 0x0a;
	zbiMy.bufferstatus = 0x0;
	zbiMy.uartspeed = 0x1;
	zbiMy.hostretry = 0x03;
	zbiMy.testcount = 0x0a;
}

void MyZigbeeLoad(void)
{
	zbiMy.gid = zbiData.gid;
	zbiMy.tid = zbiData.tid;
	zbiMy.did = zbiData.did;
	zbiMy.rxmode = zbiData.rxmode;
	zbiMy.txpower = zbiData.txpower;
	zbiMy.rfchannel = zbiData.rfchannel;
	zbiMy.txretry = zbiData.txretry;
	zbiMy.bufferstatus = zbiData.bufferstatus;
}

void ZigbeeLoad(void)
{
	uint16_t LowID;
	uint16_t HighID;

	LowID = (uint16_t)zbfRx.data[ZBF_DATA_POS_GID];
	HighID = (uint16_t)zbfRx.data[ZBF_DATA_POS_GID + 1];
	zbiData.gid = (uint16_t)((HighID << 8) | LowID);

	LowID = (uint16_t)zbfRx.data[ZBF_DATA_POS_TID];
	HighID = (uint16_t)zbfRx.data[ZBF_DATA_POS_TID + 1];
	//zbiData.tid = zbfRx.data[ZBF_DATA_POS_TID];
	zbiData.tid = (uint16_t)((HighID << 8) | LowID);

	LowID = (uint16_t)zbfRx.data[ZBF_DATA_POS_DID];
	HighID = (uint16_t)zbfRx.data[ZBF_DATA_POS_DID + 1];
	//zbiData.did = zbfRx.data[ZBF_DATA_POS_DID];
	zbiData.did = (uint16_t)((HighID << 8) | LowID);

	zbiData.rxmode = zbfRx.data[ZBF_DATA_POS_RXMODE];
	zbiData.txpower = zbfRx.data[ZBF_DATA_POS_TXPOWER];
	zbiData.rfchannel = zbfRx.data[ZBF_DATA_POS_RFCHANNEL];
	zbiData.txretry = zbfRx.data[ZBF_DATA_POS_TXRETRY];
	zbiData.bufferstatus = zbfRx.data[ZBF_DATA_POS_BUFSTAT];
}

void MyZigbeeSet(uint8_t Cmd)
{
	uint16_t LowID;
	uint16_t HighID;

	switch (Cmd)
	{
		case ZI_CMD_GROUP_ID:
			LowID = (uint16_t)zbfRx.data[ZBF_DATA_POS_GID];
			HighID = (uint16_t)zbfRx.data[ZBF_DATA_POS_GID + 1];
			zbiData.gid = (uint16_t)((HighID << 8) | LowID);

			zbiMy.gid = zbiData.gid;
			break;
		case ZI_CMD_TARGET_ID:
			LowID = (uint16_t)zbfRx.data[ZBF_DATA_POS_TID];
			HighID = (uint16_t)zbfRx.data[ZBF_DATA_POS_TID + 1];
			//zbiData.tid = zbfRx.data[ZBF_DATA_POS_TID];
			zbiData.tid = (uint16_t)((HighID << 8) | LowID);

			zbiMy.tid = zbiData.tid;
			break;
		case ZI_CMD_DEVICE_ID:
			LowID = (uint16_t)zbfRx.data[ZBF_DATA_POS_DID];
			HighID = (uint16_t)zbfRx.data[ZBF_DATA_POS_DID + 1];
			//zbiData.did = zbfRx.data[ZBF_DATA_POS_DID];
			zbiData.did = (uint16_t)((HighID << 8) | LowID);

			zbiMy.did = zbiData.did;
			break;
		case ZI_CMD_RX_MODE:
			zbiData.rxmode = zbfRx.data[ZBF_DATA_POS_RXMODE];

			zbiMy.rxmode = zbiData.rxmode;
			break;
		case ZI_CMD_TX_POWER:
			zbiData.txpower = zbfRx.data[ZBF_DATA_POS_TXPOWER];

			zbiMy.txpower = zbiData.txpower;
			break;
		case ZI_CMD_RF_CHANNEL:
			zbiData.rfchannel = zbfRx.data[ZBF_DATA_POS_RFCHANNEL];

			zbiMy.rfchannel = zbiData.rfchannel;
			break;
		case ZI_CMD_TX_RETRY:
			zbiData.txretry = zbfRx.data[ZBF_DATA_POS_TXRETRY];

			zbiMy.txretry = zbiData.txretry;
			break;
		case ZI_CMD_BUFFER_RESET:
			zbiData.bufferstatus = zbfRx.data[ZBF_DATA_POS_BUFSTAT];

			zbiMy.bufferstatus = zbiData.bufferstatus;
			break;
		default:
			break;
	}
}

/* --- zigbee data send --- */
int16_t ZigbeeStatusDataSend(uint16_t Tid, uint8_t dataCmd, uint8_t *Body, uint16_t BodyLength)	// Zigbee Data Send - Status
{
	int16_t Ret;

	uint8_t Data[TX_BUF_SIZE];
	uint16_t DataSize;

	// Data Squence
	zbfDataSeq++;

	// Data
	Data[ZBF_DATA_POS_SUBDATA + ZBF_SUBDATA_POS_CMD] = dataCmd;

	Data[ZBF_DATA_POS_SUBDATA + ZBF_SUBDATA_POS_LEN] = (uint8_t)(ZBF_SUBDATA_SIZE_CMD + BodyLength);
	DataSize = Data[ZBF_DATA_POS_SUBDATA + ZBF_SUBDATA_POS_LEN] + ZBF_SUBDATA_SIZE_LEN;

	memcpy((void *)&(Data[ZBF_DATA_POS_SUBDATA + ZBF_SUBDATA_POS_BODY]), (const void *)Body, BodyLength);	
														// Body -> Data

	// Zigbee Data Send
	Ret = ZigbeeDataSend(Tid, Data, DataSize, zbfDataSeq);

	return Ret;
}

int16_t ZigbeeDataSend(uint16_t Tid, uint8_t *Data, uint16_t DataSize, uint8_t DSeq)	// Zigbee Data Send
{
	int16_t Ret;

	uint8_t Cmd;

	uint16_t DSize;

	Cmd = ZI_CMD_DATA;

	Data[ZBF_DATA_POS_GID + 1] = (uint8_t)((zbiMy.gid >> 8) & 0x00FF); // Group ID High byte
	Data[ZBF_DATA_POS_GID] = (uint8_t)(zbiMy.gid & 0x00FF);        // Group ID Low byte

	Data[ZBF_DATA_POS_DID + 1] = (uint8_t)((zbiMy.did >> 8) & 0x00FF); // Device ID High byte
	Data[ZBF_DATA_POS_DID] = (uint8_t)(zbiMy.did & 0x00FF);        // Device ID Low byte

	Data[ZBF_DATA_POS_TID + 1] = (uint8_t)((Tid >> 8) & 0x00FF); // Target ID High byte
	Data[ZBF_DATA_POS_TID] = (uint8_t)(Tid & 0x00FF);        // Target ID Low byte

	Data[ZBF_DATA_POS_DSEQ] = DSeq;          // Data Sequence  

	Data[ZBF_DATA_POS_SUBDATA + DataSize] = 0x00;    // Strength - dummy data

	// DSize = ZBF_DATA_POS_SUBDATA + DataSize;
	DSize = ZBF_DATA_POS_SUBDATA + DataSize + ZI_FRM_DATA_STR_SIZE;

	// Zigbee Command Send
	Ret = ZigbeeCmdSend(Cmd, Data, DSize);

	return Ret;

}

int16_t ZigbeeCmdSend(uint8_t Cmd, uint8_t * Data, uint16_t DataSize)	// Zigbee Command Send
{
	uint8_t ChkSum;
	uint16_t Index;

	if (DataSize > ZI_FRM_DATA_MAX)
	{
		return RXSTAT_ERR_FRAME;
	}

	// STX
	txData[U_BUF_POS_STX] = ZI_STX;

	// Length
	txData[U_BUF_POS_LEN] = (uint8_t)(DataSize + 1);
	ChkSum = txData[U_BUF_POS_LEN];

	// Command
	txData[U_BUF_POS_CMD] = Cmd;
	ChkSum ^= txData[U_BUF_POS_CMD];

	// Data
	for (Index = 0; Index < DataSize; Index++)
	{
		txData[Index + ZI_FRM_HEAD_MAX] = Data[Index];
		ChkSum ^= txData[Index + ZI_FRM_HEAD_MAX];
	}

	// CheckSum
	txData[Index + ZI_FRM_HEAD_MAX] = ChkSum;
	Index++;

	// ETX
	txData[Index + ZI_FRM_HEAD_MAX] = ZI_ETX;
	Index++;

	// Zigbee Frame Length
	txDataLength = Index + ZI_FRM_HEAD_MAX;

	txCmd = Cmd;

	rxStat = RXSTAT_STX;        // Uart Rx Stat

	return (int16_t)Cmd;

}

/* --- zigbee data receive --- */
void ZigbeeFrameGet(uint8_t rxByte)		// Zigbee Frame Get
{
	switch (rxStat)
	{
		case RXSTAT_IDLE:
			// break;
		case RXSTAT_STX:
			if (rxByte == ZI_STX)
			{
				zbfRx.stx = rxByte;
				rxStat = RXSTAT_LEN;
			}
			break;
		case RXSTAT_LEN:
			if ((rxByte > 0) && (rxByte <= 127))
			{
				zbfRx.length = rxByte;
				zbfCDIndex = zbfRx.length;
				zbfCheckSum = zbfCDIndex;
				rxStat = RXSTAT_CMD;
			}
			else
			{
				// rxStat = RXSTAT_ZB_FRM_ERR;
				rxStat = RXSTAT_ERR_FRAME;
			}
			break;
		case RXSTAT_CMD:
			zbfRx.cmd = rxByte;
			zbfCheckSum ^= zbfRx.cmd;
			zbfCDIndex--;
			if (zbfCDIndex == 0)
			{
				rxStat = RXSTAT_CHKSUM;
			}
			else
			{
				rxStat = RXSTAT_DATA;
			}
			zbfDCEIndex = 0;
			break;
		case RXSTAT_DATA:
			zbfRx.data[zbfDCEIndex] = rxByte;
			zbfCheckSum ^= zbfRx.data[zbfDCEIndex];
			zbfDCEIndex++;
			zbfCDIndex--;
			if (zbfCDIndex == 0)
			{
				rxStat = RXSTAT_CHKSUM;
			}
			break;
		case RXSTAT_CHKSUM:
			zbfRx.data[zbfDCEIndex] = rxByte;
			zbfCheckSum ^= zbfRx.data[zbfDCEIndex];
			zbfDCEIndex++;
			if (zbfCheckSum == 0)
			{
				rxStat = RXSTAT_ETX;
			}
			else
			{
				// rxStat = RXSTAT_ZB_FRM_ERR;
				rxStat = RXSTAT_ERR_FRAME;
			}
			break;
		case RXSTAT_ETX:
			zbfRx.data[zbfDCEIndex] = rxByte;
			if (rxByte == ZI_ETX)
			{
				rxStat = RXSTAT_OK;
			}
			else
			{
				// rxStat = RXSTAT_ZB_FRM_ERR;
				rxStat = RXSTAT_ERR_FRAME;
			}
			break;
		// case RXSTAT_ZB_FRM_ERR:
		case RXSTAT_ERR_FRAME:
		default:
			break;
	}
}



⌨️ 快捷键说明

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