📄 接收.c
字号:
#include <msp430x14x.h>
#include <stdlib.h>
#include "CC1101_h.h"
#define CSn_PIN BIT5
#define GDO0_PIN BIT4
#define SPI_SOMI BIT2 //(和GDO1为同一个脚)
#define SPI_CLK BIT1
#define SPI_SIMO BIT0
//unsigned char txBuffer[LENGTH_ID];
unsigned char rxBuffer[LENGTH+2];
unsigned char RxFlag;
//-----------------------------------------------------------------------------
unsigned char SPI_bitbang_out(unsigned char value)
{
unsigned char i;
unsigned char rTemp;
for(i = 0; i < 8; i++)
{
P1OUT &=~SPI_CLK; //CLK=0 Set clock low
if(value & 0x80)P1OUT |= SPI_SIMO; // SIMO=1 Set SIMO high...
else P1OUT &= ~SPI_SIMO; // SIMO=0 Set SIMO low...
value = value << 1;
P1OUT |= SPI_CLK; //CLK=1 Set clock high
rTemp <<= 1;
if(P1IN & SPI_SOMI) rTemp |= 0x01;
else rTemp &= 0xfe;
}
P1OUT &=~SPI_CLK; //CLK=0 Set clock low
return(rTemp);
}
//------------------------------------------------------------------------------------
// Input eight-bit value using selected bit-bang pins
unsigned char SPI_bitbang_in(void)
{
unsigned char i;
unsigned char rTemp;
for(i = 8; i > 0; i--)
{
P1OUT |= SPI_CLK; //CLK=1 Set clock high
rTemp <<= 1;
if(P1IN & SPI_SOMI)rTemp |= 0x01;
else rTemp &= 0xfe;
P1OUT &=~SPI_CLK; //CLK=0 Set clock low
}
return(rTemp);
}
void SPIWriteReg(unsigned char addr, unsigned char value)
{
P1OUT &=~CSn_PIN; //CS=0 CS enable
while (P1IN & SPI_SOMI); // Wait for CCxxxx ready
SPI_bitbang_out(addr); // Send address
SPI_bitbang_out(value); // Send data
P1OUT |= CSn_PIN; //CS=1 CS disable
}
void SPIWriteBurstReg(unsigned char addr, unsigned char *buffer, unsigned char count)
{
unsigned char i;
P1OUT &=~CSn_PIN; //CS=0 CS enable
while (P1IN & SPI_SOMI); // Wait for CCxxxx ready
SPI_bitbang_out(addr | CCxxx0_WRITE_BURST); // Send address
for (i = 0; i < count; i++)
{
SPI_bitbang_out(buffer[i]); // Send data
}
P1OUT |= CSn_PIN; //CS=1 CS disable
}
//*******************************************************
unsigned char SPIRead(unsigned char addr, unsigned char falg_read)
{
unsigned char rTemp;
P1OUT &=~CSn_PIN; //CS=0 CS enable
while (P1IN & SPI_SOMI); // Wait for CCxxxx ready
SPI_bitbang_out(addr | falg_read); // Send address
rTemp = SPI_bitbang_in(); // Read data
P1OUT |= CSn_PIN; //CS=1 CS disable
return ( rTemp );
}
void SPIReadBurstReg(unsigned char addr, unsigned char *buffer, unsigned char count)
{
unsigned char i;
P1OUT &=~CSn_PIN; //CS=0 CS enable
while (P1IN & SPI_SOMI); // Wait for CCxxxx ready
SPI_bitbang_out(addr | CCxxx0_READ_BURST); // Send address
for (i = 0; i < count; i++)
{
buffer[i] = SPI_bitbang_in(); // Read data
}
P1OUT |= CSn_PIN; //CS=1 CS disable
}
unsigned char SPIStrobe(unsigned char strobe)
{
unsigned char RxTxstatus;
P1OUT &=~CSn_PIN; //CS=0 CS enable
while (P1IN & SPI_SOMI); // Wait for CCxxxx ready
RxTxstatus = SPI_bitbang_out(strobe); // Send strobe
P1OUT |= CSn_PIN; //CS=1 CS disable
return(RxTxstatus);
}
void PowerupResetCCxxxx(void)
{
P1OUT &=~SPI_CLK; //CLK=0 Set clock low
P1OUT &= ~SPI_SIMO; // SIMO=0 Set SIMO low...
P1OUT |= CSn_PIN; //CS=1 CS disable
_NOP();_NOP();_NOP();_NOP();_NOP();
P1OUT &=~CSn_PIN; //CS=0 CS enable
_NOP();_NOP();_NOP();_NOP();_NOP();
P1OUT |= CSn_PIN; //CS=1 CS disable
_NOP();_NOP();_NOP();_NOP();_NOP();
P1OUT &=~CSn_PIN; //CS=0 CS enable
while (P1IN & SPI_SOMI); // Wait for CCxxxx ready
SPI_bitbang_out(CCxxx0_SRES);
while (P1IN & SPI_SOMI); // Wait for CCxxxx ready
P1OUT |= CSn_PIN; //CS=1 CS disable
}
/*
void TxData(void) //先采用查询发送
{
P1IE &= ~GDO0_PIN; //关闭GDO0中断
txBuffer[0] = 0;
txBuffer[1] = 0x22;
txBuffer[2] = 0x77;
txBuffer[3] = 0xdd;
SPIStrobe(CCxxx0_SFTX); //刷新TX_FIFO
SPIWriteBurstReg(CCxxx0_TXFIFO, txBuffer, LENGTH_ID ); // Write TX data; LENGTH_ID == 4
SPIStrobe(CCxxx0_STX); // Change state to TX, initiatingdata transfer
while (!( P1IN& GDO0_PIN)); // Wait GDO0 to go hi -> sync TX'ed
while ( P1IN& GDO0_PIN); // Wait GDO0 to clear -> end of pkt
P1IFG &= ~GDO0_PIN; // After pkt TX, this flag is set, Clear it.
P1IE |= GDO0_PIN; //开GDO0中断
}*/
const unsigned char ConfigurationCCxxx0_433[47]=
{
//Data :Reg: Name (x = non-default)
0x29, //00 IOCFG2 (x)
0x2E, //01 IOCFG1
0x06, //02 IOCFG0D (x)
0x47, //03 FIFOTHR (x)
0xD3, //04 SYNC1
0x91, //05 SYNC0
LENGTH, //06 PKTLEN (x) //最大长度 PKTLEN (x)
0x06, //07 PKTCTRL1 (x) //有地址,广播地址为0x00
0x05, //08 PKTCTRL0 (x) // CRC calculation in TX and CRC check in RX enabled
//可变长度
0x00, //09 ADDR (x) //设自己的地址
0x00, //0A CHANNR (x)
0x06, //0B FSCTRL1 (x) //*电流与灵敏度有关 IF Frequency -> FREQ_IF[4:0] => 152.34 kHz
0x00, //0C FSCTRL0 (x)
0x10, //0D FREQ2 (x)
0xa7, //0E FREQ1 (x) //f = 432.999817@0x10a762
0x62, //0F FREQ0 (x)
0xCA, //10 MDMCFG4 (x)
0x83, //11 MDMCFG3 (x)
0x12, //12 MDMCFG2 (x) " 12 == 16/16 sync word bits detected "
0x22, //13 MDMCFG1 (x) " Number of preamble bytes == 4"
0xF8, //14 MDMCFG0 (x)
0x34, //15 DEVIATN (x)
//**************************************************************************************************************************************************************
0x07, //0x13,//0x1E, //16 MCSM2
//*低功耗有关 2008-05-24 改为0x13
// "bit4(RX_TIME_RSSI) ==1 is Direct RX termination based on RSSI measurement (carrier sense)."
// ==1 :使能载波检测,即没有载波信号时,立即退出RX状态
// ==0 : 直到RX_TIME溢出,退出RX状态
// "bit3(RX_TIME_QUAL) ==1 is When the RX_TIME timer expires,the chip checks if either sync word is found or PQI is set.
// ==0 is .............................., the chip checks if sync word is found.
//==1: RX_TIME溢出时如果收到 sync word 或者PQI is set,则继续接收 ,否则退出接收状态
//==0: RX_TIME溢出时如果收到 sync word,则继续接收 ,否则退出接收状态 2008-05-24改为0
// "bit2--0 == 6 : 0.195% @ WOR_RES=0"
// "bit2--0 == 3 : 2.441ppm @ WOR_RES=1"
//*************************************************************************************************************
0x30, //17 MCSM1 //接收和发射后进入空闲状态
0x18, //18 MCSM0 (x) // 0x18 == Calibration from IDLE to TX/Rx
0x16, //19 FOCCFG (x)
0x6C, //1A BSCFG (x)
//****************************************************************************************************
0x43, //1B AGCCTRL2 (x)
//bit7-6 ( MAX_DVGA_GAIN[1:0] ) == 01: The highest gain setting can not be used
//bit5-3 ( MAX_LNA_GAIN[2:0] ) == 000: Maximum possible LNA + LNA 2 gain
//bit2-0 ( MAGN_TARGET[2:0] ) == 011: 33 dB == Target amplitude from channel filter
//******************************************************************************************************
0x40,//0x43, //1C AGCCTRL1 (x)
//bit7 == 0: 固定为0
//bit6 == 1: 固定为1
//bit5-4 ( CARRIER_SENSE_REL_THR[1:0] ) == 00 : Relative carrier sense threshold disabled
//bit3-0 ( CARRIER_SENSE_ABS_THR[3:0] ) == 011 : 3 dB above MAGN_TARGET setting
//当大于 " MAGN_TARGET setting " 3dB 时 ,表示有载波
//2008-05-20改为0x10 先测试
//****************************************************************************************************
0x91, //1D AGCCTRL0 (x)
0x0a,//0xff, //1E WOREVT1 // t_E0 = (750/26000000)*EVT0 = 1890.4ms
0x94,//0xff, //1F WOREVT0 // t_E0 = (750/26000000)*EVT0 *32 = 2500ms 2008-05-24
//**************************************************************************************************
0x39,//0x38, //20 WORCTRL
//bit7 ==0: 使能RC, When written to 0, automatic initial calibration will be performed,
//bit6-4: EVENT1[]= 3 is 12
//bit3 ==1: Enables the RC oscillator calibration.
//bit2-0 == 0: WOR_RES=0
//bit2-0 == 1: WOR_RES=1 2008-05-24
//*************************************************************************************************
0x56, //21 FREND1 (x)
0x10, //22 FREND0 (x) //选择功率使用的pdat值//!!!出错会引起输出功率为0
0xE9, //23 FSCAL3 (x)
0x2A, //24 FSCAL2 (x)
0x00, //25 FSCAL1 (x)
0x1F, //26 FSCAL0 (x)
0x41, //27 RCCTRL1
0x00, //28 RCCTRL0
0x59, //29 FSTEST (x)
0x7F, //2A PTEST
0x3F, //2B AGCTST
0x81, //2C TEST2 (x)
0x35, //2D TEST1 (x)
0x09 //2E TEST0 (x)
};
void writeRFSettings(void)
{
unsigned char i;
for(i=0; i<47; i++)
{
SPIWriteReg(i,ConfigurationCCxxx0_433[i]);
}
}
unsigned int temp;
void main (void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P1SEL = 0;
P1DIR |= SPI_SIMO + SPI_CLK + CSn_PIN ; //为输出
P1DIR &= ~( SPI_SOMI +GDO0_PIN ); //为输入
P1OUT &= ~(SPI_SIMO + SPI_CLK );
P1OUT |= CSn_PIN;
P4DIR |= BIT7;
//******************************************************************************
PowerupResetCCxxxx(); // Reset CCxxxx
writeRFSettings(); // Write RF settings to config reg
SPIWriteReg(CCxxx0_PATABLE , PA_VALE); //Write PATABLE,设置输出功率
//*********************************************************************
P1IES |= GDO0_PIN; //使能GDO0中断发生在下降沿
P1IFG = 0x00;
P1IE |= GDO0_PIN;
_EINT(); //使能全局中断
SPIStrobe(CCxxx0_SIDLE); //cc1101退出SWOR
SPIStrobe(CCxxx0_SFTX);
SPIStrobe(CCxxx0_SRX); //进入接收
while(1)
{
if(RxFlag == 99)
{
RxFlag = 0; //表示收到数据,数据在 rxBuffer
for(temp=0; temp<0xffe; temp++);
for(temp=0; temp<0x3c; temp++)
{
rxBuffer[temp] = 0;
}
P4OUT &= ~BIT7;
SPIStrobe(CCxxx0_SIDLE);//cc1101退出SWOR
SPIStrobe(CCxxx0_SFTX);
SPIStrobe(CCxxx0_SRX); //进入接收
}
_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
}
}
//***********************************************
interrupt[PORT1_VECTOR] void p1_ISR (void)
{
unsigned int length;
unsigned int getlen;
unsigned char addr;
unsigned char *status;
if(P1IFG & GDO0_PIN)
{
RxFlag = 11;
while( SPIRead(CCxxx0_RXBYTES, READ_STATUS) & CCxxx0_NUM_RXBYTES) // 判断CCxxx0_RXBYTES 是否为空
{
length = SPIRead(CCxxx0_RXFIFO ,CCxxx0_READ_SINGLE); //长度=地址(1)+数据(20)
_NOP();
if(length == 21)
{
// addr = SPIRead(CCxxx0_RXFIFO ,READ_REG ); //接收 地址
// getlen = length-1;
// _NOP();
SPIReadBurstReg(CCxxx0_RXFIFO, rxBuffer, length); // Pull data(数据-地址)
// if(rxBuffer[length] & CCxxx0_CRC_OK ) // CCxxx0_CRC_OK == 0x80 (第22个字节RSSI的最高位)
SPIReadBurstReg(CCxxx0_PKTSTATUS,status,1);
if(*status & CCxxx0_CRC_OK )
{
RxFlag = 99; //收到crc效验正确的数据
P4OUT ^= BIT7;
break;
}
}
}
}
_NOP();
P1IFG = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -