无线模块CC2500的应用例程

#include "fly8000.h"
#include "CC2500.h"

pdata uint8 CC2500_TxRxBuf[1+CC2500_DATA_LEN ]; //CC2500_DATA_LEN=32;but 61中是64;
pdata uint8 CC2500_TxAddr = 0x01;
pdata uint8 CC2500_RxAddr = 0x01;
code PaTabel[8] = {0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60};

//--------------------------CC2500 寄存器配置---------------------------------
code CC2500_RF_SETTINGS CC2500_Config =
{
0x0B, // IOCFG2 GDO2 output pin configuration.
0x06, //IOCFG1
0x06, // IOCFG0 GDO0 output pin configuration.
0x07, //FIFOTHR
0xD3, //SYNC1 MSB
0x91, //SYNC0 LSB
1+CC2500_DATA_LEN, // PKTLEN Packet length.
0x02, // PKTCTRL1 Packet automation control.
0x04, // PKTCTRL0 Packet automation control.
0x01, // ADDR Device address.

0x00, // CHANNR Channel number.
0x07, // FSCTRL1 Frequency synthesizer control.
0x00, // FSCTRL0 Frequency synthesizer control.
0x5D, // FREQ2 Frequency control word, high byte.
0x93, // FREQ1 Frequency control word, middle byte.
0xB1, // FREQ0 Frequency control word, low byte.
0x2D, // MDMCFG4 Modem configuration.
0x3B, // MDMCFG3 Modem configuration.
0x73, // MDMCFG2 Modem configuration.
0x22, // MDMCFG1 Modem configuration.

0xF8, // MDMCFG0 Modem configuration.
0x47, // DEVIATN Modem deviation setting (when FSK modulation is enabled).
0x00, // MCSM2 Main Radio Control State Machine configuration.
0x02, // MCSM1 Main Radio Control State Machine configuration.
0x18, // MCSM0 Main Radio Control State Machine configuration.
0x1D, // FOCCFG Frequency Offset Compensation Configuration.
0x1C, // BSCFG Bit synchronization Configuration.
0xC7, // AGCCTRL2 AGC control.
0x00, // AGCCTRL1 AGC control.
0xB2, // AGCCTRL0 AGC control.

0x00, // WOREVT1
0x00, // WOREVT0
0x00, // WORCTRL
0xB6, // FREND1 Front end RX configuration.
0x10, // FREND0 Front end RX configuration.
0xEA, // FSCAL3 Frequency synthesizer calibration.
0x0A, // FSCAL2 Frequency synthesizer calibration.
0x00, // FSCAL1 Frequency synthesizer calibration.
0x11, // FSCAL0 Frequency synthesizer calibration.
0x00, //RCCTRL1

0x00, //RCCTRL0
0x59, // FSTEST Frequency synthesizer calibration.
0x00, //PTEST
0x00, //AGCTEST
0x88, // TEST2 Various test settings.
0x31, // TEST1 Various test settings.
0x0B, // TEST0 Various test settings.
};

