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

標題: 基于STM32F429的NRF24L01無線通信源碼 [打印本頁]

作者: 181181031    時間: 2019-1-19 15:02
標題: 基于STM32F429的NRF24L01無線通信源碼
單片機源碼:
基于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. }
復制代碼

作者: 371015220    時間: 2021-3-13 11:18
我下載看了下SPI,只開了SPI5的PF時鐘,SPI2在PB口的時鐘不用開嗎?




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 黑人中文字幕一区二区三区 | 超级乱淫av片免费播放 | 不卡的av在线 | 国产在线精品一区二区三区 | 日韩视频在线播放 | 国产在线aa | 欧美片网站免费 | 国产午夜视频 | 欧美三级电影在线播放 | 99色综合 | 日韩毛片 | 日本中文字幕在线观看 | 亚洲视频 欧美视频 | 日日日色 | 久久99国产精品 | 欧美一级免费看 | 国产一区二区免费 | 国产资源在线播放 | 亚洲最大的成人网 | 国产日韩欧美 | 久久麻豆精品 | 国产精品www | 天天玩天天干天天操 | 免费精品视频一区 | 九九九视频 | 日本人和亚洲人zjzjhd | 国产乱人伦精品一区二区 | 国产精品久久久久久久久久久久久久 | 亚洲欧洲视频 | 国产精品自产拍在线观看蜜 | 亚洲精品区 | 国产精品亚洲成在人线 | 日本黄色不卡视频 | 国产成人精品福利 | 久久婷婷国产 | 亚洲精品www | 欧美国产在线一区 | 成人在线中文字幕 | 亚洲乱码一区二区三区在线观看 | 在线免费小视频 | 精品福利在线 |