资讯详情

RF1100SE单片机C8051F310程序

#include <c8051f310.h> #include <stdio.h> #include <math.h> #include <Intrins.h> #include <absacc.h>

#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<bytes;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<bytes;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百科大全!

锐单商城 - 一站式电子元器件采购平台