當LaunchPad遇上nRF24L01

時間過得真快,又到了一週一文的截止時間後了(?),今天要來跟大家談談Jack和Rose相遇的故事,讓我們把時間回到1912年的鐵達尼號…

啊,不對,是LaunchPad與nRF24L01才對。LaunchPad我相信有在關注Single.9的朋友們應該不會很陌生才是,假如你是隨Google大神的指引而來到寒舍的話,那麼你可以先參考這篇文章後在來看也不遲。

開始之前

今天的豬腳是清蒸的主角是這個小小的傢伙,nRF24L01。別看他如此嬌小的樣貌,他的內部功能可以說是應有盡有,而且能力不輸ZigBee呢!

特色:

  • 使用2.4GHz全球開放頻寬
  • 126個可選擇頻道
  • 可設定收發位址及頻率
  • 1 與 2 Mbps 的資料傳輸速率
  • 可程式控制的輸出功率(最大0dBm,消耗11.3mA)
  • 1.9~3.3V低電壓
  • 使用SPI界面控制
  • 詳細請參考Data Sheet

硬體設定

節錄自SPI的紀錄,大概就是長這樣:

/*   _ _ _ _ _ _ _ _ _ _ _ _
 *  |1|2|  1->GND  2->VCC  |
 *  |-|-|                  |
 *  |3|4|  3->CE   4->CSN  |
 *  |-|-|                  |
 *  |5|6|  5->CLK  6->MOSI |
 *  |-|-|                  |
 *  |7|8|  7->MISO 8->IRQ  |
 *  |_|_|_ _ _ _ _ _ _ _ _ |
 */

#define CE        7
#define CSN       0
#define CLK       5
#define MOSI      6
#define MISO      4
#define IRQ       2
#define PORT     P1OUT
#define PDIR     P1DIR
#define PIN      P1IN

#define GLED     6
#define Key      3

///////////////IO 腳位定義////////////////////////////
void IO_initial()
{
    PDIR |= BIT(CSN) + BIT(CE) + BIT(CLK) + BIT(MOSI);
    PDIR |= BIT(GLED);

    P1REN |= BIT(IRQ);
    P1OUT |= BIT(IRQ);

    P1REN |= BIT(Key);
    P1OUT |= BIT(Key);

    PORT &= ~BIT(GLED);
    PORT &= ~BIT(CE); //CHIP DISABLE
    PORT |= BIT(CSN); //CSN IS PULL HIGH.DISABLE THE OPERATION
    PORT &= ~BIT(CLK);//CLK IS LOW
}

白話文解釋:

nRF24L01模組上的第12腳分別接上電壓不可超過3.6V

LaunchPad v.s nRF24L01

   P1.7        3.CE

   P1.0        4.CSN

   P1.5        5.CLK

   P1.6        6.MOSI

   P1.4        7.MISO

   P1.2        8.IRQ

程式設定

網路上已經有人幫nRF24L01寫了API以及SPI,這大大的減少了我們在軟體上面的設定時間,我們要作的就是把API以及SPI給包到我們的程式裡面這樣就算是做完基本定義了。之後在參考SPI.c的內容與註解來進行更細節的程式規劃,當然,如果需要的話,你也可以參考Data Sheet來作其他的細節設定,無論如何,真要謝謝這不知名的朋友無私的分享這樣的東西。

檔案請點這邊下載(含UART以及收發範例),註解翻譯並不是完全的,因為實在很不想翻(別打我)。

下載完之後,請將之放到與你主程式相同的資料夾裡,然後如以下include到你的程式。對了main.c裡面是簡易的範例程式可以參考看看。

// msp430's library
#include <msp430.h>
// API + SPI + UART
#include "API.h"
#include "SPI.h"
#include "uart.h"

話說我好像還沒寫 CCS 的使用說明,下次文章更新的時候我會順便寫的…(鞠躬)

如何使用

使用方法請參考SPI.c以及範例程式…基本上都有稍做翻譯了,這邊貼上接收與發射的主要程式片段。

發射(Tx)

uchar msg[TX_PLOAD_WIDTH];

void Msg_Loop()
{
    msg[0]='T';
    msg[1]='x';
    msg[2]='i';
    msg[3]='g';
    nRF24L01_TxPacket(msg);
    SPI_RW_Reg(WRITE_REG+STATUS,0xff);  // clear interrupt flag(TX_DS)
    Delay_us(50000);
}

void main()
{
    WDTCTL = WDTPW + WDTHOLD;

    ConfigClocks();
    IO_initial();
    init_NRF24L01();
    GLED_on();

  while(1)
  {
    // 不斷發射資料...
    Msg_Loop();
  }
}</pre>

**接收**(Rx)

<pre class="brush:cpp">uchar *end = "\r\n";
uchar RxBuf[TX_PLOAD_WIDTH];

void main()
{
    // 看門狗計數器關閉
    WDTCTL = WDTPW + WDTHOLD;
    // 初始化系統
    ConfigClocks();
    IO_initial();
    uart_io_set();
    init_NRF24L01();
    send_String("Initialize OK. Waitting for Receive data....");

    // 開始接收
    while (1)
    {
        SetRX_Mode();
        send_String("...");
        // 接收到資料
        if (nRF24L01_RxPacket(RxBuf))
        {
            // 透過 UART 印輸出到電腦
            send_String(RxBuf);
            send_String(end);
            Delay_us(500);
        }
    }

}

以上,是 nRF24L01 與 LaunchPad 邂逅的方式,而他們的邂逅當然也有拍下珍貴的紀錄喔!(咦?)

獨夜:

看評論 (7)

  • 您好:
    我想請問一下關於NRF24L01的資料傳輸技術,網路上販賣的無線傳輸模組一大堆,多數有註明是何種傳輸技術(ZIGBEE 藍芽 WIFI等等),但NRF24L01在DATASHEET上似乎找不到相關資料,網路上相關資料也都沒提到,不知大大是否知道這方面的資訊~

    • nRF24L01並沒有採用任何IEEE的技術規格,他是使用 Enhanced ShockBurst 這個技術的,細節可以參考:https://devzone.nordicsemi.com/documentation/nrf51/4.3.0/html/group__esb__users__guide.html。

      不過也有人嘗試使用這個模組來實作 ieee 802.15.4 規格的通訊技術,用來與 ZigBee通訊。

  • 站長您好 我已經以兩組LaunchPad + nRF24L01 燒範例進去成功運行
    想請問站長示範影片中是用哪個讀取工具呈現? 我用RealTerm在看的時候只有看到亂碼
    我想是因為 傳送的是字串 而且經過SPI.c轉換後字碼不是 ASCII(抱歉 我還在摸索怎麼改傳ASCII)
    想請教是使用那個顯示器可以正常顯示範例 讓我確定範例功能正常 好進行自學修改

  • 獨夜 :
    影片下其實有附上原始碼連結,你可以參考看看。
    ic是g2553,不過不限定。
    的確是只用兩組就完成傳輸功能:D

    有的 程式碼我一開始就抓了 不過沒有實體版子+ic讓我玩
    已經下單網購了~~ 要是撰寫遇到問題 可能會再過來這邊 或討論區練工
    謝謝版主啦 :)

  • 您好 對LaunchPad和nRF24L01 很有興趣
    能否請問影片中的所使用的是哪顆ic? (430系列的哪顆?)
    影片只使用 LaunchPad + nRF24L01 + 430 兩組就完成了傳輸功能嗎?
    想複製影片中的傳輸功能 自己用看看 方便以信箱交流嗎?