//---------------------------CC2500射频芯片初始化函数--------------------------------------
void CC2500_Init(void)
{
CSN = 1;
delay_ms(1);
CSN = 0;
delay_ms(1);
CSN = 1;
delay_ms(1);

CSN = 0;
SPI_Write(CCxxx0_SRES); //写入复位命令 CCxxx0_SRES=0x30(Reset chip.)
CSN = 1;

CC2500_WriteReg(CCxxx0_FSCTRL1, CC2500_Config.FSCTRL1);
CC2500_WriteReg(CCxxx0_FSCTRL0, CC2500_Con

fig.FSCTRL0);
CC2500_WriteReg(CCxxx0_FREQ2, CC2500_Config.FREQ2);
CC2500_WriteReg(CCxxx0_FREQ1, CC2500_Config.FREQ1);
CC2500_WriteReg(CCxxx0_FREQ0, CC2500_Config.FREQ0);
CC2500_WriteReg(CCxxx0_MDMCFG4, CC2500_Config.MDMCFG4);
CC2500_WriteReg(CCxxx0_MDMCFG3, CC2500_Config.MDMCFG3);
CC2500_WriteReg(CCxxx0_MDMCFG2, CC2500_Config.MDMCFG2);
CC2500_WriteReg(CCxxx0_MDMCFG1, CC2500_Config.MDMCFG1);
CC2500_WriteReg(CCxxx0_MDMCFG0, CC2500_Config.MDMCFG0);
CC2500_WriteReg(CCxxx0_CHANNR, CC2500_Config.CHANNR);
CC2500_WriteReg(CCxxx0_DEVIATN, CC2500_Config.DEVIATN);
CC2500_WriteReg(CCxxx0_FREND1, CC2500_Config.FREND1);
CC2500_WriteReg(CCxxx0_FREND0, CC2500_Config.FREND0);
CC2500_WriteReg(CCxxx0_MCSM0 , CC2500_Config.MCSM0 );
CC2500_WriteReg(CCxxx0_FOCCFG, CC2500_Config.FOCCFG);
CC2500_WriteReg(CCxxx0_BSCFG, CC2500_Config.BSCFG);
CC2500_WriteReg(CCxxx0_AGCCTRL2, CC2500_Config.AGCCTRL2);
CC2500_WriteReg(CCxxx0_AGCCTRL1, CC2500_Config.AGCCTRL1);
CC2500_WriteReg(CCxxx0_AGCCTRL0, CC2500_Config.AGCCTRL0);
CC2500_WriteReg(CCxxx0_FSCAL3, CC2500_Config.FSCAL3);
CC2500_WriteReg(CCxxx0_FSCAL2, CC2500_Config.FSCAL2);
CC2500_WriteReg(CCxxx0_FSCAL1, CC2500_Config.FSCAL1);
CC2500_WriteReg(CCxxx0_FSCAL0, CC2500_Config.FSCAL0);
CC2500_WriteReg(CCxxx0_FSTEST, CC2500_Config.FSTEST);
CC2500_WriteReg(CCxxx0_TEST2, CC2500_Config.TEST2);
CC2500_WriteReg(CCxxx0_TEST1, CC2500_Config.TEST1);
CC2500_WriteReg(CCxxx0_TEST0, CC2500_Config.TEST0);
CC2500_WriteReg(CCxxx0_IOCFG2, CC2500_Config.IOCFG2);
CC2500_WriteReg(CCxxx0_IOCFG0, CC2500_Config.IOCFG0);
CC2500_WriteReg(CCxxx0_PKTCTRL1, CC2500_Config.PKTCTRL1);
CC2500_WriteReg(CCxxx0_PKTCTRL0, CC2500_Config.PKTCTRL0);
CC2500_WriteReg(CCxxx0_ADDR, CC2500_Config.ADDR);
CC2500_WriteReg(CCxxx0_PKTLEN, CC2500_Config.PKTLEN);

//CC2500_WriteBurstReg(CCxxx0_PATABLE, PaTabel, 8);
CC2500_Command(CCxxx0_SFRX);
CC2500_Command(CCxxx0_SFTX);
CC2500_Command(CCxxx0_SIDLE);


}

//---------------------------CC2500设置接收模式函数--------------------------------------
void CC2500_SetRxMode(void)
{
CC2500_Command(CCxxx0_SRX);
}

//---------------------------CC2500数据包接收函数--------------------------------------
uint8 CC2500_RxPacket(void)
{
if((1+CC2500_DATA_LEN) == CC2500_ReadReg(CCxxx0_RXBYTES|READ_BURST))
{
CC2500_ReadBurstReg(CCxxx0_RXFIFO, CC2500_TxRxBuf, 1+CC2500_DATA_LEN); //读出所有接收到的数据
return TRUE;
}
else
{
return FALSE;
}
}

//---------------------------CC2500数据包发送函数--------------------------------------
void CC2500_TxPacket(void)
{
//CC2500_WriteReg(CCxxx0_TXFIFO,1+CC2500_DATA_LEN);
CC2500_WriteBurstReg(CCxxx0_TXFIFO, CC2500_TxRxBuf,1+CC2500_DATA_LEN); //写入要发送的数据
CC2500_Command(CCxxx0_STX); //进入发送模式发送数据

while (!GDO0);// Wait for GDO0

to be set -> sync transmitted
while (GDO0);// Wait for GDO0 to be cleared -> end of packet

CC2500_Command(CCxxx0_SFTX); //刷新发送缓冲区
CC2500_Command(CCxxx0_SIDLE);
}

//---------------------------CC2500寄存器写入函数--------------------------------------
void CC2500_WriteReg(uint8 addr, uint8 value)
{
CSN = 0;
while (MISO);
SPI_Write(addr|WRITE_SINGLE); //写地址
SPI_Write(value); //写入配置
CSN = 1;
}
//---------------------------CC2500寄存器读取函数--------------------------------------
uint8 CC2500_ReadReg(uint8 addr)
{
uint8 value;
CSN = 0;
while (MISO);
SPI_Write(addr|READ_SINGLE);
value = SPI_Read();
CSN = 1;
return value;
}
//---------------------------CC2500寄存器连续写入函数--------------------------------------
void CC2500_WriteBurstReg(uint8 addr, uint8 *buffer, uint8 count)
{
uint8 i;
CSN = 0;
while (MISO);
SPI_Write(addr | WRITE_BURST);
for (i = 0; i < count; i++)
{
SPI_Write(buffer[i]);
}
CSN = 1;
}
//---------------------------CC2500寄存器连续读取函数--------------------------------------
void CC2500_ReadBurstReg(uint8 addr, uint8 *buffer, uint8 count)
{
uint8 i,temp;
CSN = 0;
while (MISO);
SPI_Write(addr | READ_BURST);
for (i = 0; i < count; i++)
{
buffer[i] = SPI_Read();
}
CSN = 1;
}
//----------------------------CC2500命令函数------------------------------
void CC2500_Command(uint8 cmd)
{
CSN = 0;
while (MISO);
SPI_Write(cmd); //写入命令
CSN = 1;
}

//---------------------------CC2500接收地址设置函数--------------------------------------
void CC2500_Write_RxADDR(void)
{
CC2500_WriteReg(CCxxx0_ADDR,CC2500_RxAddr);
}
//---------------------------CC2500发送地址设置函数--------------------------------------
void CC2500_Write_TxADDR(void)
{
CC2500_TxRxBuf[0] = CC2500_TxAddr;
}

//--------------------------SPI初始化函数---------------------------
void SPI_Init(void)
{
CSN = 1;
SCK = 0;
}

//--------------------------SPI单字节读取函数---------------------------
uint8 SPI_Read(void)
{
uint8 i,rxdata;
rxdata = 0x00;
for (i = 0;i < 8;i++)
{
rxdata = rxdata<<1;
MISO = 1;
SCK = 1;
if (MISO) //读取最高位,保存至最末尾,通过左移位完成整个字节
{
rxdata |= 0x01;
}
else
{
rxdata &= ~0x01;
}
_nop_();
_nop_();
SCK = 0;
_nop_();
_nop_();

}
return rxdata;
}

//----------------------------SPI单字节写入函数---------------------------
void SPI_Write(uint8 txdata)
{
uint8 i;
for (i = 0;i < 8;i++)
{
if (txdata&0x80) //总是发送最高位
{
MOSI = 1;
}
else
{
MOSI = 0;
}
SCK = 1;
_nop_();
_nop_();
txdata = txdata<<1;
SCK = 0;
_nop_();
_nop_();
}
}


相关文档
最新文档