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

📄 cc2420.c

📁 pic18F2580控制CC2420发送数据
💻 C
字号:
//********************************************************************
//** CC2420.c - Driver for CC2420 Wireless transcever on PIC18F4620
//** Jeff Neasham 9/9/2005
//** MUST NOT BE CHANGED BY STUDENTS
//********************************************************************

//Functions to setup and transmit data over the CC2420
#include <p18f2580.h>
#include <spi.h>
#include <delays.h>
#include "cc2420.h"
#include "channel.h"
#define CC2420_CS_SET PORTCbits.RC0 = 0;
#define CC2420_CS_UNSET PORTCbits.RC0 = 1;
#define _SPI_WRITE(cmd) \
SSPBUF = cmd; \
if ( SSPCON1 & 0x80 ) \
return ( -1 ); \
else \
{ while( !SSPSTATbits.BF ); }
void CC2420_Reset(void)
{
int i;
//PORTCbits.RC2 = 0; //RESETn set high
PORTCbits.RC1 = 0; //RESETn set high////////////////////
for(i=0;i<30000;i++);
//PORTCbits.RC2 = 1; //RESETn set high
PORTCbits.RC1 = 1; //RESETn set high////////////////////
for(i=0;i<30000;i++);
}
unsigned char CC2420_Command( char command )
{
CC2420_CS_SET
_SPI_WRITE(command)
CC2420_CS_UNSET
return ( 0 ); // if WCOL bit is not set return non-negative#
}
unsigned char CC2420_SetReg( char reg, unsigned long data)
{
CC2420_CS_SET
/* Write the address to the SPI */\
_SPI_WRITE(reg)
/* Write the data to the spi, stop if there was a SPI error */
_SPI_WRITE((data&0xFF00)>>8)
_SPI_WRITE(data&0x00FF)
CC2420_CS_UNSET
return ( 0 ); // if WCOL bit is not set return non-negative#
}
unsigned char CC2420_WriteReg( char reg, char data[], unsigned char length )
{
char pos = 0;
CC2420_CS_SET
/* Write the address to the SPI */
_SPI_WRITE(reg)
/* Write the data to the spi, stop if there was a SPI error */
for(pos = 0; pos < length; pos++) {
_SPI_WRITE(data[pos])
}
CC2420_CS_UNSET
return ( 0 ); // if WCOL bit is not set return non-negative#
}
unsigned char CC2420_ReadReg( char reg, char* data, unsigned char length )
{
char pos = 0;
CC2420_CS_SET
/* Write the address to the SPI */
_SPI_WRITE((reg & 0x3F) | 0x40) // write byte to SSPBUF register with read bit set
/* Write the data to the spi, stop if there was a SPI error */
for(pos = 0; pos < length; pos++) {
_SPI_WRITE(0)
data[pos] = SSPBUF;
}
CC2420_CS_UNSET
return ( 0 ); // if WCOL bit is not set return non-negative#
}
/*
Valid banks are
*/
unsigned char CC2420_WriteRam( char bank, char address,
char data[], unsigned char length )
{
char pos = 0;
CC2420_CS_SET
/* Write the address to the SPI */
_SPI_WRITE(address | 0x80)
_SPI_WRITE( bank & 0xC0)
/* Write the data to the spi, stop if there was a SPI error */
for(pos = 0; pos < length; pos++) {
_SPI_WRITE(data[pos])
}
CC2420_CS_UNSET
return ( 0 ); // if WCOL bit is not set return non-negative#
}
unsigned char CC2420_ReadRam( char bank, char address,
char* data, unsigned char length )
{
char pos = 0;
CC2420_CS_SET
/* Write the address to the SPI */
_SPI_WRITE(address | 0x80)
_SPI_WRITE((bank | 0x20) & 0xE0)
/* Write the data to the spi, stop if there was a SPI error */
for(pos = 0; pos < length; pos++) {
_SPI_WRITE(0)
data[pos] = SSPBUF;
}
CC2420_CS_UNSET
return ( 0 ); // if WCOL bit is not set return non-negative#
}
void Init_CC2420(void)
{
char buff[2];
CC2420_Reset();
CC2420_Command(CC2420_SXOSCON);//打开晶体震荡器
Delay10KTCYx(8);
CC2420_SetReg( CC2420_MDMCTRL0, 0x02C2 ); //Write to MDMCTRL0 (turn on auto packet ack打开自动应答)
CC2420_SetReg( CC2420_MDMCTRL1, 0x0510 ); //Write to MDMCTRL1 (set corr threshold to 20设置关联门限值为20)
CC2420_SetReg( CC2420_SECCTRL0, 0x01C4 ); //Write to secctrl0 (turn off security enable关闭安全使能)
CC2420_SetReg( CC2420_FSCTRL, 0x8000+357+(CHANNEL-11)*5); //Set frequency channel设置频道
CC2420_SetReg( CC2420_TXCTRL, 0x0AFF);//设置TX  输出功率
CC2420_SetReg( CC2420_IOCFG0, 0x007F ); //Write to IOCFG0 (set the FIFOP threshold)设置FIFOP  的最大值
CC2420_Command( CC2420_SFLUSHRX );//清除接受缓存
CC2420_Command( CC2420_SFLUSHTX );//清除发送缓存
buff[0] = 0x55; //Set the PAN id
buff[1] = 0x55;
CC2420_WriteRam( CC2420RAM_SECURITY, CC2420RAM_PANID, buff, 2 );
Delay10KTCYx(8);	
buff[0] = 0x11; //Set the node short address
buff[1] = 0x11;
CC2420_WriteRam( CC2420RAM_SECURITY, CC2420RAM_SHORTADDR, buff, 2 );
CC2420_Command( CC2420_SFLUSHRX ); //Flush the receive buffer
CC2420_Command( CC2420_SFLUSHTX );
CC2420_Command( CC2420_SRXON ); //Turn on receive mode
Delay10KTCYx(8);	//Pause for chip to become ready
}

