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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3522|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

基于STM32F429的NRF24L01無線通信源碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:470567 發(fā)表于 2019-1-19 15:02 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
單片機(jī)源碼:
基于STM32F429的NRF24L01無線通信.7z (573.24 KB, 下載次數(shù): 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}; //發(fā)送地址
  6. const u8 RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //發(fā)送地址
  7. //針對NRF24L01修改SPI2驅(qū)動
  8. void NRF24L01_SPI_Init(void)
  9. {
  10.     __HAL_SPI_DISABLE(&SPI2_Handler);               //先關(guān)閉SPI2
  11.     SPI2_Handler.Init.CLKPolarity=SPI_POLARITY_LOW; //串行同步時鐘的空閑狀態(tài)為低電平
  12.     SPI2_Handler.Init.CLKPhase=SPI_PHASE_1EDGE;     //串行同步時鐘的第1個跳變沿(上升或下降)數(shù)據(jù)被采樣
  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的特點(diǎn)修改SPI的設(shè)置
  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,這里大一點(diǎn)沒關(guān)系)      
  45. NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,buf,5);//寫入5個字節(jié)的地址.
  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);//發(fā)送寄存器號
  67.    SPI2_ReadWriteByte(value);      //寫入寄存器的值
  68.    NRF24L01_CSN=1;                 //禁止SPI傳輸   
  69.    return(status);             //返回狀態(tài)值
  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);    //發(fā)送寄存器號
  78.    reg_val=SPI2_ReadWriteByte(0XFF);//讀取寄存器內(nèi)容
  79.    NRF24L01_CSN=1;             //禁止SPI傳輸      
  80.    return(reg_val);            //返回狀態(tài)值
  81. }
  82. //在指定位置讀出指定長度的數(shù)據(jù)
  83. //reg:寄存器(位置)
  84. //*pBuf:數(shù)據(jù)指針
  85. //len:數(shù)據(jù)長度
  86. //返回值,此次讀到的狀態(tài)寄存器值
  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);//發(fā)送寄存器值(位置),并讀取狀態(tài)值      
  92.     for(u8_ctr=0;u8_ctr<len;u8_ctr++)pBuf[u8_ctr]=SPI2_ReadWriteByte(0XFF);//讀出數(shù)據(jù)
  93.    NRF24L01_CSN=1;            //關(guān)閉SPI傳輸
  94.    return status;             //返回讀到的狀態(tài)值
  95. }
  96. //在指定位置寫指定長度的數(shù)據(jù)
  97. //reg:寄存器(位置)
  98. //*pBuf:數(shù)據(jù)指針
  99. //len:數(shù)據(jù)長度
  100. //返回值,此次讀到的狀態(tài)寄存器值
  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);//發(fā)送寄存器值(位置),并讀取狀態(tài)值
  106.    for(u8_ctr=0; u8_ctr<len; u8_ctr++)SPI2_ReadWriteByte(*pBuf++); //寫入數(shù)據(jù)  
  107.    NRF24L01_CSN=1;             //關(guān)閉SPI傳輸
  108.    return status;              //返回讀到的狀態(tài)值
  109. }      
  110. //啟動NRF24L01發(fā)送一次數(shù)據(jù)
  111. //txbuf:待發(fā)送數(shù)據(jù)首地址
  112. //返回值:發(fā)送完成狀況
  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);//寫數(shù)據(jù)到TX BUF  32個字節(jié)
  119.   NRF24L01_CE=1;                         //啟動發(fā)送   
  120. while(NRF24L01_IRQ!=0);                 //等待發(fā)送完成
  121. sta=NRF24L01_Read_Reg(STATUS);          //讀取狀態(tài)寄存器的值   
  122. NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中斷標(biāo)志
  123. if(sta&MAX_TX)                          //達(dá)到最大重發(fā)次數(shù)
  124. {
  125.   NRF24L01_Write_Reg(FLUSH_TX,0xff);  //清除TX FIFO寄存器
  126.   return MAX_TX;
  127. }
  128. if(sta&TX_OK)                           //發(fā)送完成
  129. {
  130.   return TX_OK;
  131. }
  132. return 0xff;//其他原因發(fā)送失敗
  133. }
  134. //啟動NRF24L01發(fā)送一次數(shù)據(jù)
  135. //txbuf:待發(fā)送數(shù)據(jù)首地址
  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);          //讀取狀態(tài)寄存器的值      
  142. NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中斷標(biāo)志
  143. if(sta&RX_OK)//接收到數(shù)據(jù)
  144. {
  145.   NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//讀取數(shù)據(jù)
  146.   NRF24L01_Write_Reg(FLUSH_RX,0xff);  //清除RX FIFO寄存器
  147.   return 0;
  148. }   
  149. return 1;//沒收到任何數(shù)據(jù)
  150. }         
  151. //該函數(shù)初始化NRF24L01到RX模式
  152. //設(shè)置RX地址,寫RX數(shù)據(jù)寬度,選擇RF頻道,波特率和LNA HCURR
  153. //當(dāng)CE變高后,即進(jìn)入RX模式,并可以接收數(shù)據(jù)了     
  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節(jié)點(diǎn)地址
  158.    
  159.    NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01);       //使能通道0的自動應(yīng)答   
  160.    NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01);   //使能通道0的接收地址   
  161.    NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);         //設(shè)置RF通信頻率   
  162.    NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//選擇通道0的有效數(shù)據(jù)寬度      
  163.    NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);    //設(shè)置TX發(fā)射參數(shù),0db增益,2Mbps,低噪聲增益開啟   
  164.    NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, 0x0f);     //配置基本工作模式的參數(shù);PWR_UP,EN_CRC,16BIT_CRC,接收模式
  165.    NRF24L01_CE=1; //CE為高,進(jìn)入接收模式
  166. }      
  167. //該函數(shù)初始化NRF24L01到TX模式
  168. //設(shè)置TX地址,寫TX數(shù)據(jù)寬度,設(shè)置RX自動應(yīng)答的地址,填充TX發(fā)送數(shù)據(jù),選擇RF頻道,波特率和LNA HCURR
  169. //PWR_UP,CRC使能
  170. //當(dāng)CE變高后,即進(jìn)入RX模式,并可以接收數(shù)據(jù)了     
  171. //CE為高大于10us,則啟動發(fā)送.  
  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節(jié)點(diǎn)地址
  176.   NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH); //設(shè)置TX節(jié)點(diǎn)地址,主要為了使能ACK   
  177.   NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01);     //使能通道0的自動應(yīng)答   
  178.   NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址  
  179.   NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);//設(shè)置自動重發(fā)間隔時間:500us + 86us;最大自動重發(fā)次數(shù):10次
  180.   NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);       //設(shè)置RF通道為40
  181.   NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);  //設(shè)置TX發(fā)射參數(shù),0db增益,2Mbps,低噪聲增益開啟   
  182.   NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG,0x0e);    //配置基本工作模式的參數(shù);PWR_UP,EN_CRC,16BIT_CRC,接收模式,開啟所有中斷
  183. NRF24L01_CE=1;//CE為高,10us后啟動發(fā)送
  184. }
復(fù)制代碼

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂2 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:362795 發(fā)表于 2021-3-13 11:18 來自手機(jī) | 只看該作者
我下載看了下SPI,只開了SPI5的PF時鐘,SPI2在PB口的時鐘不用開嗎?
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品久久久久中文字幕欢迎你 | 国产乱码精品一区二区三区中文 | 午夜影院在线视频 | 日韩在线观看中文字幕 | avmans最新导航地址 | av网站免费 | 精品国产一区一区二区三亚瑟 | 毛片片 | 欧美精品一区二区免费 | 国产精彩视频在线观看 | 亚洲国产成人精品女人久久久 | 91精品国产一区二区三区香蕉 | 人人人艹 | 欧美一级黄色片 | 电影91久久久 | 男女爱爱福利视频 | 精品国产乱码久久久久久果冻传媒 | 国产在线视频一区二区董小宛性色 | 亚洲欧洲视频 | 欧美成人一区二区三区 | 国产精品成人一区二区 | 国产成人jvid在线播放 | 久久婷婷色 | 日本一区二区高清视频 | 亚洲不卡在线观看 | 亚洲欧美视频一区 | 日本免费黄色 | 91最新在线视频 | 国产在线观看一区二区三区 | 久久免费高清 | 日韩精品一区二区三区中文字幕 | 精品国产一区二区三区性色av | 亚洲看片 | 久久精品国产一区二区电影 | 国产精品久久久久久二区 | 免费黄网站在线观看 | 日韩免费电影 | 最新免费黄色网址 | 黄色骚片 | 亚洲精品一级 | 欧美日韩国产高清 |