新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > RF1100SE單片機C8051F310程序

RF1100SE單片機C8051F310程序

作者: 時間:2016-11-30 來源:網絡 收藏

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

本文引用地址:http://m.butianyuan.cn/article/201611/324042.htm


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


uchar SPI_RW(uchar byte) //用SPI讀寫一字節(jié)的數據
{
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) //向寄存器寫一字節(jié)的數據,同時返回狀態(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é)的數據
{
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é)的數據
{
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字節(jié)的數據
{
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)
{
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) //如果接的字節(jié)數不為0
{
packetLength = SPI_Read_Reg(RX_FIFO);//讀出第一個字節(jié),此字節(jié)為該幀數據長度
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); //清洗接收緩沖區(qū)
return (status[1] & CRC_OK); //如果校驗成功返回接收成功
}
else
{
*length = packetLength;
SPI_WR_Strobe(SFRX); //清洗接收緩沖區(qū)
return 0;
}
}
else
return 0;
}

//發(fā)送函數
void RF1100CE_TxPacket(uchar *tx_buf,uchar size)
{
SPI_RW_Reg(TX_FIFO, size);
SPI_RW_Buf(TX_FIFO, tx_buf, size); //寫入要發(fā)送的數據


SPI_WR_Strobe(STX); //進入發(fā)送模式發(fā)送數據

while (!GDO0);
while (GDO0);

SPI_WR_Strobe(SFTX); //清除發(fā)送緩沖寄存器
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);//數據包自動控制,無地址檢測,包含兩個狀態(tài)字節(jié)
SPI_RW_Reg(PKTCTRL0, 0x05);//開啟CC2400支持,采用可變長度數據包
SPI_RW_Reg(ADDR, 0x00);//設置地址
SPI_RW_Reg(PKTLEN, 0x10);//有效允許最大數據包長度16個字節(jié)

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為低優(yōu)先級
}

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;

}


上一頁 1 2 下一頁

評論


技術專區(qū)

關閉