|
單片機(jī)源碼:
基于STM32F429的NRF24L01無線通信.7z
(573.24 KB, 下載次數(shù): 56)
2019-1-19 16:28 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
- #include "24l01.h"
- #include "spi.h"
- #include "delay.h"
- #include "led.h"
- const u8 TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //發(fā)送地址
- const u8 RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //發(fā)送地址
- //針對NRF24L01修改SPI2驅(qū)動
- void NRF24L01_SPI_Init(void)
- {
- __HAL_SPI_DISABLE(&SPI2_Handler); //先關(guān)閉SPI2
- SPI2_Handler.Init.CLKPolarity=SPI_POLARITY_LOW; //串行同步時鐘的空閑狀態(tài)為低電平
- SPI2_Handler.Init.CLKPhase=SPI_PHASE_1EDGE; //串行同步時鐘的第1個跳變沿(上升或下降)數(shù)據(jù)被采樣
- HAL_SPI_Init(&SPI2_Handler);
- __HAL_SPI_ENABLE(&SPI2_Handler); //使能SPI2
- }
- //初始化24L01的IO口
- void NRF24L01_Init(void)
- {
- GPIO_InitTypeDef GPIO_Initure;
- __HAL_RCC_GPIOG_CLK_ENABLE(); //開啟GPIOG時鐘
- __HAL_RCC_GPIOI_CLK_ENABLE(); //開啟GPIOI時鐘
-
- GPIO_Initure.Pin=GPIO_PIN_10|GPIO_PIN_12; //PG10,12
- GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽輸出
- GPIO_Initure.Pull=GPIO_PULLUP; //上拉
- GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
- HAL_GPIO_Init(GPIOG,&GPIO_Initure); //初始化
-
- GPIO_Initure.Pin=GPIO_PIN_11; //PI11
- GPIO_Initure.Mode=GPIO_MODE_INPUT; //輸入
- HAL_GPIO_Init(GPIOI,&GPIO_Initure); //初始化
-
- SPI2_Init(); //初始化SPI2
- NRF24L01_SPI_Init(); //針對NRF的特點(diǎn)修改SPI的設(shè)置
- NRF24L01_CE=0; //使能24L01
- NRF24L01_CSN=1; //SPI片選取消
- }
- //檢測24L01是否存在
- //返回值:0,成功;1,失敗
- u8 NRF24L01_Check(void)
- {
- u8 buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5};
- u8 i;
- SPI2_SetSpeed(SPI_BAUDRATEPRESCALER_4); //spi速度為11.25Mhz(24L01的最大SPI時鐘為10Mhz,這里大一點(diǎn)沒關(guān)系)
- NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,buf,5);//寫入5個字節(jié)的地址.
- NRF24L01_Read_Buf(TX_ADDR,buf,5); //讀出寫入的地址
- for(i=0;i<5;i++)if(buf[i]!=0XA5)break;
- if(i!=5)
- {
- //LED0=0;
- return 1;
- }//檢測24L01錯誤
- else
- {
- //LED1=0;
- return 0;
- } //檢測到24L01
- }
- //SPI寫寄存器
- //reg:指定寄存器地址
- //value:寫入的值
- u8 NRF24L01_Write_Reg(u8 reg,u8 value)
- {
- u8 status;
- NRF24L01_CSN=0; //使能SPI傳輸
- status =SPI2_ReadWriteByte(reg);//發(fā)送寄存器號
- SPI2_ReadWriteByte(value); //寫入寄存器的值
- NRF24L01_CSN=1; //禁止SPI傳輸
- return(status); //返回狀態(tài)值
- }
- //讀取SPI寄存器值
- //reg:要讀的寄存器
- u8 NRF24L01_Read_Reg(u8 reg)
- {
- u8 reg_val;
- NRF24L01_CSN=0; //使能SPI傳輸
- SPI2_ReadWriteByte(reg); //發(fā)送寄存器號
- reg_val=SPI2_ReadWriteByte(0XFF);//讀取寄存器內(nèi)容
- NRF24L01_CSN=1; //禁止SPI傳輸
- return(reg_val); //返回狀態(tài)值
- }
- //在指定位置讀出指定長度的數(shù)據(jù)
- //reg:寄存器(位置)
- //*pBuf:數(shù)據(jù)指針
- //len:數(shù)據(jù)長度
- //返回值,此次讀到的狀態(tài)寄存器值
- u8 NRF24L01_Read_Buf(u8 reg,u8 *pBuf,u8 len)
- {
- u8 status,u8_ctr;
- NRF24L01_CSN=0; //使能SPI傳輸
- status=SPI2_ReadWriteByte(reg);//發(fā)送寄存器值(位置),并讀取狀態(tài)值
- for(u8_ctr=0;u8_ctr<len;u8_ctr++)pBuf[u8_ctr]=SPI2_ReadWriteByte(0XFF);//讀出數(shù)據(jù)
- NRF24L01_CSN=1; //關(guān)閉SPI傳輸
- return status; //返回讀到的狀態(tài)值
- }
- //在指定位置寫指定長度的數(shù)據(jù)
- //reg:寄存器(位置)
- //*pBuf:數(shù)據(jù)指針
- //len:數(shù)據(jù)長度
- //返回值,此次讀到的狀態(tài)寄存器值
- u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 len)
- {
- u8 status,u8_ctr;
- NRF24L01_CSN=0; //使能SPI傳輸
- status = SPI2_ReadWriteByte(reg);//發(fā)送寄存器值(位置),并讀取狀態(tài)值
- for(u8_ctr=0; u8_ctr<len; u8_ctr++)SPI2_ReadWriteByte(*pBuf++); //寫入數(shù)據(jù)
- NRF24L01_CSN=1; //關(guān)閉SPI傳輸
- return status; //返回讀到的狀態(tài)值
- }
- //啟動NRF24L01發(fā)送一次數(shù)據(jù)
- //txbuf:待發(fā)送數(shù)據(jù)首地址
- //返回值:發(fā)送完成狀況
- u8 NRF24L01_TxPacket(u8 *txbuf)
- {
- u8 sta;
- SPI2_SetSpeed(SPI_BAUDRATEPRESCALER_8); //spi速度為6.75Mhz(24L01的最大SPI時鐘為10Mhz)
- NRF24L01_CE=0;
- NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//寫數(shù)據(jù)到TX BUF 32個字節(jié)
- NRF24L01_CE=1; //啟動發(fā)送
- while(NRF24L01_IRQ!=0); //等待發(fā)送完成
- sta=NRF24L01_Read_Reg(STATUS); //讀取狀態(tài)寄存器的值
- NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中斷標(biāo)志
- if(sta&MAX_TX) //達(dá)到最大重發(fā)次數(shù)
- {
- NRF24L01_Write_Reg(FLUSH_TX,0xff); //清除TX FIFO寄存器
- return MAX_TX;
- }
- if(sta&TX_OK) //發(fā)送完成
- {
- return TX_OK;
- }
- return 0xff;//其他原因發(fā)送失敗
- }
- //啟動NRF24L01發(fā)送一次數(shù)據(jù)
- //txbuf:待發(fā)送數(shù)據(jù)首地址
- //返回值:0,接收完成;其他,錯誤代碼
- u8 NRF24L01_RxPacket(u8 *rxbuf)
- {
- u8 sta;
- SPI2_SetSpeed(SPI_BAUDRATEPRESCALER_8); //spi速度為6.75Mhz(24L01的最大SPI時鐘為10Mhz)
- sta=NRF24L01_Read_Reg(STATUS); //讀取狀態(tài)寄存器的值
- NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中斷標(biāo)志
- if(sta&RX_OK)//接收到數(shù)據(jù)
- {
- NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//讀取數(shù)據(jù)
- NRF24L01_Write_Reg(FLUSH_RX,0xff); //清除RX FIFO寄存器
- return 0;
- }
- return 1;//沒收到任何數(shù)據(jù)
- }
- //該函數(shù)初始化NRF24L01到RX模式
- //設(shè)置RX地址,寫RX數(shù)據(jù)寬度,選擇RF頻道,波特率和LNA HCURR
- //當(dāng)CE變高后,即進(jìn)入RX模式,并可以接收數(shù)據(jù)了
- void NRF24L01_RX_Mode(void)
- {
- NRF24L01_CE=0;
- NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);//寫RX節(jié)點(diǎn)地址
-
- NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01); //使能通道0的自動應(yīng)答
- NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址
- NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40); //設(shè)置RF通信頻率
- NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//選擇通道0的有效數(shù)據(jù)寬度
- NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f); //設(shè)置TX發(fā)射參數(shù),0db增益,2Mbps,低噪聲增益開啟
- NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, 0x0f); //配置基本工作模式的參數(shù);PWR_UP,EN_CRC,16BIT_CRC,接收模式
- NRF24L01_CE=1; //CE為高,進(jìn)入接收模式
- }
- //該函數(shù)初始化NRF24L01到TX模式
- //設(shè)置TX地址,寫TX數(shù)據(jù)寬度,設(shè)置RX自動應(yīng)答的地址,填充TX發(fā)送數(shù)據(jù),選擇RF頻道,波特率和LNA HCURR
- //PWR_UP,CRC使能
- //當(dāng)CE變高后,即進(jìn)入RX模式,并可以接收數(shù)據(jù)了
- //CE為高大于10us,則啟動發(fā)送.
- void NRF24L01_TX_Mode(void)
- {
- NRF24L01_CE=0;
- NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);//寫TX節(jié)點(diǎn)地址
- NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH); //設(shè)置TX節(jié)點(diǎn)地址,主要為了使能ACK
- NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01); //使能通道0的自動應(yīng)答
- NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址
- NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);//設(shè)置自動重發(fā)間隔時間:500us + 86us;最大自動重發(fā)次數(shù):10次
- NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40); //設(shè)置RF通道為40
- NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f); //設(shè)置TX發(fā)射參數(shù),0db增益,2Mbps,低噪聲增益開啟
- NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG,0x0e); //配置基本工作模式的參數(shù);PWR_UP,EN_CRC,16BIT_CRC,接收模式,開啟所有中斷
- NRF24L01_CE=1;//CE為高,10us后啟動發(fā)送
- }
復(fù)制代碼 |
評分
-
查看全部評分
|