物聯網---STM32F042---NRF24L01/BK2425 無線通信

1.功能框圖


物聯網---STM32F042---NRF24L01/BK2425 無線通信

  • 主控:STM32F042;
  • NRF24L01、BK2425:2.4G通信IC(NRF24L01,BK2425功能基本相同,但操作上有點區別);

2.NRF24L01、BK2425介紹:

為了方便操作,我們使用模組進行操作。

  • NRF24L01


物聯網---STM32F042---NRF24L01/BK2425 無線通信

  • BK2425


物聯網---STM32F042---NRF24L01/BK2425 無線通信


3 NRF24L01、BK2425功能介紹

  • 最大空中速率達到2Mbps;
  • 廣泛用於物聯網場合,無線鼠標,無線遙控,體感設備等;
  • 採用SPI接口,高穩定,高性價比;

4 指令、寄存器介紹

NRF24L01、BK2425主要的操作寄存器都相同,但BK2425比NRF24L01多一個BANK 的寄存器

  • 指令
物聯網---STM32F042---NRF24L01/BK2425 無線通信

  • 寄存器
物聯網---STM32F042---NRF24L01/BK2425 無線通信

BK2425特有寄存器

物聯網---STM32F042---NRF24L01/BK2425 無線通信


5.操作使用

  • 初始化TX模式
  1. 進入POWER DOWN 或者standby模式;
  2. 設置地址寬度(SETUP_AW);
  3. 設置發送地址(TX_ADDR);
  4. 設置應答通道地址(RX_ADDR_P0);
  5. 使能數據通道0(EN_RXADDR);
  6. 使能通道0自動應答;(EN_AA)
  7. 設置自動超時時間,重發次數(SETUP_RETR);
  8. 設置發送頻率(RF_CH);
  9. 設置數據傳輸速率(RF_SETUP);
  10. 使能CRC校驗,校驗長度(CONFIG);
<code>SPI_CE_L;
BK2425WriteReg(WRITE_REG + SETUP_AW,AW_5BYTE_WIDTH);
BK2425WriteBuf(WRITE_REG + TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);
BK2425WriteBuf(WRITE_REG + RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);

BK2425WriteReg(WRITE_REG + EN_RXADDR,EN_RX_P0);
BK2425WriteReg(WRITE_REG + EN_AA,EN_AA_P0);

BK2425WriteReg(WRITE_REG + SETUP_RETR,RETR_ARD_1500US | RETR_ARC_10TIMES);
BK2425WriteReg(WRITE_REG + RF_CH, 40);
BK2425WriteReg(WRITE_REG + RF_SETUP, RF_RATE_2M | RF_PWR_7dB);
BK2425WriteReg(WRITE_REG + CONFIG,PRIM_TX | PWR_UP | CRCO | EN_CRC);
SPI_CE_H;/<code>
  • 初始化RX模式
  1. 進入POWER DOWN 或者standby模式;
  2. 設置地址寬度(SETUP_AW);
  3. 設置數據通道0的地址和地址寬度(RX_ADDR_P0);
  4. 使能通道0自動應答ACK(EN_AA);
  5. 使能通道0接收數據(EN_RXADDR);
  6. 設置接收頻率(RF_CH);
  7. 設置接收通道0接收數據長度(RX_PW_P0);
  8. 設置數據傳輸速率及增益(RF_SETUP);
  9. 設置CRC校驗,校驗長度(CONFIG);
  10. 清除所有標誌(STATUS);
<code>SPI_CE_L;
BK2425WriteReg(WRITE_REG + SETUP_AW,AW_5BYTE_WIDTH);
BK2425WriteBuf(WRITE_REG + RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);
BK2425WriteReg(WRITE_REG + EN_AA, EN_AA_P0);
BK2425WriteReg(WRITE_REG + EN_RXADDR, EN_RX_P0);\t
BK2425WriteReg(WRITE_REG + RF_CH, 40);
BK2425WriteReg(WRITE_REG + RX_PW_P0,RX_PLOAD_WIDTH);
BK2425WriteReg(WRITE_REG + RF_SETUP, RF_RATE_2M | RF_PWR_7dB);

