時間過得真快,又到了一週一文的截止時間後了(?),今天要來跟大家談談Jack和Rose相遇的故事,讓我們把時間回到1912年的鐵達尼號…
啊,不對,是LaunchPad與nRF24L01才對。LaunchPad我相信有在關注Single.9的朋友們應該不會很陌生才是,假如你是隨Google大神的指引而來到寒舍的話,那麼你可以先參考這篇文章後在來看也不遲。
今天的豬腳是清蒸的主角是這個小小的傢伙,nRF24L01。別看他如此嬌小的樣貌,他的內部功能可以說是應有盡有,而且能力不輸ZigBee呢!
特色:
節錄自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模組上的第1、2腳分別接上負、正,電壓不可超過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 邂逅的方式,而他們的邂逅當然也有拍下珍貴的紀錄喔!(咦?)
View Comments
您好 對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通訊。