📄 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 + -