時間過得真快,又到了一週一文的截止時間後了(?),今天要來跟大家談談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 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
/* _ _ _ _ _ _ _ _ _ _ _ _ * |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模組上的第1、2腳分別接上負、正,電壓不可超過3.6V。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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裡面是簡易的範例程式可以參考看看。
1 2 3 4 5 6 7 |
// msp430's library #include <msp430.h> // API + SPI + UART #include "API.h" #include "SPI.h" #include "uart.h" |
話說我好像還沒寫 CCS 的使用說明,下次文章更新的時候我會順便寫的…(鞠躬)
如何使用
使用方法請參考SPI.c以及範例程式…基本上都有稍做翻譯了,這邊貼上接收與發射的主要程式片段。
發射(Tx)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
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 邂逅的方式,而他們的邂逅當然也有拍下珍貴的紀錄喔!(咦?)
您好 對LaunchPad和nRF24L01 很有興趣
能否請問影片中的所使用的是哪顆ic? (430系列的哪顆?)
影片只使用 LaunchPad + nRF24L01 + 430 兩組就完成了傳輸功能嗎?
想複製影片中的傳輸功能 自己用看看 方便以信箱交流嗎?
影片下其實有附上原始碼連結,你可以參考看看。
ic是g2553,不過不限定。
的確是只用兩組就完成傳輸功能:D
有的 程式碼我一開始就抓了 不過沒有實體版子+ic讓我玩
已經下單網購了~~ 要是撰寫遇到問題 可能會再過來這邊 或討論區練工
謝謝版主啦 🙂
站長您好 我已經以兩組LaunchPad + nRF24L01 燒範例進去成功運行
想請問站長示範影片中是用哪個讀取工具呈現? 我用RealTerm在看的時候只有看到亂碼
我想是因為 傳送的是字串 而且經過SPI.c轉換後字碼不是 ASCII(抱歉 我還在摸索怎麼改傳ASCII)
想請教是使用那個顯示器可以正常顯示範例 讓我確定範例功能正常 好進行自學修改
Windows是使用Putty,Linux則是用Terminator
要記得改接收速率,我記得這個版本的接收速率是…2400 XD
輸出碼都是ASCII。
您好:
我想請問一下關於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通訊。