stc51單片機(jī)硬件SPI驅(qū)動(dòng)nrf24l01程序
掃描二維碼
隨時(shí)隨地手機(jī)看文章
stc51系類單片機(jī)大多數(shù)帶SPI模塊,例如STC12C5608AD,就帶有SPI口,可以直接用此SPI口驅(qū)動(dòng)nrf24l01,省去模擬SPI的麻煩。
spi初始化代碼如下:
voidSPI_Init(void){SPSTAT|=0XC0;//清高兩位,SPCTL=0XD0;//設(shè)置為主模式,開SPI}
spi收發(fā)數(shù)據(jù)代碼如下:
ucharSPI_RW(uchartr_data){uchari=0;SPSTAT|=0Xc0;//清高兩位,SPDAT=tr_data;while(((SPSTAT&0X80)!=0X80)&&(i<20)){i++;delay_ms(1);}returnSPDAT;}
spi寫nrf24l01寄存器代碼:
/*********************************************//*函數(shù)功能:給24L01的寄存器寫值(一個(gè)字節(jié))*//*入口參數(shù):reg要寫的寄存器地址*//*value給寄存器寫的值*//*出口參數(shù):status狀態(tài)值*//*********************************************/ucharNRF24L01_Write_Reg(ucharreg,ucharvalue){ucharstatus;NRF_CSN=0;//CSN=0;status=SPI_RW(reg);//發(fā)送寄存器地址,并讀取狀態(tài)值SPI_RW(value);NRF_CSN=1;//CSN=1;returnstatus;}/**********************************************//*函數(shù)功能:給24L01的寄存器寫值(多個(gè)字節(jié))*//*入口參數(shù):reg要寫的寄存器地址*//**pBuf值的存放數(shù)組*//*len數(shù)組字節(jié)長度*//**********************************************/ucharNRF24L01_Write_Buf(ucharreg,uchar*pBuf,ucharlen){ucharstatus,u8_ctr;NRF_CSN=0;status=SPI_RW(reg);//發(fā)送寄存器值(位置),并讀取狀態(tài)值for(u8_ctr=0;u8_ctrspi讀nrf24l01寄存器代碼:
/*************************************************//*函數(shù)功能:讀24L01的寄存器值(一個(gè)字節(jié))*//*入口參數(shù):reg要讀的寄存器地址*//*出口參數(shù):value讀出寄存器的值*//*************************************************/ucharNRF24L01_Read_Reg(ucharreg){ucharvalue;NRF_CSN=0;//CSN=0;SPI_RW(reg);//發(fā)送寄存器值(位置),并讀取狀態(tài)值value=SPI_RW(NOP);NRF_CSN=1;//CSN=1;returnvalue;}/*********************************************//*函數(shù)功能:讀24L01的寄存器值(多個(gè)字節(jié))*//*入口參數(shù):reg寄存器地址*//**pBuf讀出寄存器值的存放數(shù)組*//*len數(shù)組字節(jié)長度*//*出口參數(shù):status狀態(tài)值*//*********************************************/ucharNRF24L01_Read_Buf(ucharreg,uchar*pBuf,ucharlen){ucharstatus,u8_ctr;NRF_CSN=0;//CSN=0status=SPI_RW(reg);//發(fā)送寄存器地址,并讀取狀態(tài)值for(u8_ctr=0;u8_ctr初始化nrf24l01,配置為接收數(shù)據(jù)模式:
voidNRF24L01_RT_Init(void){NRF_CE=0;NRF24L01_Write_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//選擇通道0的有效數(shù)據(jù)寬度NRF24L01_Write_Reg(FLUSH_RX,0xff);//清除RXFIFO寄存器NRF24L01_Write_Buf(WRITE_REG+TX_ADDR,(uchar*)TX_ADDRESS,TX_ADR_WIDTH);//寫TX節(jié)點(diǎn)地址NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P0,(uchar*)RX_ADDRESS,RX_ADR_WIDTH);//設(shè)置TX節(jié)點(diǎn)地址,主要為了使能ACKNRF24L01_Write_Reg(WRITE_REG+EN_AA,0x01);//使能通道0的自動(dòng)應(yīng)答NRF24L01_Write_Reg(WRITE_REG+EN_RXADDR,0x01);//使能通道0的接收地址NRF24L01_Write_Reg(WRITE_REG+SETUP_RETR,0x1a);//設(shè)置自動(dòng)重發(fā)間隔時(shí)間:500us+86us;最大自動(dòng)重發(fā)次數(shù):10次NRF24L01_Write_Reg(WRITE_REG+RF_CH,20);//設(shè)置RF通道為0NRF24L01_Write_Reg(WRITE_REG+RF_SETUP,0x27);//設(shè)置TX發(fā)射參數(shù),7db增益,512Kbps,低噪聲增益開啟NRF24L01_Write_Reg(WRITE_REG+CONFIG,0x0f);//配置基本工作模式的參數(shù);PWR_UP,EN_CRC,16BIT_CRC,接收模式,開啟所有中斷NRF_CE=1;//CE置高,使能發(fā)送}