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

📄 cc1100.c

📁 这个程序是用MSP430写的chipcon公司的无线收发芯片CC1100的驱动程序。
💻 C
字号:
//cc1100 source code packet
#include "cc1100.h"

unsigned char status[2];
unsigned char WaitRxEndtime;
unsigned char PacketLength;


/*****************************************************************************************
config the register of CC1100
Parameter:return 1 means systemerr,return 0 means systemok
*****************************************************************************************/
unsigned char halRfWriteRfSettings_CC1100() //433mhz		//4.8k
{
	/*halSpiWriteReg(CCxxx0_FSCTRL1, 0x06);		//data rate:2.4K,433MHZ
	halSpiWriteReg(CCxxx0_FSCTRL0, 0x00);
	halSpiWriteReg(CCxxx0_FREQ2, 0x10);
	halSpiWriteReg(CCxxx0_FREQ1, 0xB0);
	halSpiWriteReg(CCxxx0_FREQ0, 0x71);
	halSpiWriteReg(CCxxx0_MDMCFG4, 0xF6);
	halSpiWriteReg(CCxxx0_MDMCFG3, 0x83);
	halSpiWriteReg(CCxxx0_MDMCFG2, 0x03);
	halSpiWriteReg(CCxxx0_MDMCFG1, 0x22);
	halSpiWriteReg(CCxxx0_MDMCFG0, 0xF8);
	halSpiWriteReg(CCxxx0_CHANNR, 0x00);
	halSpiWriteReg(CCxxx0_DEVIATN, 0x15);
	halSpiWriteReg(CCxxx0_FREND1, 0x56);
	halSpiWriteReg(CCxxx0_FREND0, 0x10);
	halSpiWriteReg(CCxxx0_MCSM1, 0x30);
	halSpiWriteReg(CCxxx0_MCSM0, 0x18);
	halSpiWriteReg(CCxxx0_FOCCFG, 0x16);
	halSpiWriteReg(CCxxx0_BSCFG, 0x6C);
	halSpiWriteReg(CCxxx0_AGCCTRL2, 0x03);
	halSpiWriteReg(CCxxx0_AGCCTRL0, 0x91);
	halSpiWriteReg(CCxxx0_FSCAL3, 0xe9);
	halSpiWriteReg(CCxxx0_FSCAL2, 0x0A);
	halSpiWriteReg(CCxxx0_FSCAL0, 0x1F);
	halSpiWriteReg(CCxxx0_FSTEST, 0x59);
	halSpiWriteReg(CCxxx0_TEST2, 0x81);
	halSpiWriteReg(CCxxx0_TEST1, 0x35);
	halSpiWriteReg(CCxxx0_TEST0, 0x09);
	halSpiWriteReg(CCxxx0_IOCFG2, 0x24);
	halSpiWriteReg(CCxxx0_IOCFG0, 0x06);
	halSpiWriteReg(CCxxx0_PKTCTRL1, 0x04);//CRC AUTOFLUSH;ADDRESS CHECK
	halSpiWriteReg(CCxxx0_PKTCTRL0, 0x05);
	halSpiWriteReg(CCxxx0_ADDR, 0x00);
	halSpiWriteReg(CCxxx0_PKTLEN, 0xFF);*/

	halSpiWriteReg(CCxxx0_FSCTRL1, 0x06);		//data rate 4.8K,433M
	halSpiWriteReg(CCxxx0_FSCTRL0, 0x00);
	halSpiWriteReg(CCxxx0_FREQ2, 0x10);
	halSpiWriteReg(CCxxx0_FREQ1, 0xA7);
	halSpiWriteReg(CCxxx0_FREQ0, 0x62);
	halSpiWriteReg(CCxxx0_MDMCFG4, 0xC7);
	halSpiWriteReg(CCxxx0_MDMCFG3, 0x83);
	halSpiWriteReg(CCxxx0_MDMCFG2, 0x03);
	halSpiWriteReg(CCxxx0_MDMCFG1, 0x22);
	halSpiWriteReg(CCxxx0_MDMCFG0, 0xF8);
	halSpiWriteReg(CCxxx0_CHANNR, 0x00);
	halSpiWriteReg(CCxxx0_DEVIATN, 0x40);
	halSpiWriteReg(CCxxx0_FREND1, 0x56);
	halSpiWriteReg(CCxxx0_FREND0, 0x10);
	halSpiWriteReg(CCxxx0_MCSM1, 0x30);
	halSpiWriteReg(CCxxx0_MCSM0, 0x18);
	halSpiWriteReg(CCxxx0_FOCCFG, 0x16);
	halSpiWriteReg(CCxxx0_BSCFG, 0x6C);
	halSpiWriteReg(CCxxx0_AGCCTRL2, 0x43);
	halSpiWriteReg(CCxxx0_AGCCTRL0, 0x91);
	halSpiWriteReg(CCxxx0_FSCAL3, 0xe9);
	halSpiWriteReg(CCxxx0_FSCAL2, 0x2A);
	halSpiWriteReg(CCxxx0_FSCAL0, 0x1F);
	halSpiWriteReg(CCxxx0_FSTEST, 0x59);
	halSpiWriteReg(CCxxx0_TEST2, 0x81);
	halSpiWriteReg(CCxxx0_TEST1, 0x35);
	halSpiWriteReg(CCxxx0_TEST0, 0x09);
	halSpiWriteReg(CCxxx0_IOCFG2, 0x29);
	halSpiWriteReg(CCxxx0_IOCFG0, 0x06);
	halSpiWriteReg(CCxxx0_PKTCTRL1, 0x04);//CRC AUTOFLUSH;ADDRESS CHECK
	halSpiWriteReg(CCxxx0_PKTCTRL0, 0x05);
	halSpiWriteReg(CCxxx0_ADDR, 0x00);
	halSpiWriteReg(CCxxx0_PKTLEN, 0xFF);
	if(halSpiReadReg(CCxxx0_MDMCFG3)!=0x83)
		return 1; //err
	else
		return 0;	//no err
}


