RF1100SE單片機(jī)C8051F310程序
void sysclk(void) //內(nèi)部晶振
{
OSCICL=0xb3; // 0xb3
OSCICN=0xc2; //二分頻
CLKSEL=0x00;
}本文引用地址:http://www.biyoush.com/article/201611/324042.htm
//延時(shí)子函數(shù)10us
void delay(uint i)
{
while(i--);
}
uchar SPI_RW(uchar byte) //用SPI讀寫一字節(jié)的數(shù)據(jù)
{
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) //上電復(fù)位
{
CSN = 1;
delay(10);
CSN = 0;
delay(10);
CSN = 1;
delay(500);
SPI_WR_Strobe(SRES); //復(fù)位CC1100
}
uchar SPI_RW_Reg(uchar reg,uchar value) //向寄存器寫一字節(jié)的數(shù)據(jù),同時(shí)返回狀態(tài)字
{
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) //從寄存器讀出一字節(jié)的數(shù)據(jù)
{
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字節(jié)的數(shù)據(jù)
{
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字節(jié)的數(shù)據(jù)
{
uchar status,byte_ctr;
CSN_LOW;
while (MISO);
status=SPI_RW(reg|WRITE_BURST);
for(byte_ctr=0;byte_ctr
CSN_HIGH;
return status;
}
//接收函數(shù),接收返回1表示有數(shù)據(jù)收到
uchar RF1100CE_RxPacket(uchar *rx_buf,uchar *length)
{
ucharstatus[2];
uchar packetLength;
uchar i=(*length)*4; // 具體多少要根據(jù)datarate和length來決定
SPI_WR_Strobe(SRX); //進(jìn)入接收模式指令
delay(10);
while (GDO0)
{
delay(10);
--i;
if(i<1)
return 0;
}
if(SPI_Read_Reg(RXBYTES+READ_BURST) & BYTES_IN_RXFIFO) //如果接的字節(jié)數(shù)不為0
{
packetLength = SPI_Read_Reg(RX_FIFO);//讀出第一個(gè)字節(jié),此字節(jié)為該幀數(shù)據(jù)長度
if (packetLength <= *length) //如果所要的有效數(shù)據(jù)長度小于等于接收到的數(shù)據(jù)包的長度
{
SPI_Read_Buf(RX_FIFO, rx_buf, packetLength); //讀出所有接收到的數(shù)據(jù)
*length = packetLength; //把接收數(shù)據(jù)長度的修改為當(dāng)前數(shù)據(jù)的長度
SPI_Read_Buf(RX_FIFO, status, 2); //讀出CRC校驗(yàn)位
SPI_WR_Strobe(SFRX); //清洗接收緩沖區(qū)
return (status[1] & CRC_OK); //如果校驗(yàn)成功返回接收成功
}
else
{
*length = packetLength;
SPI_WR_Strobe(SFRX); //清洗接收緩沖區(qū)
return 0;
}
}
else
return 0;
}
//發(fā)送函數(shù)
void RF1100CE_TxPacket(uchar *tx_buf,uchar size)
{
SPI_RW_Reg(TX_FIFO, size);
SPI_RW_Buf(TX_FIFO, tx_buf, size); //寫入要發(fā)送的數(shù)據(jù)
SPI_WR_Strobe(STX); //進(jìn)入發(fā)送模式發(fā)送數(shù)據(jù)
while (!GDO0);
while (GDO0);
SPI_WR_Strobe(SFTX); //清除發(fā)送緩沖寄存器
SPI_WR_Strobe(SIDLE);//進(jìn)入休眠模式
}
void RF1100CE_Config(void) //RF1100CE的配置函數(shù)
{
CSN_HIGH;//SPI復(fù)位
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);//調(diào)制器配置
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);//信道數(shù)
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);//頻率合成器校準(zhǔn)
SPI_RW_Reg(FSCAL2, 0x2a);
SPI_RW_Reg(FSCAL1, 0x00);
SPI_RW_Reg(FSCAL0, 0x11);
SPI_RW_Reg(FSTEST, 0x59);//產(chǎn)品測(cè)試
SPI_RW_Reg(TEST2, 0x81);//不同的測(cè)試設(shè)置
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);//數(shù)據(jù)包自動(dòng)控制,無地址檢測(cè),包含兩個(gè)狀態(tài)字節(jié)
SPI_RW_Reg(PKTCTRL0, 0x05);//開啟CC2400支持,采用可變長度數(shù)據(jù)包
SPI_RW_Reg(ADDR, 0x00);//設(shè)置地址
SPI_RW_Reg(PKTLEN, 0x10);//有效允許最大數(shù)據(jù)包長度16個(gè)字節(jié)
SPI_WR_Strobe(SFRX);
SPI_WR_Strobe(SFTX);
SPI_WR_Strobe(SIDLE);
}
void SPI(void) //SPI初始化
{
SPI0CFG=0x40; //時(shí)鐘極性為低,即剛開始時(shí)鐘要為低電平
SPI0CN=0x01; //0000 0001最后一位是SPI使能位 SPI工作在三線主方式
SPI0CKR=0x2f; //SPI時(shí)鐘頻率設(shè)置為150kHz 0x6f 0x2f
}
void Interrupt_int(void) //中斷設(shè)定
{
IE=0x40; //允許SPI中斷請(qǐng)求
IP=0x00; //SPI為低優(yōu)先級(jí)
}
void pio(void) // 端口配置
{
P0MDIN=0xff; //禁止模擬輸入,0為模擬,1為數(shù)字
P0MDOUT=0xff; //0為開漏,1為推挽(ff)
P0SKIP=0x00;
P1MDIN=0xff;
P1MDOUT=0xff; //低四位用于138
P2MDIN=0xff; //禁止模擬輸入,0為模擬,1為數(shù)字
P2MDOUT=0xff; //0為開漏,1為推挽(ff)
P3MDIN=0xff;
P3MDOUT=0xff; //低四位用于138
XBR0=0x02;
XBR1=0x40;
}
評(píng)論