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

📄 cc1100.c.bak

📁 mega128平台下
💻 BAK
字号:
/*
	  v2.5  halSpiWriteReg(CCxxx0_MCSM2, 0x08);
	        halSpiWriteReg(CCxxx0_PKTLEN, 0x1F);
	  v2.6  测试发送:Dly1mS(100); 删去
*/
#include <iom128v.h>
#include "cc1100_reg.h"
typedef unsigned char uint8_t;
typedef unsigned int uint16_t;
unsigned char paTable[8]   = {0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0};  
unsigned char rxBuffer[32]; //接收缓冲区的大小

unsigned char rd_reg;

//unsigned char INTERRUPT_STATE=0x00;
unsigned char SEND_DONE=0x00;

void SET_CLOCK() { PORTG |=0x1; }
void CLEAR_CLOCK() { PORTG &=~(0x1); }
void SET_IN() { PORTG |=0x2; }
void CLEAR_IN() { PORTG &=~(0x2); }	
void SET_CSN() { PORTC |=0x4; }
void CLEAR_CSN() { PORTC &=~(0x4); }
//char GET_OUT() { return (PINC & 0x2)!=0;}
//char GET_GDO0() {  return (PIND & 0x2)!=0;}
int GET_OUT() { return (* (volatile unsigned char *)(unsigned int )& * (volatile unsigned char *)(0x13 + 0x20) & (1 << 1)) != 0;}


	
	
	
extern	uint8_t CC1100_sendDone();
extern	uint8_t CC1100_receive(uint8_t *msg);

unsigned char CC1100_send(uint8_t *txPtr,uint8_t size)
{
 if (1)
     return CC1100_sendRFburst(txPtr,size);
 else
     ;
} 	
	
/******************************************/	

//延时函数 10us
	void Dly10us() 
	{
		unsigned char i;
		for(i=0;i<10;i++)
		{
			asm("nop");
			asm("nop");
			asm("nop");
			asm("nop");
			asm("nop");
			asm("nop");
			asm("nop");
			asm("nop");
			asm("nop");
			asm("nop");
		}
	}	
//延时函数 1ms
	void Dly1mS(unsigned int l) 
	{
		unsigned int i,j;
		while(l--)
		for(i=0;i<54;i++)
		for(j=0;j<100;j++);		
	}
	
/******************************************/	

	unsigned char SPI_write(unsigned char value)
	{
		unsigned char i,spi_status,rd_pin;
		for(i=0;i<8;i++)
		{
			if((value&0x80)==0x80)
			{
				 Dly10us();
				 SET_IN(); // SI=1
			}
			else
			{
				 CLEAR_IN(); // SI=0
				 Dly10us();Dly10us();
			}
			Dly10us();Dly10us();Dly10us();
			SET_CLOCK(); //SCLK=1;
			Dly10us();Dly10us();Dly10us();Dly10us();Dly10us();
			value <<=1;
			spi_status<<=1;
			rd_pin=GET_OUT();
			if((rd_pin&0x01)==0x01)
			spi_status=spi_status|0x01;
			else
			spi_status=spi_status&0xfe;
			CLEAR_CLOCK();
			Dly10us();Dly10us();
		}
		return(spi_status);
	}	
	unsigned char SPI_read()
	{
		unsigned char i,value,rd_pin;
		for(i=0;i<8;i++) 
		{
			SET_CLOCK(); //P_SCLK=1;
			value <<=1;Dly10us();Dly10us();Dly10us();Dly10us();Dly10us();
			rd_pin=GET_OUT();	
			if((rd_pin&0x01)==0x01) value|=0x01;
			else value&=0xfe;
			Dly10us();Dly10us();
		        CLEAR_CLOCK(); //SCLK=0  //P_SCLK=0;
			Dly10us();Dly10us();Dly10us();Dly10us();Dly10us();
		}
		return value;
	}	
/******************************************/	
	unsigned char spiGetRxTxStatus() 
	{
		unsigned char RxTxstatus;
	        CLEAR_CSN(); // CSn=0
	        while(GET_OUT());
		CLEAR_CLOCK();
	  	RxTxstatus=SPI_write(CCxxx0_SNOP);
		CLEAR_CLOCK(); //SCLK=0
		CLEAR_IN(); // SI=0
	        SET_CSN();  //CSn=1
	        return(RxTxstatus);
	} 