/***********************************************************************************
延时L毫秒
IN:L
OUT:NONE
************************************************************************************/
void Dly1mS(unsigned int l)
{
	int i;
	while(l--)
		for(i=0;i<256;i++);
}


/****************************************************************************
	This routine sets up  SPI transfer
****************************************************************************/
/*void SetupSPI(void)
{
      //USIPE7:P_SO	USIPE6:P_SI	USIPE5:P_SCLK
       WDTCTL = WDTPW + WDTHOLD;
  	USICTL0 |= USIPE7 +  USIPE6 + USIPE5 + USIMST + USIOE; // Port, SPI master
  	USICKCTL = USIDIV_0 + USISSEL_2;      // /16 SMCLK
  	USICTL0 &= ~USISWRST;                 // USI released for operation
  	P1DIR &= 0X7F;	//P1.7 input
  	P1DIR |= 0X60;	//P1.6 and P1.5 output
}*/

//============================================================
/*BYTE SPI_write(BYTE value)
{
	USICTL1 &= ~USIIFG;
	USISRL = value;
	USICNT = 8;
	while ((USICTL1 & USIIFG)==0);	//wait until USIIGF is set
	return(USISRL);
}*/

//===============================================================
/*BYTE SPI_read()
{
	USICTL1 &= ~USIIFG;
	USISRL = 0xFF;			//dummy write
	USICNT = 8;
	while ((USICTL1 & USIIFG)==0);	//wait until USIIGF is set
	return(USISRL);
}*/



//================================================================
//
//	software spi
//
//=================================================================
BYTE SPI_write(BYTE value)
{
	unsigned char i,spi_status;
	for(i=0;i<8;i++)
	{
		P1OUT &= ~P_SCLK; //P_SCLK=0;
		if(value&0x80)
			  P1OUT |= P_SI;  //P_SI=1;
		else
			  P1OUT &= ~P_SI; //P_SI=0;
		value <<=1;
    		P1OUT |= P_SCLK; //P_SCLK=1;
		spi_status<<=1;
		if(P1IN & P_SO)
		   spi_status |= 0x01;
		else
		   spi_status &= ~0x01;
	}
	P1OUT &= ~P_SCLK;  //P_SCLK=0;
	return(spi_status);
}

//--------------------------------------------------------------------
BYTE SPI_read()
{
	unsigned char i,value;
	for(i=0;i<8;i++)
	{
		value <<=1;
		P1OUT |= P_SCLK; //P_SCLK=1;
		if(P1IN & P_SO) value |= 0x01;
		else value &= ~0x01;

		P1OUT &= ~P_SCLK;  //P_SCLK=0;
    asm("nop"); asm("nop");
	}

	return value;
}


/*****************************************************************************************
 use hardware spi
 BYTE halSpiReadReg(BYTE addr)

 DESCRIPTION:
     This function gets the value of a single specified CCxxx0 register.
	通过SPI读单个寄存器的数据
 ARGUMENTS:
     BYTE addr
         Address of the CCxxx0 register to be accessed.

 RETURN VALUE:
     BYTE
         Value of the accessed CCxxx0 register.
******************************************************************************************/
BYTE halSpiReadReg(BYTE addr)
{
	unsigned char value;
	P1OUT &= ~P_CSn;		//P_CSn=0;
	while(P1IN & P_SO);	//P_SO=1
	addr|=READ_SINGLE;
	SPI_write(addr);
	value=SPI_read();
	P1OUT |= P_CSn;			//P_CSn=1;
	return value;
}



/*****************************************************************************************
  void halSpiWriteReg(BYTE addr, BYTE value)

  DESCRIPTION:
      Function for writing to a single CCxxx0 register
		通过SPI写数据到一个寄存器
  ARGUMENTS:
      BYTE addr
          Address of a specific CCxxx0 register to accessed.
      BYTE value
          Value to be written to the specified CCxxx0 register.
*****************************************************************************************/
void halSpiWriteReg(BYTE addr, BYTE value)
{
	P1OUT &= ~P_CSn;	//P_CSn=0;
	while(P1IN & P_SO);	//P_SO=1

	addr&=0x7F;
	SPI_write(addr);
	SPI_write(value);

	P1OUT |= P_CSn;			//P_CSn=1;

}


/*****************************************************************************************
 BYTE halSpiReadStatus(BYTE addr)

 DESCRIPTION:
     This function reads a CCxxx0 status register.
	通过SPI读RF的状态
 ARGUMENTS:
     BYTE addr
         Address of the CCxxx0 status register to be accessed.

 RETURN VALUE:
     BYTE
         Value of the accessed CCxxx0 status register.
*****************************************************************************************/
BYTE halSpiReadStatus(BYTE addr)
{
	unsigned char value;
	P1OUT &= ~P_CSn;		//P_CSn=0
	while(P1IN & P_SO);	//P_SO=1

	addr|=READ_BURST;
	SPI_write(addr);
	value=SPI_read();
	P1OUT |= P_CSn;			//P_CSn=1;
	return value;
}


/*****************************************************************************************
 void halSpiReadBurstReg(BYTE addr, BYTE *buffer, BYTE count)

 DESCRIPTION:
     This function reads multiple CCxxx0 register, using SPI burst access.
	读多个寄存器的数据
 ARGUMENTS:
     BYTE addr
         Address of the first CCxxx0 register to be accessed.
     BYTE *buffer
         Pointer to a byte array which stores the values read from a
         corresponding range of CCxxx0 registers.
     BYTE count
         Number of bytes to be written to the subsequent CCxxx0 registers.
*****************************************************************************************/
void halSpiReadBurstReg(BYTE addr, BYTE *buffer, BYTE count)
{
	unsigned char j,value;
	P1OUT &= ~P_CSn;	//P_CSn=0;
	while(P1IN & P_SO);	//P_SO=1

	addr|=READ_BURST;
	SPI_write(addr);
	for(j=0;j<count;j++)
	{
	  value=SPI_read();
	  buffer[j]=value;
	}
	P1OUT |= P_CSn;			//P_CSn=1;
}



/*****************************************************************************************
  void halSpiWriteBurstReg(BYTE addr, BYTE *buffer, BYTE count)

  DESCRIPTION:
      This function writes to multiple CCxxx0 register, using SPI burst access.
		写多个数据到RF寄存器里
  ARGUMENTS:
      BYTE addr
          Address of the first CCxxx0 register to be accessed.
      BYTE *buffer
          Array of bytes to be written into a corresponding range of
          CCxx00 registers, starting by the address specified in _addr_.
      BYTE count
          Number of bytes to be written to the subsequent CCxxx0 registers.
*******************************************************************************************/
void halSpiWriteBurstReg(BYTE addr, BYTE *buffer, BYTE count)
{
	unsigned char i,j,value;
	P1OUT &= ~P_CSn;	//P_CSn=0;
	while(P1IN & P_SO);	//P_SO=1
	addr|=WRITE_BURST;
	SPI_write(addr);
	for(j=0;j<count;j++)
	{
	  value=buffer[j];
	  SPI_write(value);

	  for(i=0;i<10;i++);
	}
	P1OUT |= P_CSn;		//P_CSn=1;
}




/*****************************************************************************************
 void halSpiStrobe(BYTE strobe)

 DESCRIPTION:
     Function for writing a strobe command to the CCxxx0
	写一个命令到RF
 ARGUMENTS:
     BYTE strobe
         Strobe command
******************************************************************************************/
void halSpiStrobe(BYTE strobe)
{
	P1OUT &= ~P_CSn;	//P_CSn=0;
	while(P1IN & P_SO);	//P_SO=1
	SPI_write(strobe);

	P1OUT |= P_CSn;		//P_CSn=1;

}// halSpiStrobe


