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

📄 main.c

📁 AVR写的433M无线通信原代码.
💻 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 + -