/******************************************/
	void halSpiWriteReg(unsigned char addr, unsigned char value) 
	{
		CLEAR_CSN();
		while(GET_OUT());
		CLEAR_CLOCK();
		addr&=0x7F;
		SPI_write(addr);
		SPI_write(value);
	        CLEAR_CLOCK();
		CLEAR_IN();
		SET_CSN();
	}
/******************************************/
	void halSpiStrobe(unsigned char strobe) 
	{
	        CLEAR_CSN(); // CSn=0
		CLEAR_CLOCK();
	        while(GET_OUT());
	        SPI_write(strobe);
	        CLEAR_CLOCK();
		CLEAR_IN();
		SET_CSN();
	}
/*******************************************/
	void halSpiWriteBurstReg(unsigned char addr, unsigned char *buffer, unsigned char count)
	{
		unsigned char i,j,value;
	        CLEAR_CLOCK();
		Dly10us();Dly10us();
		CLEAR_CSN(); // CSn=0
		addr|=WRITE_BURST;		
		SPI_write(addr);
		CLEAR_IN();
		for(j=0;j<count;j++) 
		{
		    value=buffer[j];
		    SPI_write(value);
		    CLEAR_IN();
		    for(i=0;i<100;i++);
		}
		SET_CSN();
	}
/******************************/
	void CC1100_POR() 
	{
		unsigned int i;
		halSpiStrobe(CCxxx0_SIDLE);
	        SET_CSN();
		for(i=0;i<100;i++);
		CLEAR_CSN();
		for(i=0;i<100;i++);
		SET_CSN();
		for(i=0;i<2000;i++);
		CLEAR_CSN();
		while(GET_OUT());
		halSpiStrobe(CCxxx0_SRES);
		CLEAR_CLOCK();
		CLEAR_IN();
		SET_CSN();
	}
/*******************************************/	
	unsigned char halRfSendPacket(unsigned char *txBuffer, unsigned char size)
	{
		halSpiStrobe(CCxxx0_SFTX);
		Dly1mS(15);
		//Dly1mS(25);
		halSpiWriteBurstReg(CCxxx0_TXFIFO, txBuffer, size);
		Dly1mS(15);
		//Dly1mS(25);
		halSpiStrobe(CCxxx0_STX);
		while(spiGetRxTxStatus()&0x70)
		{
			Dly1mS(1);
			//Dly1mS(2);
		}
		SEND_DONE=0x01;
		return 0;
	}// halRfSendPacket
/*******************************************/	
/*
	void TxCCxx00()
	{
		unsigned char	i;
		halSpiWriteReg(CCxxx0_FREND0, 0x10);		//CC1100:POWER=10DBM;CC2500:1DBM
		Dly1mS(25);;
		for(i=0;i<4;i++)							//发四次		
		{
	    		halRfSendPacket(txBuffer_CCxx00, sizeof(txBuffer_CCxx00));
			Dly1mS(50);
		}
		halSpiWriteReg(CCxxx0_FREND0, 0x15);	//CC1100太近会收不到,将发射功率降低到-10DBM //#define CCxxx0_FREND0       0x22
		Dly1mS(50);
	   	halRfSendPacket(txBuffer_CCxx00, sizeof(txBuffer_CCxx00));
		Dly1mS(100);
	}
*/
/*********************************************************/
	unsigned char halSpiReadReg(unsigned char addr) 
	{
		unsigned char value;
	        CLEAR_CLOCK();
		Dly10us();Dly10us();
		CLEAR_CSN(); // CSn=0
		addr|=READ_SINGLE;
		SPI_write(addr);
	        CLEAR_IN();
		Dly10us();Dly10us();Dly10us();Dly10us();Dly10us();
		value=0;
		value=SPI_read();
		Dly10us();Dly10us();Dly10us();
		CLEAR_CLOCK();
		CLEAR_IN();
		SET_CSN(); // CSn=0 P_CSn=0;
		return value;		
	}