void Transmit_CC2420(void)
{
char header[10],payload[6];
header[0] = 0x11; //length
header[1] = 0x88; //FCF Upper
header[2] = 0x61; //FCF Lower
header[3] = 0x01; //Sequence #
header[4] = 0x55; //PAN Upper
header[5] = 0x55; //PAN Lower
header[6] = 0x11; //Dest. Addr. Upper
header[7] = 0x11; //Dest. Addr. Lower
header[8] = 0x12; //Src. Addr. Upper
header[9] = 0x12; //Src. Addr. Lower

payload[0] = 0x02;
payload[1] = 0x01;
payload[2] = 0x4A;
payload[3] = 0x2C;
payload[4] = 0x2C;
payload[5] = 0x2C;

CC2420_Command( CC2420_SFLUSHTX );
CC2420_Command( CC2420_SFLUSHTX );
CC2420_WriteReg( CC2420_TXFIFO, header, 10 );
CC2420_WriteReg( CC2420_TXFIFO, payload, 6 );
CC2420_Command( CC2420_STXON );
}
char Receive_CC2420(char *data, int timeout)
{
	char len=0;
	char OFLOWCNT=10;
	int i;
	for(i=0; i<timeout; i++)
	{
		if(PORTBbits.RB1==1)
    	{
       		// Flags.Bit.inter1=0;But the FIFO is empty, CC2420 indicates an Overflow
        	if(!PORTBbits.RB0)
        	{
        		CC2420_SNOP;
        		if(OFLOWCNT)
				{
					OFLOWCNT--; //Count down to debounce
					if(!OFLOWCNT)
					{
						//Need to reset the CC2420 to fix overflow			
			   	CC2420_Command( CC2420_SFLUSHRX ); //Flush the receive buffer
                    	CC2420_Command( CC2420_SFLUSHRX );
                    	Init_CC2420();		//initialise CC2420 Transceiver				
                    	CC2420_Command( CC2420_SRXON ); //Turn on receive mode
                    	//Delay10KTCYx(8);	//Pause for chip to become ready    				 
    				}
				}
        	}
        	else if(PORTBbits.RB0)
       		{
				CC2420_ReadReg( CC2420_RXFIFO, &len, 1 );
				CC2420_ReadReg( CC2420_RXFIFO, data, 9 );
				CC2420_ReadReg( CC2420_RXFIFO, data, len-9 );
	return(len-11);
        		//MessageLength = Receive_CC2420(DataBuffer);	//receive data from CC2420 (timeout = 32767 max) 
	    		//USART_Out(DataBuffer,MessageLength);	//output received data to USART (RS232 port)
				//PORTA=Counter++;
        	}
    	}
   		else
   		{
   			//FIFOP is low, so OK
			OFLOWCNT=10; //Reload counter
   		}
	}
return(0);
}

⌨️ 快捷键说明

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