RF1100SE单片机C8051F310程序
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
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
CSN_HIGH;
return status;
}
//接收函数,接收返回1表示有数据收到
uchar RF1100CE_RxPacket(uchar *rx_buf,uchar *length)
{
ucharstatus[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输出脚配置
RF1100SE单片机C8051F31 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)