/**************************************************/
	void halSpiReadBurstReg(unsigned char addr, unsigned char *buffer, unsigned char count)
	{
		unsigned char i,value;
	        CLEAR_CLOCK();
		Dly10us();Dly10us();
		CLEAR_CSN(); // CSn=0 P_CSn=0;
		addr|=READ_BURST;
		SPI_write(addr);
		CLEAR_IN();
		Dly10us();Dly10us();Dly10us();Dly10us();Dly10us();
		value=0; 
		for(i=0;i<count;i++)
		{
			value=SPI_read();
		        buffer[i]=value;
		}
		Dly10us();Dly10us();Dly10us();
		CLEAR_CLOCK();
		CLEAR_IN();
		SET_CSN(); // CSn=0 P_CSn=0;
	}
/**************************************************/
	unsigned char halSpiReadStatus(unsigned char addr) 
	{
		unsigned char value,rd_pin;
	  CLEAR_CSN(); // CSn=0	P_CSn=0;
	  while(GET_OUT());
		CLEAR_CLOCK(); //SCLK=0  //P_SCLK=0;
		addr|=READ_BURST;
		SPI_write(addr);
		value=SPI_read();
		CLEAR_CLOCK(); //SCLK=0  //P_SCLK=0;
		CLEAR_IN(); // SI=0 P_SI=0;
	  SET_CSN();  //CSn=1	P_CSn=1;
		return value;
	}// halSpiReadStatus
/**************************************************/
	void halRfWriteRfSettings() 
	{
	l_setCC1100:	
		halSpiWriteReg(CCxxx0_FSCTRL1, 0x0C);	
		
		halSpiWriteReg(CCxxx0_FSCTRL0, 0x00);	
		halSpiWriteReg(CCxxx0_FREQ2, 0x10);
		halSpiWriteReg(CCxxx0_FREQ1, 0x09);
		halSpiWriteReg(CCxxx0_FREQ0, 0x7B);
		halSpiWriteReg(CCxxx0_MDMCFG4, 0xC6);
		halSpiWriteReg(CCxxx0_MDMCFG3, 0x83); 
		halSpiWriteReg(CCxxx0_MDMCFG2, 0x02);
		halSpiWriteReg(CCxxx0_MDMCFG1, 0x22);
		halSpiWriteReg(CCxxx0_MDMCFG0, 0xF8);
		halSpiWriteReg(CCxxx0_CHANNR, 0x0b);
		halSpiWriteReg(CCxxx0_DEVIATN, 0x30);
		halSpiWriteReg(CCxxx0_FREND1, 0x56);
		halSpiWriteReg(CCxxx0_FREND0, 0x10);
		
		
		halSpiWriteReg(CCxxx0_MCSM0, 0x18);
		halSpiWriteReg(CCxxx0_FOCCFG, 0x15);
		halSpiWriteReg(CCxxx0_BSCFG, 0x6C);
		halSpiWriteReg(CCxxx0_AGCCTRL2, 0x03);
		halSpiWriteReg(CCxxx0_AGCCTRL0, 0x91);
		halSpiWriteReg(CCxxx0_FSCAL3, 0xA9);
		halSpiWriteReg(CCxxx0_FSCAL2, 0x2A);
		halSpiWriteReg(CCxxx0_FSCAL0, 0x0D);
		halSpiWriteReg(CCxxx0_FSTEST, 0x59);
		halSpiWriteReg(CCxxx0_TEST2, 0x86);
		halSpiWriteReg(CCxxx0_TEST1, 0x3D);
		halSpiWriteReg(CCxxx0_TEST0, 0x09);
		
		
	  halSpiWriteReg(CCxxx0_IOCFG2, 0x24);
	  	  
	  halSpiWriteReg(CCxxx0_IOCFG0, 0x06);
		halSpiWriteReg(CCxxx0_PKTCTRL1, 0x04);
		halSpiWriteReg(CCxxx0_PKTCTRL0, 0x05);
		halSpiWriteReg(CCxxx0_ADDR, 0x00);
		
		halSpiWriteReg(CCxxx0_PKTLEN, 0x1F); // hejie ,接收数据长度
		//halSpiWriteReg(CCxxx0_PKTLEN, 0xFF);
		
		halSpiWriteReg(CCxxx0_MCSM2, 0x08);  // CCxxx0_MCSM2 修改限制时间 默认为07 修改为00
		//halSpiWriteReg(CCxxx0_FIFOTHR, 0x07);
		
	 
		if(halSpiReadReg(CCxxx0_MDMCFG1)!=0x22){
		 // led1On();
		goto l_setCC1100;
		}
	}
/**************************************************/   

  //接收到数据中断

  #pragma interrupt_handler cc1100_rx_isr:3
 void	cc1100_rx_isr()
	  {		    	    
		    unsigned char packetLength;		
		   // led2Toggle();
		  	packetLength = halSpiReadReg(CCxxx0_RXFIFO);		  	
		  	rxBuffer[0]=packetLength;		  	
		  	if(rxBuffer[0] <= 32)
		    {
		    		halSpiReadBurstReg(CCxxx0_RXFIFO, &rxBuffer[1], packetLength);
		    		post(CC1100_receive);
		    }
		    else
		    {
		    	 halSpiStrobe(CCxxx0_SFRX);
		    }
		    halSpiStrobe(CCxxx0_SFRX);
		    halSpiStrobe(CCxxx0_SRX);			   			        	  				  	    			      		  		   
	  }
/**************************************************/ 
//extern led2On();
	//初始化
	uint8_t CC1100_init()
	{
		uint16_t nnn;
		
		SET_CSN();
		CLEAR_CLOCK();
		CLEAR_IN();
	
		CC1100_setInterrupt(0x00);
		CC1100_POR();
		for(nnn=0;nnn<500;nnn++);
			
		halRfWriteRfSettings();
		   // led2On();
		halSpiWriteBurstReg(CCxxx0_PATABLE, paTable, sizeof(paTable));
		
		CC1100_setInterrupt(0x00);
		CC1100_setStrobe(CCxxx0_SIDLE);
		
		return 1;
	} 
	//设置状态
	uint8_t CC1100_setStrobe(uint8_t state)
	{
		halSpiStrobe(state);
		Dly1mS(5);
		return 1;
	}
	//写寄存器
	uint8_t CC1100_setRegister(uint8_t address,uint8_t value)
	{
		halSpiWriteReg(address,value);
		return 1;
	}
    //读寄存器	
	uint8_t CC1100_readRegister(uint8_t address)
	{		
		rd_reg = halSpiReadReg(address);
		return rd_reg;
	}
	//读状态
	uint8_t CC1100_readStatus(uint8_t address)
	{		
		return halSpiReadStatus(address);
		
	}
	//连续读
	uint8_t CC1100_readBurstReg(unsigned char addr, unsigned char *buffer, unsigned char count)
	{		
		 halSpiReadBurstReg(addr, buffer, count);
		return 1;
	}
	//halSpiReadStatus
	//设置中断
	uint8_t CC1100_setInterrupt(uint8_t flag)
	{
		if(flag==0x00)
		{
			EIFR=0x02;EICRA=0x08;EICRB=0x00;EIMSK=0x00;
		}
		else if(flag==0x01)
		{
			EIFR=0x02;EICRA=0x08;EICRB=0x00;EIMSK=0x02;
			halSpiStrobe(CCxxx0_SRX);
		}
		else if(flag==0x02)
		{
			halSpiStrobe(CCxxx0_SRX); 
		}		
		return 1;
	}
	
	//extern led1On();
	//连续发
	uint8_t CC1100_sendRFburst(uint8_t *txPtr,uint8_t size)
	{
		//led1On();
		CC1100_setInterrupt(0x00); //关中断
		halSpiStrobe(CCxxx0_SIDLE);
	   	halRfSendPacket(txPtr, size);
		//Dly1mS(100);
		if(SEND_DONE==0x01) //表明发送完成
		{
			SEND_DONE=0x00;
			//led2On();
			CC1100_sendDone(1);
			CC1100_setInterrupt(0x01); //开中断
		}
		return 1;
	}
/*
	uint8_t CC1100_sendDone()
	{
		return success;
	}
	uint8_t CC1100_receive(uint8_t *msg)
	{
		return msg;
	}
*/
//更改通道号
void CC1100_change_channr(unsigned char channr_NO)
{
  	halSpiWriteReg(CCxxx0_CHANNR,channr_NO );
}

uint8_t CC1100_wakeup()
{
	uint16_t n,m;
	SET_CSN();
	for(n=0;n<1000;n++);
	CLEAR_CSN();
	for(n=0;n<1000;n++)
	for(m=0;m<1000;m++);
	SET_CSN();
	return 1;
}
uint8_t CC1100_sleep()
{
	CC1100_setStrobe(0x39);
	//call PowerMgrEnable();
	return 1;
}

⌨️ 快捷键说明

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