×
单片机 > 单片机程序设计 > 详情

RF1100SE单片机C8051F310程序

发布时间:2020-06-09 发布时间:
|
#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 PKTCTRL1 0x07
#define PKTCTRL0 0x08
#define ADDR     0x09
#define CHANNR   0x0a
#define FSCTRL1  0x0b
#define FSCTRL0  0x0c
#define FREQ2    0x0d
#define FREQ1    0x0e
#define FREQ0    0x0f

//配置寄存器
#define MDMCFG4  0x10
#define MDMCFG3  0x11
#define MDMCFG2  0x12
#define MDMCFG1  0x13
#define MDMCFG0  0x14
#define DEVIATN  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 FSTEST   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 RSSI     0x34
#define MARCSTATE 0x35
#define WORTIME1  0x36
#define WORTIME0  0x37
#define PKTSTATUS 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;
}

[page]
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;
        }
    }
 else
  return 0;
}

//发送函数
void  RF1100CE_TxPacket(uchar *tx_buf,uchar size)  
{
    SPI_RW_Reg(TX_FIFO, size);
    SPI_RW_Buf(TX_FIFO, tx_buf, size); //写入要发送的数据
 
 
    SPI_WR_Strobe(STX);  //进入发送模式发送数据

    while (!GDO0);
    while (GDO0);
 
 SPI_WR_Strobe(SFTX); //清除发送缓冲寄存器
 SPI_WR_Strobe(SIDLE);//进入休眠模式
}

void RF1100CE_Config(void)   //RF1100CE的配置函数
{
   CSN_HIGH;//SPI复位
 
    SPI_RW_Reg(FSCTRL1, 0x08);//频率合成器控制
    SPI_RW_Reg(FSCTRL0, 0x00);
    SPI_RW_Reg(FREQ2,   0x10);//频率控制词汇
    SPI_RW_Reg(FREQ1,   0xa7);
    SPI_RW_Reg(FREQ0,   0x62);
    SPI_RW_Reg(MDMCFG4, 0x5b);//调制器配置
    SPI_RW_Reg(MDMCFG3, 0xf8);
    SPI_RW_Reg(MDMCFG2, 0x03);
    SPI_RW_Reg(MDMCFG1, 0x22);
    SPI_RW_Reg(MDMCFG0, 0xf8);

    SPI_RW_Reg(CHANNR,  0x00);//信道数
 SPI_RW_Reg(DEVIATN, 0x47);
 SPI_RW_Reg(FREND1,  0xb6);
 SPI_RW_Reg(FREND0,  0x10);
 SPI_RW_Reg(MCSM0,   0x18);
 SPI_RW_Reg(FOCCFG,  0x1d);
 SPI_RW_Reg(BSCFG,   0x1c);
 SPI_RW_Reg(AGCTRL2, 0xc7);
 SPI_RW_Reg(AGCTRL1, 0x00);
 SPI_RW_Reg(AGCTRL0, 0xb2);

 SPI_RW_Reg(FSCAL3,   0xea);//频率合成器校准
 SPI_RW_Reg(FSCAL2,   0x2a);
 SPI_RW_Reg(FSCAL1,   0x00);
    SPI_RW_Reg(FSCAL0,   0x11);
    SPI_RW_Reg(FSTEST,   0x59);//产品测试
    SPI_RW_Reg(TEST2,    0x81);//不同的测试设置
    SPI_RW_Reg(TEST1,    0x35);
    SPI_RW_Reg(TEST0,    0x09);
    SPI_RW_Reg(IOCFG2,   0x0b);
    SPI_RW_Reg(IOCFG0,   0x06);//GDO输出脚配置

    SPI_RW_Reg(PKTCTRL1, 0x04);//数据包自动控制,无地址检测,包含两个状态字节
    SPI_RW_Reg(PKTCTRL0, 0x05);//开启CC2400支持,采用可变长度数据包
    SPI_RW_Reg(ADDR,     0x00);//设置地址
    SPI_RW_Reg(PKTLEN,   0x10);//有效允许最大数据包长度16个字节

 SPI_WR_Strobe(SFRX);
 SPI_WR_Strobe(SFTX);
 SPI_WR_Strobe(SIDLE);

}


void SPI(void)  //SPI初始化
  {
 SPI0CFG=0x40; //时钟极性为低,即刚开始时钟要为低电平
 SPI0CN=0x01; //0000 0001最后一位是SPI使能位 SPI工作在三线主方式
 SPI0CKR=0x2f; //SPI 时钟频率设置为150kHz 0x6f 0x2f
  }

void Interrupt_int(void)   //中断设定
 {
   IE=0x40;  //允许SPI中断请求
   IP=0x00;  //SPI为低优先级
 }

void pio(void)   // 端口配置
{
 P0MDIN=0xff;  //禁止模拟输入,0为模拟,1为数字
 P0MDOUT=0xff; //0为开漏,1为推挽(ff)
 P0SKIP=0x00; 
  
 P1MDIN=0xff; 
 P1MDOUT=0xff; //低四位用于138

 
 P2MDIN=0xff;  //禁止模拟输入,0为模拟,1为数字
 P2MDOUT=0xff; //0为开漏,1为推挽(ff)
  
 P3MDIN=0xff; 
 P3MDOUT=0xff; //低四位用于138

 XBR0=0x02;
 XBR1=0x40;

}

关键字:RF1100SE  单片机  C8051F310

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机CO2检测显示程序解析