BK2425WriteReg(WRITE_REG + CONFIG,PRIM_RX | PWR_UP | CRCO | EN_CRC);
BK2425WriteReg(WRITE_REG + STATUS,0xFF);
SPI_CE_H;/<code>

6.電路設計


物聯網---STM32F042---NRF24L01/BK2425 無線通信


軟件設計

  1. 由於NRF24L01/BK2425在通信時,在某一時刻只能為發射端或者接收端,我們可以認為是半雙工通信方式。
  2. 我們分別編寫發射和接收端的代碼:
  • 發射端

我們為了方便測試,我們發射端發送一串32個字節的數據,每發送一次自動加一

<code>/********************************************************************************************************************************************************************************************
**@function:\t\tprintTxFIFOData\t
**@brief:\t
**@param:
*********************************************************************************************************************************************************************************************/
void printTxFIFOData(BYTE *p,BYTE len)
{
BYTE i = 0;
//printf("\\r\\n printTxFIFOData: ");
for(i = 0;i < len;i++)
{
//printf("%02X ",p[i]);
}

BK2425WriteBuf(WR_TX_PLOAD,p,len);
}
/********************************************************************************************************************************************************************************************
**@function:\t\tprintTestData\t
**@brief:\t
**@param:
*********************************************************************************************************************************************************************************************/
void printTestData(void)
{
BYTE i = 0;
for(i = 0;i < 28;i++)
{
nrfInfo.nrfTxFrame[i] = i;
}
nrfInfo.nrfTxFrame[28] = (nrfInfo.nrfTxCnt >> 24) & 0XFF;
nrfInfo.nrfTxFrame[29] = (nrfInfo.nrfTxCnt >> 16) & 0XFF;
nrfInfo.nrfTxFrame[30] = (nrfInfo.nrfTxCnt >> 8) & 0XFF;
nrfInfo.nrfTxFrame[31] = (nrfInfo.nrfTxCnt >> 0) & 0XFF;

printTxFIFOData(nrfInfo.nrfTxFrame,32);
}/<code>

  • 接收端
<code>if(!IO_Read(IO_NRF_IRQ))
{
ResetUserTimer(&nrfInfo.nrfProDelayTimer);\t\t\t\t\t\t\t
temp = readStatusRegister();
printf("\\r\\n NRF IRQ Status: %02x",temp);
clearBK2425IRQ(temp);
if(MAX_RT & temp)
{
\t \tprintf("\\r\\n MAX_RT");
\t\t\tnrfInfo.nrfProcStatus = enumPowerDown;
\t\t ResetUserTimer(&nrfInfo.nrfProDelayTimer);
SPI_CE_L;
BK2425WriteReg(WRITE_REG + CONFIG,0X00);
printf("\\r\\n enumPowerDown");
}
else if(TX_DS & temp)
{
printf("\\r\\n TX_DS");
nrfInfo.nrfTxCnt++;
nrfInfo.nrfProcStatus = enumPTXData;
}
else if(RX_DR & temp)
{\t\t\t\t
printf("\\r\\n RX_DR");
pipe = (temp & 0X0E) >> 1;\t\t\t\t\t\t\t\t
if(pipe <= 5)
{
printf("\\r\\n pipe: %d",pipe);
readRxFIFORegister();
}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t
}

if(TX_FULL & temp)
{
printf("\\r\\n TX_FULL");
BK2425FlushTXFIFO();
}
}/<code>

7.實驗效果


物聯網---STM32F042---NRF24L01/BK2425 無線通信


物聯網---STM32F042---NRF24L01/BK2425 無線通信

8.總結

  1. 我們使用的NRF24L01和BK2425都是板載天線,我們在測試時候發現,它們之間傳輸距離其實是比較短的,並沒有網上模組賣家描述的那樣在空曠的地方能達到幾百米,所以這種的只適合短距離的傳輸;
  2. 我們這裡只是做一個比較簡單的介紹,如果需電路或者源碼的可以私信與我;
  3. 我們下一步做一個通過STM32 + 2.4G + 24bit ADC 做一個無線音頻傳輸;


分享到:


相關文章: