该模块只需要发送,用的单片机为AT90S2313。程序如下:
#define CS_ON PORTD&=~(1<PD3)
#define CS_OFF PORTD|=(1<PD3)
#define SCK_ON PORTD|=(1<PD4)
#define SCK_OFF PORTD&=~(1<PD4)
#define MOSI_ON PORTD|=(1<PD5)
#define MOSI_OFF PORTD&=~(1<PD5)
typedef struct S_RF_SETTINGS
{
INT8U FSCTRL2; //
INT8U FSCTRL1; // Frequency synthesizer control.
INT8U FSCTRL0; // Frequency synthesizer control.
INT8U FREQ2; // Frequency control word, high INT8U.
INT8U FREQ1; // Frequency control word, middle INT8U.
INT8U FREQ0; // Frequency control word, low INT8U.
INT8U MDMCFG4; // Modem configuration.
INT8U MDMCFG3; // Modem configuration.
INT8U MDMCFG2; // Modem configuration.
INT8U MDMCFG1; // Modem configuration.
INT8U MDMCFG0; // Modem configuration.
INT8U CHANNR; // Channel number.
INT8U DEVIATN; // Modem deviation setting (when FSK modulation is enabled).
INT8U FREND1; // Front end RX configuration.
INT8U FREND0; // Front end RX configuration.
INT8U MCSM0; // Main Radio Control State Machine configuration.
INT8U FOCCFG; // Frequency Offset Compensation Configuration.
INT8U BSCFG; // Bit synchronization Configuration.
INT8U AGCCTRL2; // AGC control.
INT8U AGCCTRL1; // AGC control.
INT8U AGCCTRL0; // AGC control.
INT8U FSCAL3; // Frequency synthesizer calibration.
INT8U FSCAL2; // Frequency synthesizer calibration.
INT8U FSCAL1; // Frequency synthesizer calibration.
INT8U FSCAL0; // Frequency synthesizer calibration.
INT8U FSTEST; // Frequency synthesizer calibration control
INT8U TEST2; // Various test settings.
INT8U TEST1; // Various test settings.
INT8U TEST0; // Various test settings.
INT8U IOCFG2; // GDO2 output pin configuration
INT8U IOCFG0; // GDO0 output pin configuration
INT8U PKTCTRL1; // Packet automation control.
INT8U PKTCTRL0; // Packet automation control.
INT8U ADDR; // Device address.
INT8U PKTLEN; // Packet length.
} RF_SETTINGS;
void OpenSpi()
{
SCK_OFF;
MOSI_OFF;
CS_ON;
while (PIND&(1<<6));
}
void CloseSpi()
{
CS_OFF;
}
void SPI_WriteByte(unsigned char Data)
{
unsigned char i;
for (i=0; i<8; i++)
{
if (Data&0x80)
MOSI_ON;
else
MOSI_OFF;
_NOP();
_NOP();
_NOP();
SCK_ON;
_NOP();
_NOP();
_NOP();
_NOP();
SCK_OFF;
Data<<=1;
}
}
unsigned char SPI_ReadByte()
{
unsigned char i;
unsigned char Data;
for (i=0; i<8; i++)
{
Data<<=1;
_NOP();
_NOP();
SCK_ON;
if (PIND&(1<<6))
Data |= 0x01;
else
Data &= 0xfe;
_NOP();
_NOP();
_NOP();
_NOP();
SCK_OFF;
_NOP();
_NOP();
}
return Data;
}
void halWait(INT16U timeout) {
do {
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
} while (--timeout);
}// halWait
void RESET_CC2500(void)
{
OpenSpi();
while (PIND&(1<<6));
SPI_WriteByte(CCxxx0_SRES);
CloseSpi();
}
void POWER_UP_RESET_CCxxx0(void)
{
CloseSpi();
halWait(1);
OpenSpi();
halWait(1);
CloseSpi();
halWait(41);
RESET_CC2500();
}
//<主机通过SPI接口向CC2500配置寄存器读写入信息>
INT8U halSpiReadReg(INT8U addr)
{
INT8U temp, value;
temp = addr|READ_SINGLE; //读寄存器命令
OpenSpi();
while (PIND&(1<<6));
SPI_WriteByte(temp);
value = SPI_ReadByte(0);
CloseSpi();
return value;
}
void halSpiWriteReg(INT8U addr, INT8U value)
{
OpenSpi();
while(PIND&(1<<6));
SPI_WriteByte(addr); //写地址
SPI_WriteByte(value); //写入配置
CloseSpi();
}
void halSpiStrobe(BYTE strobe)
{
INT8U temp;
temp = strobe;
OpenSpi();
while (PIND&(1<<6));
SPI_WriteByte(temp);
CloseSpi();
}
void halSpiWriteBurstReg(BYTE addr, BYTE *buffer, BYTE count)
{
INT8U i,temp;
temp = addr | WRITE_BURST;
OpenSpi();
while (PIND&(1<<6));
SPI_WriteByte(temp);
for (i = 0; i < count; i++)
{
SPI_WriteByte(buffer);
}
CloseSpi();
}
// 配置RF2500
void halRfWriteRfSettings(RF_SETTINGS *pRfSettings)
{
halSpiWriteReg(CCxxx0_FSCTRL0, pRfSettings->FSCTRL2); // Write register settings
halSpiWriteReg(CCxxx0_FSCTRL1, pRfSettings->FSCTRL1);
halSpiWriteReg(CCxxx0_FSCTRL0, pRfSettings->FSCTRL0);
halSpiWriteReg(CCxxx0_FREQ2, pRfSettings->FREQ2);
halSpiWriteReg(CCxxx0_FREQ1, pRfSettings->FREQ1);
halSpiWriteReg(CCxxx0_FREQ0, pRfSettings->FREQ0);
halSpiWriteReg(CCxxx0_MDMCFG4, pRfSettings->MDMCFG4);
halSpiWriteReg(CCxxx0_MDMCFG3, pRfSettings->MDMCFG3);
halSpiWriteReg(CCxxx0_MDMCFG2, pRfSettings->MDMCFG2);
halSpiWriteReg(CCxxx0_MDMCFG1, pRfSettings->MDMCFG1);
halSpiWriteReg(CCxxx0_MDMCFG0, pRfSettings->MDMCFG0);
halSpiWriteReg(CCxxx0_CHANNR, pRfSettings->CHANNR);
halSpiWriteReg(CCxxx0_DEVIATN, pRfSettings->DEVIATN);
halSpiWriteReg(CCxxx0_FREND1, pRfSettings->FREND1);
halSpiWriteReg(CCxxx0_FREND0, pRfSettings->FREND0);
halSpiWriteReg(CCxxx0_MCSM0 , pRfSettings->MCSM0 );
halSpiWriteReg(CCxxx0_FOCCFG, pRfSettings->FOCCFG);
halSpiWriteReg(CCxxx0_BSCFG, pRfSettings->BSCFG);
halSpiWriteReg(CCxxx0_AGCCTRL2, pRfSettings->AGCCTRL2);
halSpiWriteReg(CCxxx0_AGCCTRL1, pRfSettings->AGCCTRL1);
halSpiWriteReg(CCxxx0_AGCCTRL0, pRfSettings->AGCCTRL0);
halSpiWriteReg(CCxxx0_FSCAL3, pRfSettings->FSCAL3);
halSpiWriteReg(CCxxx0_FSCAL2, pRfSettings->FSCAL2);
halSpiWriteReg(CCxxx0_FSCAL1, pRfSettings->FSCAL1);
halSpiWriteReg(CCxxx0_FSCAL0, pRfSettings->FSCAL0);
halSpiWriteReg(CCxxx0_FSTEST, pRfSettings->FSTEST);
halSpiWriteReg(CCxxx0_TEST2, pRfSettings->TEST2);
halSpiWriteReg(CCxxx0_TEST1, pRfSettings->TEST1);
halSpiWriteReg(CCxxx0_TEST0, pRfSettings->TEST0);
halSpiWriteReg(CCxxx0_IOCFG2, pRfSettings->IOCFG2);
halSpiWriteReg(CCxxx0_IOCFG0, pRfSettings->IOCFG0);
halSpiWriteReg(CCxxx0_PKTCTRL1, pRfSettings->PKTCTRL1);
halSpiWriteReg(CCxxx0_PKTCTRL0, pRfSettings->PKTCTRL0);
halSpiWriteReg(CCxxx0_ADDR, pRfSettings->ADDR);
halSpiWriteReg(CCxxx0_PKTLEN, pRfSettings->PKTLEN);
}
//其中,rfSettings需要定义并按照需要初始化适当的值。比如配置如下:
// RF output power = 0 dBm
// RX filterbandwidth = 540.000000 kHz
// Deviation = 0.000000
// Datarate = 250.000000 kbps
// Modulation = (7) MSK
// Manchester enable = (0) Manchester disabled
// RF Frequency = 2480.000000 MHz
// Channel spacing = 199.951172 kHz
// Channel number = 0
// Optimization = Sensitivity
// Sync mode = (3) 30/32 sync word bits detected
// Format of RX/TX data = (0) Normal mode, use FIFOs for RX and TX
// CRC operation = (1) CRC calculation in TX and CRC check in RX enabled
// Forward Error Correction = (0) FEC disabled
// Length configuration = (1) Variable length packets, packet length configured by the first received byte after sync word.
// Packetlength = 255
// Preamble count = (2) 4 bytes
// Append status = 1
// Address check = (11) No address check
// FIFO autoflush = 0
// Device address = 0
// GDO0 signal selection = ( 6)
// GDO2 signal selection = (11) Serial Clock
const RF_SETTINGS rfSettings = {
0x00,
0x0B, // FSCTRL1 Frequency synthesizer control.
0x00, // FSCTRL0 Frequency synthesizer control.
0x10, // FREQ2 Frequency control word, high byte.
0xA7, // FREQ1 Frequency control word, middle byte.
0x62, // 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.
0x00, // CHANNR Channel number.
0x00, // DEVIATN Modem deviation setting (when FSK modulation is enabled).
0xB6, // FREND1 Front end RX configuration.
0x10, // FREND0 Front end RX 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.
0xEA, // FSCAL3 Frequency synthesizer calibration.
0x0A, // FSCAL2 Frequency synthesizer calibration.
0x00, // FSCAL1 Frequency synthesizer calibration.
0x11, // FSCAL0 Frequency synthesizer calibration.
0x59, // FSTEST Frequency synthesizer calibration.
0x88, // TEST2 Various test settings.
0x31, // TEST1 Various test settings.
0x0B, // TEST0 Various test settings.
0x0B, // IOCFG2 GDO2 output pin configuration.
0x06, // IOCFG0D GDO0 output pin configuration.
0x04, // PKTCTRL1 Packet automation control.
0x04, // PKTCTRL0 Packet automation control.
0x00, // ADDR Device address.
0x0c // PKTLEN Packet length.
};
BYTE paTable = 0xFE;
//使用CC2500发送数据
void halRfSendPacket(INT8U *txBuffer, INT8U size)
{
halSpiWriteReg(CCxxx0_TXFIFO, size);
halSpiWriteBurstReg(CCxxx0_TXFIFO, txBuffer, size);
//写入要发送的数据
halSpiStrobe(CCxxx0_STX); //进入发送模式发送数据
// Wait for GDO0 to be set -> sync transmitted
while (!(PIND&(1<<1)));
// Wait for GDO0 to be cleared -> end of packet
while (PIND&(1<<1));
halSpiStrobe(CCxxx0_SFTX);
}
void main(void)
{
Init();
POWER_UP_RESET_CCxxx0();
halRfWriteRfSettings(&rfSettings);
halSpiWriteReg(CCxxx0_PATABLE, paTable);
while(1)
{
keynum=GetKey(0);
if(!keynum)
halRfSendPacket(keynum,1);
}
}
void Init(void) //初始化串行口和波特率发生器
{
PORTB=0xF0;
PORTD=0x08;
DDRB=0x0F;
DDRD=0xBB;
}
主程序就是一个键盘扫描程序,然后将按下的键通过CC2500发送。
上电后,GDO0脚一直输出方波。不知道程序哪儿有问题,请大家帮帮忙! |