/*****************************************************************************************
  void halRfSendPacket(BYTE *txBuffer, UINT8 size)
	发送数据包
  ARGUMENTS:
      BYTE *txBuffer
          Pointer to a buffer containg the data that are going to be transmitted

      UINT8 size
          The size of the txBuffer
*****************************************************************************************/
BYTE halRfSendPacket(unsigned char *txBuffer, unsigned char size)
{
	unsigned char j;
        unsigned int i;
	halSpiStrobe(CCxxx0_SIDLE);
	halSpiStrobe(CCxxx0_SFTX);
	halSpiWriteBurstReg(CCxxx0_TXFIFO, txBuffer, size);
	Dly1mS(1);
	halSpiStrobe(CCxxx0_STX);
	//WaitRxEndtime=0;
	j=size*20;

	while((P1IN & P_GDO0)==0)     //Asserts when sync word has been sent/received
	{
		for(i=0;i<1000;i++);	//delay 1ms
		j--;
		if(j==0)
		{
			halSpiStrobe(CCxxx0_SIDLE);//不发射,退出
			return 1;
		}
	}

	j=size*20;
	while(P1IN & P_GDO0)		//de-asserts at the end of the packet
	{
		Dly1mS(1);
		j--;
		if(!j)
		{
			halSpiStrobe(CCxxx0_SIDLE);
			return 1;
		}
	}
	return 0;
}// halRfSendPacket



/*****************************************************************************************
  BOOL halRfReceivePacket(BYTE *rxBuffer, UINT8 *length)
	接收数据包

  ARGUMENTS:
      BYTE *rxBuffer
          Pointer to the buffer where the incoming data should be stored
      UINT8 *length
          Pointer to a variable containing the size of the buffer where the incoming data should be
          stored. After this function returns, that variable holds the packet length.

  RETURN VALUE:
      BOOL
          TRUE:   CRC OK
          FALSE:  CRC NOT OK
*******************************************************************************************/
BYTE halRfReceivePacket(BYTE *rxBuffer, UINT8 length)
{
    unsigned char j;
	halSpiStrobe(CCxxx0_SRX);
	Dly1mS(1);
	if(halSpiReadStatus(CCxxx0_RXBYTES)==0) return 0;
	Dly1mS(2);

	j=length*20;
	while((halSpiReadStatus(CCxxx0_MARCSTATE)&0x1f)!=0x01)
	{

		Dly1mS(1);
		j--;
		if(!j)
		{
			halSpiStrobe(CCxxx0_SIDLE);
			halSpiStrobe(CCxxx0_SFRX);
			return 0;
		}
	}

    	PacketLength = halSpiReadReg(CCxxx0_RXFIFO);
    	if((PacketLength<0x20) && (PacketLength>0))
		{
			halSpiReadBurstReg(CCxxx0_RXFIFO, rxBuffer, PacketLength);

        	// Read the 2 appended status bytes (status[0] = RSSI, status[1] = LQI)
            halSpiReadBurstReg(CCxxx0_RXFIFO, status, 2);
        	return (status[1] & CRC_OK);
    	}
		else
		{
			halSpiStrobe(CCxxx0_SIDLE);
			halSpiStrobe(CCxxx0_SFRX);
        	return 0;
		}
}


//-------------------------------------------------------------
//	通过写NOP获得RF的状态
//-------------------------------------------------------------
/*BYTE spiGetRxTxStatus(void)
{
	unsigned char RxTxstatus;
	P1OUT &= ~P_CSn;			//P_CSn = 0;
	while (P1IN & P_SO);
	RxTxstatus=SPI_write(CCxxx0_SNOP);

	P1OUT |= P_CSn;				//P_CSn=1;
    return(RxTxstatus);
}*/



//----------------------------------------------------------------
//	复位RF
//----------------------------------------------------------------
void POWER_UP_RESET_CCxxx0()
{
	unsigned int i;
	halSpiStrobe(CCxxx0_SIDLE);
	P1OUT |= P_CSn;
	for(i=0;i<50;i++);
	P1OUT &= ~P_CSn;
	for(i=0;i<50;i++);
	P1OUT |= P_CSn;
	for(i=0;i<800;i++);
	P1OUT &= ~P_CSn;
	while(P1IN & P_SO);
	halSpiStrobe(CCxxx0_SRES);
	P1OUT |= P_CSn;
}

⌨️ 快捷键说明

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