📄 main.c
字号:
/*******************************************************************************************************
* Compiler: WINAVR *
* Target platform: Chipcon CCxxx0 (any ATMEGA MCU) *
* Author: 珠海元井电子 www.vital-well.com *
*******************************************************************************************************
* Revision history: *
******************************************************************************************************/
#define __MAIN__
#include "include.h"
#include "RegSettings_Link.h"
#include "halsrf04.h"
#include <avr/sleep.h>
/**********************************************************
DEFINES
**********************************************************/
void intToAscii(UINT32 value);
void wor_ctr(void);
void checkRfPacket(unsigned char length);
unsigned char strTime[] = (__TIME__);
#define GDO0_PIN (PIND & 0x08)
RF_SETTINGS rfSettings;
BYTE paTable[1];
BYTE txBuffer[60] ;//= {21, 8,'H', 'E', 'L', 'L', 'O', ',', 'T', 'E', 'S','T', ' ','C', 'C','x', 'x', '0','0','!', '!', '!'};
BYTE rxBuffer[64];
BYTE BrBwTable[9][9];
BYTE asciiString[11];
BYTE ucSynAsk[] = {0x03,0x68, 0x02, 0x16};
BYTE ucSynAck[] = {0x03,0x68, 0x03, 0x16};
extern volatile unsigned char ucFIFO[SCI_FIFO_SIZE], UartReadPos, UartWritePos, ucSCI_newFlag, ucSCI_Cnt;
volatile unsigned char ucAckFlag, ucSleepFlag;
_DEF_ADDR_ ulNetAddr, ulRouter[3];
extern union
{
unsigned char val[SCI_FIFO_SIZE];
struct
{
unsigned char header;
unsigned char ucDir;
unsigned char ucNum;
unsigned long ulSiteAddr;
unsigned long ulRouter[3];
unsigned char ucCmd;
unsigned char *ucData;
};
}ucUART_FIFO;
void write(unsigned char *str)
{
while (*str != 0)
{
UART0_WAIT_AND_SEND(*str++);
}
}
void writeln(unsigned char *str)
{
write(str);
write("\n\r");
}
#define ENABLE_RX halSpiStrobe(CCxxx0_SRX)
void sysInit(void);
UINT8 length;
UINT32 packetsReceived = 0;
int main(void)
{
UINT32 i;
UINT32 packetsSent = 0;
unsigned char k;
//UINT32 packetsReceived = 0;
//UINT8 length;
for (i=0;i<100;i++) halWait(200);
//系统初始化
sysInit();
ucSCI_newFlag = 0; //flag for having data on comm port
UartReadPos = 0;
UartWritePos = 0;
ucAckFlag = 0;
ucSleepFlag = 0;
//一些提示信息
writeln(strTime);
writeln("Welcome to Vitalwell Electronics, Web: www.vital-well.com");
#ifdef _DEV_TX_
writeln("This is a Simple Demo TX for CCxx00...");
#endif
#ifdef _DEV_RX_
writeln("This is a Simple Demo RX for CCxx00...");
#endif
// Reset CCxx00 and write rf setting to config registers
// CC1100芯片上电复位
POWER_UP_RESET_CCxxx0();
//寄存器设置
halRfWriteRfSettings(&rfSettings);
//发射功率设定
halSpiWriteBurstReg(CCxxx0_PATABLE, paTable, sizeof(paTable));
//提示信息
writeln("Now Enjoying the show!!!");
#ifdef _DEV_RX_
halSpiStrobe(CCxxx0_SRX); // waiting for rec
halSpiStrobe(CCxxx0_SIDLE ); //low w
length = sizeof(rxBuffer);
// _WOR_3S_
#warning "WOR_3S defined!!!"
// halSpiWriteReg(CCxxx0_WORCTRL, 0x79); // WOR_RES=1
for (i=0;i<100;i++)
halWait(200);
//end
#endif
//WOR
// 发送部分
#ifdef _DEV_TX_
ENABLE_UART0_RX_INT(); // Enable Receive interrupt
DISABLE_PATTERN_INT();
#endif
ENABLE_GLOBAL_INT(); // Enable all interrupts
ucSCI_Cnt = 0;
ucAckFlag = 0;
while(1)
{
// 发送部分
#ifdef _DEV_TX_
if(ucSCI_newFlag)
{
//开始
write("Sent start: ");
ucCheckUart();
if(ucSCI_Cnt) // need to send, else local comand
{
//for(i=0;i<ucSCI_Cnt;i++)
txBuffer[0] = ucSCI_Cnt; //length
for(i=1;i<ucSCI_Cnt+1;i++)
{
txBuffer[i] = ucUART_FIFO.val[i-1];
}
txBuffer[i] =0; //terminal char
//writeln(txBuffer);
DISABLE_PATTERN_INT(); //diable rec int
ucAckFlag = 0;
// wake up slave
for(i=0;(i<200L) && (!ucAckFlag);i++)
{
//ucSynAsk will be changed for difrent term
halRfSendPacket(ucSynAsk, sizeof(ucSynAsk)); //wake up water meter
//halRfSendPacket(txBuffer, sizeof(txBuffer));
ENABLE_RX;
for (k=0;k<4;k++)
halWait(200);
ENABLE_PATTERN_INT();
//wait for about 20ms; wait ack msg
for (k=0;k<100;k++)
halWait(200);
DISABLE_PATTERN_INT();
}
//if ok, 发送数据包
if(ucAckFlag)
{
// wait a while for slave echo back;
for (k=0;k<20;k++)
halWait(200);
halRfSendPacket(txBuffer, sizeof(txBuffer));//sizeof(txBuffer));
//显示发送次数
intToAscii(++packetsSent);
write("Sent: ");
write(asciiString);
//发送完毕
writeln(" - End sending! ");
ucAckFlag = 0;
}
ucSCI_Cnt = 0;
}
ucSCI_newFlag = 0;
}
//等待一下,准备下一次发送
// for (i=0;i<2000L;i++) halWait(200);
#endif
//接收部分
#ifdef _DEV_RX_
wor_ctr();
//初始化接收的数据包长度
//length = sizeof(rxBuffer);
//若收到, 显示接收结果
#if 0
if (halRfReceivePacket(rxBuffer, length)) {
SET_LED_RDY();
intToAscii(++packetsReceived);
write("Received: ");
write(asciiString);
write(" - ");
writeln(rxBuffer);
CLR_LED_RDY();
}
#endif
#endif
}//while(1)
}
void sysInit(void)
{
unsigned char i;
//口初始化
PORT_INIT();
//SPI 初始化
SPI_INIT ();
//等待一下,晶振稳定
for (i=0;i<5;i++) halWait(200);
//初始化串口为: 9600,8N1
INIT_UART0 ( UART_BAUDRATE_9K6, (
UART_OPT_8_BITS_PER_CHAR |
UART_OPT_NO_PARITY |
UART_OPT_ONE_STOP_BIT ) );
//串口开
ENABLE_UART0();
DISABLE_UART0_INT();
PATTERN_INT_INIT();
ENABLE_PATTERN_INT();
// ENABLE_UART0_RX_INT(); // Enable Receive interrupt
// ENABLE_GLOBAL_INT(); // Enable all interrupts
SET_LED_RDY();
}
// monitor INT1
union
{
unsigned char val[SCI_FIFO_SIZE];
struct
{
unsigned char header;
unsigned char ucDir;
unsigned char ucNum;
unsigned long ulSiteAddr;
unsigned long ulRouter[3];
unsigned char ucCmd;
unsigned char *ucData;
};
}ucRF_RX;
//unsigned char ucRF_Buff[64];
SIGNAL(SIG_INTERRUPT1)
{
// unsigned char ucTmpBuff[30];
// static unsigned char tmpLen,i;
unsigned char *pRxBuffer;
unsigned char packetLength, status[2];
unsigned int i;
DISABLE_PATTERN_INT(); // disable Pattern Interrupt
// ENABLE_GLOBAL_INT(); // Enable all interrupts
// wdt_reset();
// waiting packet completed!; wait maxim about 50mS; in case hang
i = 1000L;
while((!GDO0_PIN) && (--i))halWait(100);
#ifdef _DEBUG_
write("new\0x0d\0x0a");
#endif
halWait(200);
UART0_WAIT_AND_SEND('Y');
//ucRF_Buff[0]=0;
//packetLength = halSpiReadReg(CCxxx0_RXFIFO);
//if(packetLength < 64)
{
if (halRfReceivePacket(&rxBuffer, 64)) {
for(i = 1;i< rxBuffer[0]+1;i++)
{
ucRF_RX.val[i-1] = rxBuffer[i];
//UART0_WAIT_AND_SEND(rxBuffer[i]);
}
checkRfPacket(rxBuffer[0]); //do my thing
//writeln(ucRF_Buff);
}
}
halSpiStrobe(CCxxx0_SFRX);
halSpiStrobe(CCxxx0_SIDLE );
for (i=0;i<5;i++)
halWait(200);
ENABLE_RX;
for (i=0;i<5;i++)
halWait(200);
//03-Dec
#ifdef _DEV_RX_
//wdt_reset();
CLEAR_UART0_RX_INT();
//rxIntFlag = 0;
CLEAR_PATTERN_INT();
ENABLE_PATTERN_INT();
#endif
}
//-------------------------------------------------------------------------------------------------------
// void intToAscii(UINT32 value)
//
// DESCRIPTION:
// Takes a 32 bits interger as input and converts it to ascii. Puts the result in the global
// variable asciiString[]
//
// ARGUMENTS:
// UINT32 value
// The value to be converted
//-------------------------------------------------------------------------------------------------------
void intToAscii(UINT32 value) {
UINT8 i;
UINT8 j = 0;
UINT8 digit_start = 0;
UINT16 digit = 0;
UINT32 denom = 1000000000;
if (value == 0) {
asciiString[0] = '0';
asciiString[1] = NULL;
} else {
for(i = 10; i > 0; i--) {
digit = value / denom;
if((digit_start == 1) || (digit != 0)) {
digit_start = 1;
value %= denom;
asciiString[j++] = (digit + '0');
}
denom /= 10;
}
asciiString[j++] = NULL;
}
}// intToAscii
void wor_ctr(void)
{
unsigned int i;
DISABLE_PATTERN_INT(); // u mst call it for close syn int before send any command to rfmodule by spi
halSpiStrobe(CCxxx0_SRX);
// _WOR_3S_
#warning "WOR_3S defined!!!"
/* prepare force rf module to sleep mode start*/
halSpiWriteReg(CCxxx0_WORCTRL, 0x79); // WOR_RES=1 open rfmodule counter to force rfmodule enter into sleep mode
// enable counter
halSpiStrobe(CCxxx0_SFRX); //clear rec buffer
halSpiStrobe(CCxxx0_SIDLE); //
// power down RF transceiver
halSpiStrobe(CCxxx0_SPWD);
halSpiStrobe(CCxxx0_SWORRST);
//halSpiStrobe(CCxxx0_SIDLE );
/* prepare force rf module to sleep mode end*/
halSpiStrobe(CCxxx0_SWOR); /* prepare force rf module to sleep mode */
//ucWakeup = 0;
//DDRB = BM(MOSI) | BM(SCK) | BM(CSN);
ENABLE_PATTERN_INT();
ENABLE_GLOBAL_INT(); // Enable all interrupts
// rxMsgFlag = 0;
// wdt_disable();
sleep_enable(); //cpu to sleep
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Select powerdown sleep mode
sleep_mode(); // Sleep mode
/*
sleep & waiting for rfmodule calling me
*/
//wakeup
sleep_disable();
//DISABLE_PATTERN_INT();
//for (i=0;i<2000 && (!sleepflag);i++)
for (i=0;i<2000 && (!ucSleepFlag) ;i++)
halWait(200);
ucSleepFlag =0;
// wdt_reset();
}
void checkRfPacket(unsigned char length)
{
unsigned char i;
switch (ucRF_RX.ucDir)
{
case 0x02: // wake up syn byes?
//send ack packet
// wait a while for slave echo back;
for (i=0;i<20;i++)
halWait(200);
halRfSendPacket(ucSynAck,sizeof(ucSynAck)); // 4 bytes Syn
ucAckFlag = 0;
//UART0_WAIT_AND_SEND('A');
break;
case 0x03: // wake up ack byte?
//set ackflag
ucAckFlag = 1;
//UART0_WAIT_AND_SEND('B');
break;
case 0x00:
case 0x01:
// normal data packet; forward it to RS232
SET_LED_RDY();
#if 1
intToAscii(++packetsReceived);
write("Received: ");
write(asciiString);
write(" - ");
for(i =0; i<length; i++)
{
UART0_WAIT_AND_SEND(ucRF_RX.val[i]);
}
//writeln(rxBuffer);
#endif
CLR_LED_RDY();
ucAckFlag = 0;
break;
// sleep command: |0x68|0xA0|0x16|
case 0xA0:
ucSleepFlag =1;
break;
/*
// other cases;
case
break;
*/
default:
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -