?? zigbee.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 + -