久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3535|回復: 1
收起左側

基于STM32F429的NRF24L01無線通信源碼

[復制鏈接]
ID:470567 發表于 2019-1-19 15:02 | 顯示全部樓層 |閱讀模式
單片機源碼:
基于STM32F429的NRF24L01無線通信.7z (573.24 KB, 下載次數: 56)

  1. #include "24l01.h"
  2. #include "spi.h"
  3. #include "delay.h"
  4. #include "led.h"

  5. const u8 TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //發送地址
  6. const u8 RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //發送地址
  7. //針對NRF24L01修改SPI2驅動
  8. void NRF24L01_SPI_Init(void)
  9. {
  10.     __HAL_SPI_DISABLE(&SPI2_Handler);               //先關閉SPI2
  11.     SPI2_Handler.Init.CLKPolarity=SPI_POLARITY_LOW; //串行同步時鐘的空閑狀態為低電平
  12.     SPI2_Handler.Init.CLKPhase=SPI_PHASE_1EDGE;     //串行同步時鐘的第1個跳變沿(上升或下降)數據被采樣
  13.     HAL_SPI_Init(&SPI2_Handler);
  14.     __HAL_SPI_ENABLE(&SPI2_Handler);                //使能SPI2
  15. }
  16. //初始化24L01的IO口
  17. void NRF24L01_Init(void)
  18. {
  19.     GPIO_InitTypeDef GPIO_Initure;
  20.     __HAL_RCC_GPIOG_CLK_ENABLE();   //開啟GPIOG時鐘
  21.     __HAL_RCC_GPIOI_CLK_ENABLE();   //開啟GPIOI時鐘
  22.    
  23.     GPIO_Initure.Pin=GPIO_PIN_10|GPIO_PIN_12; //PG10,12
  24.     GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽輸出
  25.     GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
  26.     GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速
  27.     HAL_GPIO_Init(GPIOG,&GPIO_Initure);     //初始化
  28.      
  29.     GPIO_Initure.Pin=GPIO_PIN_11;           //PI11
  30.     GPIO_Initure.Mode=GPIO_MODE_INPUT;      //輸入
  31.     HAL_GPIO_Init(GPIOI,&GPIO_Initure);     //初始化
  32.    
  33.     SPI2_Init();                      //初始化SPI2  
  34.     NRF24L01_SPI_Init();                    //針對NRF的特點修改SPI的設置
  35.    NRF24L01_CE=0;                    //使能24L01
  36.    NRF24L01_CSN=1;                   //SPI片選取消      
  37. }
  38. //檢測24L01是否存在
  39. //返回值:0,成功;1,失敗
  40. u8 NRF24L01_Check(void)
  41. {
  42. u8 buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5};
  43. u8 i;
  44. SPI2_SetSpeed(SPI_BAUDRATEPRESCALER_4); //spi速度為11.25Mhz(24L01的最大SPI時鐘為10Mhz,這里大一點沒關系)      
  45. NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,buf,5);//寫入5個字節的地址.
  46. NRF24L01_Read_Buf(TX_ADDR,buf,5); //讀出寫入的地址  
  47. for(i=0;i<5;i++)if(buf[i]!=0XA5)break;            
  48. if(i!=5)
  49. {
  50.   //LED0=0;
  51.   return 1;
  52. }//檢測24L01錯誤
  53. else
  54. {
  55.   //LED1=0;
  56. return 0;
  57. }  //檢測到24L01
  58. }   
  59. //SPI寫寄存器
  60. //reg:指定寄存器地址
  61. //value:寫入的值
  62. u8 NRF24L01_Write_Reg(u8 reg,u8 value)
  63. {
  64.    u8 status;
  65.     NRF24L01_CSN=0;                 //使能SPI傳輸
  66.    status =SPI2_ReadWriteByte(reg);//發送寄存器號
  67.    SPI2_ReadWriteByte(value);      //寫入寄存器的值
  68.    NRF24L01_CSN=1;                 //禁止SPI傳輸   
  69.    return(status);             //返回狀態值
  70. }
  71. //讀取SPI寄存器值
  72. //reg:要讀的寄存器
  73. u8 NRF24L01_Read_Reg(u8 reg)
  74. {
  75.    u8 reg_val;     
  76.     NRF24L01_CSN=0;             //使能SPI傳輸  
  77.    SPI2_ReadWriteByte(reg);    //發送寄存器號
  78.    reg_val=SPI2_ReadWriteByte(0XFF);//讀取寄存器內容
  79.    NRF24L01_CSN=1;             //禁止SPI傳輸      
  80.    return(reg_val);            //返回狀態值
  81. }
  82. //在指定位置讀出指定長度的數據
  83. //reg:寄存器(位置)
  84. //*pBuf:數據指針
  85. //len:數據長度
  86. //返回值,此次讀到的狀態寄存器值
  87. u8 NRF24L01_Read_Buf(u8 reg,u8 *pBuf,u8 len)
  88. {
  89.    u8 status,u8_ctr;        
  90.    NRF24L01_CSN=0;            //使能SPI傳輸
  91.    status=SPI2_ReadWriteByte(reg);//發送寄存器值(位置),并讀取狀態值      
  92.     for(u8_ctr=0;u8_ctr<len;u8_ctr++)pBuf[u8_ctr]=SPI2_ReadWriteByte(0XFF);//讀出數據
  93.    NRF24L01_CSN=1;            //關閉SPI傳輸
  94.    return status;             //返回讀到的狀態值
  95. }
  96. //在指定位置寫指定長度的數據
  97. //reg:寄存器(位置)
  98. //*pBuf:數據指針
  99. //len:數據長度
  100. //返回值,此次讀到的狀態寄存器值
  101. u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 len)
  102. {
  103.    u8 status,u8_ctr;     
  104.     NRF24L01_CSN=0;             //使能SPI傳輸
  105.    status = SPI2_ReadWriteByte(reg);//發送寄存器值(位置),并讀取狀態值
  106.    for(u8_ctr=0; u8_ctr<len; u8_ctr++)SPI2_ReadWriteByte(*pBuf++); //寫入數據  
  107.    NRF24L01_CSN=1;             //關閉SPI傳輸
  108.    return status;              //返回讀到的狀態值
  109. }      
  110. //啟動NRF24L01發送一次數據
  111. //txbuf:待發送數據首地址
  112. //返回值:發送完成狀況
  113. u8 NRF24L01_TxPacket(u8 *txbuf)
  114. {
  115. u8 sta;
  116.   SPI2_SetSpeed(SPI_BAUDRATEPRESCALER_8); //spi速度為6.75Mhz(24L01的最大SPI時鐘為10Mhz)   
  117. NRF24L01_CE=0;
  118.    NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//寫數據到TX BUF  32個字節
  119.   NRF24L01_CE=1;                         //啟動發送   
  120. while(NRF24L01_IRQ!=0);                 //等待發送完成
  121. sta=NRF24L01_Read_Reg(STATUS);          //讀取狀態寄存器的值   
  122. NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中斷標志
  123. if(sta&MAX_TX)                          //達到最大重發次數
  124. {
  125.   NRF24L01_Write_Reg(FLUSH_TX,0xff);  //清除TX FIFO寄存器
  126.   return MAX_TX;
  127. }
  128. if(sta&TX_OK)                           //發送完成
  129. {
  130.   return TX_OK;
  131. }
  132. return 0xff;//其他原因發送失敗
  133. }
  134. //啟動NRF24L01發送一次數據
  135. //txbuf:待發送數據首地址
  136. //返回值:0,接收完成;其他,錯誤代碼
  137. u8 NRF24L01_RxPacket(u8 *rxbuf)
  138. {
  139. u8 sta;               
  140. SPI2_SetSpeed(SPI_BAUDRATEPRESCALER_8); //spi速度為6.75Mhz(24L01的最大SPI時鐘為10Mhz)   
  141. sta=NRF24L01_Read_Reg(STATUS);          //讀取狀態寄存器的值      
  142. NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中斷標志
  143. if(sta&RX_OK)//接收到數據
  144. {
  145.   NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//讀取數據
  146.   NRF24L01_Write_Reg(FLUSH_RX,0xff);  //清除RX FIFO寄存器
  147.   return 0;
  148. }   
  149. return 1;//沒收到任何數據
  150. }         
  151. //該函數初始化NRF24L01到RX模式
  152. //設置RX地址,寫RX數據寬度,選擇RF頻道,波特率和LNA HCURR
  153. //當CE變高后,即進入RX模式,并可以接收數據了     
  154. void NRF24L01_RX_Mode(void)
  155. {
  156.    NRF24L01_CE=0;   
  157.    NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);//寫RX節點地址
  158.    
  159.    NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01);       //使能通道0的自動應答   
  160.    NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01);   //使能通道0的接收地址   
  161.    NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);         //設置RF通信頻率   
  162.    NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//選擇通道0的有效數據寬度      
  163.    NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);    //設置TX發射參數,0db增益,2Mbps,低噪聲增益開啟   
  164.    NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, 0x0f);     //配置基本工作模式的參數;PWR_UP,EN_CRC,16BIT_CRC,接收模式
  165.    NRF24L01_CE=1; //CE為高,進入接收模式
  166. }      
  167. //該函數初始化NRF24L01到TX模式
  168. //設置TX地址,寫TX數據寬度,設置RX自動應答的地址,填充TX發送數據,選擇RF頻道,波特率和LNA HCURR
  169. //PWR_UP,CRC使能
  170. //當CE變高后,即進入RX模式,并可以接收數據了     
  171. //CE為高大于10us,則啟動發送.  
  172. void NRF24L01_TX_Mode(void)
  173. {               
  174. NRF24L01_CE=0;     
  175.   NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);//寫TX節點地址
  176.   NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH); //設置TX節點地址,主要為了使能ACK   
  177.   NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01);     //使能通道0的自動應答   
  178.   NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址  
  179.   NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);//設置自動重發間隔時間:500us + 86us;最大自動重發次數:10次
  180.   NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);       //設置RF通道為40
  181.   NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);  //設置TX發射參數,0db增益,2Mbps,低噪聲增益開啟   
  182.   NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG,0x0e);    //配置基本工作模式的參數;PWR_UP,EN_CRC,16BIT_CRC,接收模式,開啟所有中斷
  183. NRF24L01_CE=1;//CE為高,10us后啟動發送
  184. }
復制代碼

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:362795 發表于 2021-3-13 11:18 來自手機 | 顯示全部樓層
我下載看了下SPI,只開了SPI5的PF時鐘,SPI2在PB口的時鐘不用開嗎?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天堂男人av | h视频免费观看 | 91一区| 综合久久99 | 成人高潮片免费视频欧美 | 成人h视频在线观看 | 欧美极品在线视频 | 国产精品久久久久久婷婷天堂 | 国产精品波多野结衣 | 久久99精品久久久久久国产越南 | 日韩成人一区 | 三级在线观看 | 欧美日韩精品久久久免费观看 | 中文字幕亚洲专区 | 久久久国产精品 | 国产精品一区一区三区 | 日韩www视频 | 国产精品一区二区三区免费观看 | 欧美日韩黄色一级片 | 欧美在线a | 国产精品有限公司 | 草樱av| 国产免费一区 | 在线观看免费av网 | 亚洲不卡 | 国产一区二区精品在线观看 | 天堂一区 | 国产精品免费福利 | 高清成人免费视频 | 日本在线看片 | 国产91中文 | 日韩在线欧美 | 在线精品观看 | 国产精品久久久久久久岛一牛影视 | 一级欧美日韩 | 久久久久久久久久久蜜桃 | 亚洲一区 中文字幕 | 欧美色综合一区二区三区 | 国产一区二区三区网站 | www.毛片| 在线一区二区三区 |