锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

RF1100SE单片机C8051F310程序

时间:2024-05-15 08:07:15

#include
#include
#include
#include
#include

#define uint unsigned int
#define uchar unsigned char

#define BUSY SPI0CFG&0x80//SPI检测

code uchar PaTabel[]={0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60};//配置功率
uchar send_buf[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//要发送的有效数据,其中第一个为数据的长度
uchar rx_buf[8]={0}; //接收的数据缓存

//引脚定义*********************************************************************************
#define CSN_HIGH CSN=1
#define CSN_LOW CSN=0
sbit GDO0 =P0^6;
sbit CSN =P0^3;
sbit MISO =P0^1; //为了检测是否稳定
sbit c=P0^7;
//*****************************************************************************************
#define WRITE_BURST 0x40 //连续写入多个字节,即为突发访问
#define READ_SINGLE 0x80 //读一个字节
#define READ_BURST 0xC0 //连续读多个字节
#define BYTES_IN_RXFIFO 0x7F //接收缓冲区的有效字节数
#define CRC_OK 0x80 //CRC校验通过位标志
//*****************************************************************************************
//RF1100SE寄存器地址
#define IOCFG2 0x00
#define IOCFG1 0x01
#define IOCFG0 0x02
#define FIFOTHR 0x03
#define SYNC1 0x04
#define SYNC0 0x05
#define PKTLEN 0x06
#define PKTL1 0x07
#define PKTCTRL0 0x08
#define A 0x09
#define CHANNR 0x0a
#define FSCTRL1 0x0b
#define FSCTRL0 0x0c
#define FREQ2 0x0d
#define FREQ1 0x0e
#define FREQ0 0x0f

//配置寄存器
#define MFG4 0x10
#define MDMCFG3 0x11
#define MDMCFG2 0x12
#define MDMCFG1 0x13
#define MDMCFG0 0x14
#define DETN 0x15
#define MCSM2 0x16
#define MCSM1 0x17
#define MCSM0 0x18
#define FOCCFG 0x19
#define BSCFG 0x1a
#define AGCTRL2 0x1b
#define AGCTRL1 0x1c
#define AGCTRL0 0x1d
#define WOREVT1 0x1e
#define WOREVT0 0x1f

#define WORCTRL 0x20
#define FREND1 0x21
#define FREND0 0x22
#define FSCAL3 0x23
#define FSCAL2 0x24
#define FSCAL1 0x25
#define FSCAL0 0x26
#define RCCTRL1 0x27
#define RCCTRL0 0x28
#define FST 0x29
#define PTEST 0x2a
#define AGCTEST 0x2b
#define TEST2 0x2c
#define TEST1 0x2d
#define TEST0 0x2e

//状态寄存器
#define PARTNUM 0x30
#define VERSION 0x31
#define FREQEST 0x32
#define LQI 0x33
#define R 0x34
#define MARCST 0x35
#define WORTIME1 0x36
#define WORTIME0 0x37
#define PKT 0x38
#define VCOVCDAC 0x39
#define TXBYTES 0x3a
#define RXBYTES 0x3b
#define PATABLE 0x3e
#define TX_FIFO 0x3f
#define RX_FIFO 0x3f

//控制命令寄存器
#define SRES 0x30//重启芯片
#define SFSTXON 0x31//开启和校准频率合成器
#define SXOFF 0x32//关闭晶体
#define SCAL 0x33//校准频率合成器并关断
#define SRX 0x34//启用RX
#define STX 0x35//空闲状态时启用TX
#define SIDLE 0x36//离开RX/TX关断频率合成器并离开电磁波激活模式
#define SAFC 0x37//运行频率合成器的AFC调节
#define SWOR 0x38//运行自动RX选举序列
#define SPWD 0x39//当CSn为高时进入功率降低模式
#define SFRX 0x3a//冲洗RX_FIFO缓冲
#define SFTX 0x3b//冲洗TX_FIFO缓冲
#define SWORRST 0x3c//重新设置真实时间时钟
#define SNOP 0x3d//附加:软件扩充为两个字节

//函数声明*********************************************************************************
void sysclk(void);
void pio(void);
void SPI(void);
void Interrupt_int(void);
void delay(uint i);
void dat_int(void);
//*****************************************************************************************
uchar SPI_RW(uchar byte); //用SPI读写一字节的数据
void SPI_WR_Strobe(uchar strobe); //写入滤波命令
void POWER_UP_RESET_CC1100(void); //上电复位
uchar SPI_RW_Reg(uchar reg,uchar value); //向寄存器写一字节的数据,同时返回状态字
uchar SPI_Read_Reg(uchar reg); //从寄存器读一字节的数据
uchar SPI_Read_Buf(uchar reg,uchar *pBuf,uchar bytes); //从reg连续读出bytes字节的数据
uchar SPI_RW_Buf(uchar reg,uchar *pBuf,uchar bytes); //向reg连续写入bytes字节的数据
uchar RF1100CE_RxPacket(uchar *rx_buf,uchar *length); //接收函数
void RF1100CE_TxPacket(uchar *tx_buf,uchar size); //发送函数
void RF1100CE_Config(void); //RF1100CE的配置函数
//*****************************************************************************************
void main(void) //主程序
{uchar sta=0;
PCA0MD &= ~0x40;// 关闭看门狗
pio();
sysclk();
dat_int();
SPI(); //SPI0DAT是SPI的数据寄存器
Interrupt_int();
EA=0;

POWER_UP_RESET_CC1100();
RF1100CE_Config(); //RF1100CE的配置函数
SPI_RW_Buf(PATABLE,PaTabel,8); //对设备进行功率配置
delay(6000);

while(1)
{

RF1100CE_TxPacket(send_buf,8); //发送函数
c=1;
delay(100);

if(sta&0xff)
{
CSN_LOW;
SPI_RW(SFTX); //清除发送寄存器的值
CSN_HIGH;
}
}
}

void dat_int(void)
{
CSN_LOW;
_nop_();
CSN_HIGH;
c=0;
}


void sysclk(void) //内部晶振
{
OSCICL=0xb3; // 0xb3
OSCICN=0xc2; //二分频
CLKSEL=0x00;
}


//延时子函数10us
void delay(uint i)
{
while(i--);
}


uchar SPI_RW(uchar byte) //用SPI读写一字节的数据
{
uchar rbyte;
SPI0DAT=byte;
while(!SPIF);
rbyte=SPI0DAT;
SPIF=0;
return rbyte;
}

void SPI_WR_Strobe(uchar strobe) //写入滤波命令
{
CSN_LOW;
while (MISO);
SPI_RW(strobe);
while(MISO);
CSN_HIGH;
}


void POWER_UP_RESET_CC1100(void) //上电复位
{
CSN = 1;
delay(10);
CSN = 0;
delay(10);
CSN = 1;
delay(500);
SPI_WR_Strobe(SRES); //复位CC1100
}

uchar SPI_RW_Reg(uchar reg,uchar value) //向寄存器写一字节的数据,同时返回状态字
{
uchar status;
CSN_LOW;
while(MISO);
SPI0DAT=reg;
while(!SPIF);
status=SPI0DAT;
SPIF=0;
SPI0DAT=value;
while(!SPIF);
SPIF=0;
CSN_HIGH;
return(status);
}


uchar SPI_Read_Reg(uchar reg) //从寄存器读出一字节的数据
{
uchar byte;
CSN_LOW;
while (MISO);
SPI0DAT=reg|READ_SINGLE ;
while(!SPIF);
SPIF=0;
SPI0DAT=0x00;
while(!SPIF);
byte=SPI0DAT;
SPIF=0;
CSN_HIGH;
return byte;
}


uchar SPI_Read_Buf(uchar reg,uchar *pBuf,uchar bytes) //从reg读出bytes字节的数据
{
uchar status,byte_ctr;
CSN_LOW;
while (MISO);
status=SPI_RW(reg|READ_BURST);
for(byte_ctr=0;byte_ctr pBuf[byte_ctr]=SPI_RW(0);
CSN_HIGH;
return status;
}


uchar SPI_RW_Buf(uchar reg,uchar *pBuf,uchar bytes) //向reg写入bytes字节的数据
{
uchar status,byte_ctr;
CSN_LOW;
while (MISO);
status=SPI_RW(reg|WRITE_BURST);
for(byte_ctr=0;byte_ctr SPI_RW(pBuf[byte_ctr]);
CSN_HIGH;
return status;
}

//接收函数,接收返回1表示有数据收到
uchar RF1100CE_RxPacket(uchar *rx_buf,uchar *length)
{
uchar status[2];
uchar packetLength;
uchar i=(*length)*4; // 具体多少要根据datarate和length来决定

SPI_WR_Strobe(SRX); //进入接收模式指令
delay(10);

while (GDO0)
{
delay(10);
--i;
if(i<1)
return 0;
}

if(SPI_Read_Reg(RXBYTES+READ_BURST) & BYTES_IN_RXFIFO) //如果接的字节数不为0
{
packetLength = SPI_Read_Reg(RX_FIFO);//读出第一个字节,此字节为该帧数据长度
if (packetLength <= *length) //如果所要的有效数据长度小于等于接收到的数据包的长度
{
SPI_Read_Buf(RX_FIFO, rx_buf, packetLength); //读出所有接收到的数据
*length = packetLength; //把接收数据长度的修改为当前数据的长度

SPI_Read_Buf(RX_FIFO, status, 2); //读出CRC校验位
SPI_WR_Strobe(SFRX); //清洗接收缓冲区
return (status[1] & CRC_OK); //如果校验成功返回接收成功
}
else
{
*length = packetLength;
SPI_WR_Strobe(SFRX); //清洗接收缓冲区
return 0;
}
}<

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章