基于Si4432和SX1212間無線通信的實現 一、引言
在為客戶提供技術支持和RF定制的過程中,我們發現由于功能要求升級和產品更新換代等原因,經常會遇到需要內嵌不同無線芯片的模塊能相互通信的問題,但芯片間的規格、參數、數據格式的各種區別讓人不知從何著手。
本次測試選用的是深圳市思為無線科技有限公司自主研發的RF模塊RF4432PRO(內嵌Si4432芯片)和RF4463PRO(內嵌Si4463芯片),并描述了詳細實驗過程、硬件接口和相關示例程序,希望為解決不同無線芯片間的通信問題提供一個參考的方法。
深圳市思為無線科技有限公司是一家專注于RF及傳感器類模塊應用開發的技術、服務及銷售型公司。其針對不同的射頻芯片開發了多種應用模塊和方案。目前產品覆蓋有20mW、100mW、500mW、1W、2W、3W、5W 等不同功率等級;SPI、UART(含TTL/RS232/RS485及USB)等多種通訊接口; 315/ 433/470/868/915 MHz及2.4 GHz等不同工作頻率,總共上百種模塊。多年的沉淀和積累使得深圳市思為無線科技有限公司在射頻應用的軟硬件方面都有著強勁的研發實力和豐富的應用經驗。
二、實驗系統硬件設計
1. 芯片性能和特點
_m_gw_yqnvZxsIrrq9KAC-7TKGELV5NCOmf4ChJJ6VRHs5KvIrOzFbykU7wpBTCv_49lSGSEE60A97ZdkPoa0Xj635atyusk1sqJnfGh_4dEJcLdJ6RnoAxRwDTR0zKzzqVoXu.jpg (60.13 KB, 下載次數: 125)
下載附件
2015-9-9 12:16 上傳
_m_gw_yqnvZxsIrrq9KAC-7TKGELV5NCOmf4ChJJ6VRHs5KvIrOzFbykU7wpBTCv_49lSGNPP9ousUcnvD7ZR-0R3Z_arff1f8jPktBgmai4Qyr7v6TruB0lGtAAUqkeCjcHu0.jpg (86.75 KB, 下載次數: 145)
下載附件
2015-9-9 12:16 上傳
圖1:Si4432和Si4463芯片內置模塊框圖 RF4432PRO模塊中的Si4432是美國Silabs研發的一款工作頻段低于1GHz的高性能射頻收發芯片,屬于其EzRadioPro系類。在國內已經廣泛應用于工業、科研、醫療(ISM)以及短距離無線通信設備(SRD),其輸出功率可高達 +20 dBm,接收靈敏度亦達到 -121 dBm。
RF4463PRO模塊采用的是Silicon Lab Si4463器件,這是一款高度集成的無線ISM頻段收發芯片。極低的接收靈敏度(-126 dBm),再加上業界領先的+20 dBm的輸出功率保證擴大范圍和提高鏈路性能。同時內置天線多樣性和對跳頻支持可以用于進一步擴大范圍,提高性能。
具體參數可見Si4432和Si4463的芯片手冊。RF4432PRO和RF4463PRO模塊內提供了Si4432和Si4463芯片內置功能的硬件支持,用戶可直接根據芯片手冊進行模塊的編程開發與控制。
模塊
| RF4432PRO | RF4463PRO | 頻率范圍
| 403MHz,433MHz,463MHz | 403MHz,433MHz,463MHz | 發射電流
| 85mA,@20dBm | 85mA,@20dBm | 接收電流
| 18.5mA | 13.5mA | 靜態功耗
| <1uA | <0.1uA | 發射功率范圍
| 1dBm~20dBm | -5dBm~20dBm | 接收靈敏度
| -121dbm @ data=1.2kbps | -126dbm @data=500bps |
表1: 經測試RF4432與RF1212射頻參數對比 2.系統硬件設計
實驗系統硬件使用了無線模塊RF4432PRO和RF4463PRO及其相應的DEMO演示板。RF4432PRO和RF4463PRO模塊內含了經嚴格測試通過的工業級高性能的芯片應用電路。將各模塊通過插針連接在一起,便完成了硬件平臺的搭建。通過DEMO演示板中單片機的SPI口控制,兩個無線收發模塊之間相互通信,從而實現數據的無線傳輸。
無線模塊DEMO演示板(如下圖2)是配合無線前端收發模塊,為方便客戶調試程序、測試距離而研發的開發板。該DEMO演示板外置無線模塊引腳,設置參數可掉電保存。用戶可通過按鍵設置修改模塊的工作頻率、發射功率以及通訊速率等相關參數。DEMO演示板共有5種工作模式,如表2。
表3和表4分別是RF4463PRO模塊和RF4432PRO模塊的腳位定義,具體可見深圳市思為無線科技有限公司官網中的RF4432PRO規格書和RF4463PRO規格書。
_m_gw_yqnvZxsIrrq9KAC-7TKGELV5NCOmf4ChJJ6VRHs5KvIrOzFbykU7wpBTCv_49lSGeLQqHxOlbuFjDLkWKqMG7UdfwSrZkQ5nWpH-EkZAauTCLb2I1Nvuk6uBmMPnswCS.jpg (63.36 KB, 下載次數: 120)
下載附件
2015-9-9 12:16 上傳
圖2:DEMO演示板和無線模塊硬件連接
_m_gw_yqnvZxsIrrq9KAC-7TKGELV5NCOmf4ChJJ6VRHs5KvIrOzFbykU7wpBTCv_49lSGrSNBk7nob_5_720jFclNhkK70pcIQW9tqLmkwOSV_aRdCLD4ws-1HDFwP_Fgk3Ej.jpg (72.02 KB, 下載次數: 106)
下載附件
2015-9-9 12:16 上傳
圖3: DEMO演示板LCD界面
工作模式 | 描 述 | 正常發射 (主模式) | 定時發射數據包,成功發射一個數據包后紅燈亮,轉入接收模式,接收到應答信號后藍燈亮,LCD顯示發射和接收數據包的數量
| 正常接收 (從模式) | 接收數據包,接收正確藍燈亮,并將正確接收到的數據包再發射出去,發射成功后紅燈亮,LCD顯示發射和接收數據包的數量
| 常發射 (發射測試) | 模塊處于常發狀態,紅燈長亮,不顯示數據包數量
| 常接收 (接收測試) | 模塊處于常接收狀態,相應管腳實時輸出接收波形,不計算接收數據包數量
| 休眠 | RF模塊處于休眠狀態,可在此模式下測量靜態功耗
|
表2: DEMO演示板工作模式
腳位編號
| 引腳定義
| 描述 | 1 | GND
| 接電源地
| 2 | NC
| 空腳
| 3 | GPIO0
| 直接連芯片的GPIO0引腳
| 4 | GPIO1
| 直接連芯片的GPIO1引腳
| 5 | VCC
| 接電源正極3.3V
| 6 | SDO
| 0~VDD V數字輸出,提供了對內部控制寄存器的串行回讀功能
| 7 | SDI
| 串行數據輸入。0~VDD V數字輸入。該引腳為4線串行數據串行數據流總線。
| 8 | SCLK
| 串行時鐘輸入。0~VDD V數字輸入。該引腳提供了4線串行數據時鐘功能。
| 9 | nSEL
| 串行接口選擇輸入引腳。0~VDD V數字輸入。這個引腳為4線串行數據總線提供選擇/使能功能,這個信號也用于表示突發讀/寫模式。
| 10 | nIRQ
| 中斷輸出引腳
| 11 | SDN
| 關閉輸入引腳。0~VDD V數字輸入。在除關機模式的所有模式SDN=0。當SDN=1時芯片將徹底關閉并且寄存器的內容將丟失。
| 12 | GND
| 接電源地
| 13 | ANT
| 接50歐的同軸天線
| 14 | GND
| 接電源地
|
表3: RF4463PRO模塊的腳位定義
腳位編號
| 引腳定義
| 描述 | 1 | GND
| 接電源地
| 2 | GPIO0
| 內部已接模塊的發送控制腳
| 3 | GPIO1
| 內部已接模塊的接收控制腳
| 4 | GPIO2
| 直接連芯片的GPIO2腳
| 5 | VCC
| 接電源正極3.3V
| 6 | SDO
| 0~VDD V數字輸出,提供了對內部控制寄存器的串行回讀功能
| 7 | SDI
| 串行數據輸入。0~VDD V數字輸入。該引腳為4線串行數據流總線
| 8 | SCLK
| 串行時鐘輸入。0~VDD V數字輸入。該引腳提供了4線串行數據時鐘功能
| 9 |
nSEL
| 串行接口選擇輸入引腳。0~VDD V數字輸入。這個引腳為4線串行數據總線提供選擇/使能功能,這個信號也用于表示突發讀/寫模式。
| 10 | nIRQ
| 中斷輸出引腳
| 11 |
SDN
| 關閉輸入引腳。0~VDD V數字輸入。在除關機模式的所有模式SDN=0。當SDN=1時芯片將被徹底關閉并且寄存器的內容將丟失
| 12 | GND
| 接電源地
| 13 | ANT
| 接50歐的同軸天線
| 14 | GND
| 接電源地
|
表4: RF4432PRO模塊腳位定義 三、無線模塊工作原理
無線信號的發射和接收是將信號調制和解調的過程。無論是相同還是不同的無線模塊通信,發射和接收兩部分調制格式、調制速率和頻率、頻偏和接收帶寬等調制參數的差別都會導致模塊之間無法通信的情況。
3.1 SPI總線控制時序
RF4432PRO和RF4463PRO模塊與單片機的通信是RF模塊根據單片機通過SPI總線寫入的控制命令和數據將無線信號發射出去,并將接收到的數據和自身的相關信息通過SPI總線傳送給單片機。Si4432與Si4463的SPI時序稍有區別。
_m_gw_yqnvZxsIrrq9KAC-7TKGELV5NCOmf4ChJJ6VRHs5KvIrOzFbykU7wpBTCv_49lSGB2UDhlyXq4zj4MCnoI_s8h9an6Q_YuroP4gIdmfc0bqjjLw9XmDI8WTaDPWicem1.jpg (42.38 KB, 下載次數: 92)
下載附件
2015-9-9 12:16 上傳
圖4:Si4432芯片SPI寫時序
_m_gw_yqnvZxsIrrq9KAC-7TKGELV5NCOmf4ChJJ6VRHs5KvIrOzFbykU7wpBTCv_49lSGs6A9kzAP7TlSJ29SenqwERZXQu-58KWh2Xu1X2TsoD_EZZYB3Nar73TXDZZgy7lw.jpg (25.21 KB, 下載次數: 92)
下載附件
2015-9-9 12:16 上傳
圖5:Si4463芯片SPI寫時序 3.2 測試模式
RF4432PRO和RF4463PRO模塊的DEMO演示板都有常發和常收兩種測試模式,便于調試程序。RF4432PRO和RF1212模塊在DEMO演示板測試模式下共同點是不停地傳送“101010......”,并可在相應引腳看到接收的實時波形。
圖6:DEMO演示板測試模式波形 3.3 正常模式
RF4432PRO和RF4463PRO模塊的DEMO演示板的正常收發模式運行在Si4432和Si4463的PH+FIFO模式。
Si4432與Si4463都配置了64字節的FIFO及相應的數據包處理功能。該模式下,芯片自動添加和偵測前導碼、同步字、校驗等,并通過中斷表示通信狀態,大大方便了通信過程。在正常模式下通信,必須保證通信的兩個模塊的數據包格式設置完全一致,否則芯片將無法產生中斷。
_m_gw_yqnvZxsIrrq9KAC-7TKGELV5NCOmf4ChJJ6VRHs5KvIrOzFbykU7wpBTCv_49lSGajiH-y3CiqmCAa8H5Bz_yRzeNFdu8b5z6R-0Wr466c_KEAoN0ZYPb6KklskKZrny.jpg (30.84 KB, 下載次數: 113)
下載附件
2015-9-9 12:16 上傳
圖7:Si4432數據包格式
_m_gw_yqnvZxsIrrq9KAC-7TKGELV5NCOmf4ChJJ6VRHs5KvIrOzFbykU7wpBTCv_49lSGbyWgqE0AkD_1sflxVVKdZk6He8eNZdFGMwnDZPgTBeWD8i9pKmH7eIcWiA1fTKcO.jpg (57.37 KB, 下載次數: 98)
下載附件
2015-9-9 12:16 上傳
圖8:Si4463數據包格式 3.4 總結
對比Si4432和Si4463芯片的數據包格式如表5。可以發現除了Si4463的數據包中可分為多個部分并各自設CRC校驗外,其余部分基本一致。為保證兩個芯片可以通信,將測試數據包格式設置如表6。
| Si4432 | Si4463 | 前導碼Preamble | 1~8 Bytes | 1~8 Bytes | 同步字Sync Word | 1~4 Bytes | 1~4 Bytes | 字頭TX Header | √ | √ | 數據長度Packet Length | √ | √ | 數據DATA | 0~64 Bytes | 0~64 Bytes | CRC | 0~2 Bytes | 0,2,4 Bytes |
表5: Si4432與Si4463數據包格式對比
| 前導碼 | 同步字
| 字頭 | 數據 | 長度 | Si4432 | 8 Bytes | 2 Bytes | 4 Bytes | 10 Bytes | Si4463 | 8 Bytes | 2 Bytes | 4 Bytes | 10 Bytes | 內容 | Si4432 | “010101...” | 0xb42b | “swwx” | “ABCDEFGHIm” | Si4463 | “010101...” | 0xb42b | “swwx” | “ABCDEFGHIm” |
表6:測試數據包格式 四、具體調試過程
系統通信采用的射頻參數設置為:收發頻率433.0 MHz、頻偏20 KHz、RF速率:1.2 Kbps。發送的數據格式如表6所示。
為確保RF4432PRO和RF4463PRO模塊都能正常工作和提供參考波形,首先分別使相同模塊能在該設置下使用DEMO演示板的正常模式通信。
4.1 對比接收與發射波形
數據包模式由于芯片自動處理數據,只顯示結果,不利于程序的調試。因此我們使用DEMO演示板測試模式和外置引腳,通過同步觀察發送和接收波形這種最直觀的方式,來判斷通信質量的好壞。
將RF4432PRO和RF4463PRO的GPIO2和GPIO1設置為Rx Data output功能輸出,使接收的數據可以分別從GPIO2和GPIO1腳上實時輸出。使用邏輯分析儀來同步觀察RF4463PRO和RF4432PRO模塊發射、接收的波形并做相應的對比。如圖10,可發現RF4432PRO和RF4463PRO能正確接收對方的發射信號。
_m_gw_yqnvZxsIrrq9KAC-7TKGELV5NCOmf4ChJJ6VRHs5KvIrOzFbykU7wpBTCv_49lSGPija2mw77uQSH1TImp1_kqAH0TRNDQIdgJiIqqQWEKwWinBmYpkCPAUa_gAlCNd7.jpg (70.56 KB, 下載次數: 127)
下載附件
2015-9-9 12:16 上傳
圖9:433MHz、1.2Kbps、20KHz頻偏下RF4432與RF4463接收測試波形 持續在測試模式下接收一段時間,觀察每個接收波形,如圖11,發現接收信號沒有變形,判斷在該射頻參數下RF4432PRO和RF4463PRO可以正常通信。
_m_gw_yqnvZxsIrrq9KAC-7TKGELV5NCOmf4ChJJ6VRHs5KvIrOzFbykU7wpBTCv_49lSG5qnhfT9GqZJnhVQnsF-hplbiP6QQGI3SD8sUG5TA410I-yE3uSTOIW_ENVZkZWL4.jpg (63.52 KB, 下載次數: 106)
下載附件
2015-9-9 12:16 上傳
圖10:433MHz、1.2Kbps、20KHz頻偏下RF4432與RF4463長時間接收測試波形 如果RF4432PRO和RF4463PRO模塊的接收波形不正確,可嘗試調整兩模塊的調制頻率、頻偏、帶寬等射頻參數。如RF4432PRO和RF4463PRO模塊的接收帶寬與發射頻偏設置不對應時,就會出現如圖11的接收波形錯誤情況。
_m_gw_yqnvZxsIrrq9KAC-7TKGELV5NCOmf4ChJJ6VRHs5KvIrOzFbykU7wpBTCv_49lSGbF5FJ5lUV6DpX9U_Z86Eon4y13mmXntUlxOWlouF99mioe5i3iho_Gk0g1XT4acs.jpg (41.11 KB, 下載次數: 136)
下載附件
2015-9-9 12:16 上傳
圖11 433MHz 、1.2kbps、 30khz頻偏下的RF4463接收波形 4.2 數據包模式接收
RF4432PRO模塊和RF4463PRO模塊互相接收波形正確,因此保留射頻參數,將DEMO演示板的工作模式設為正常模式,看能否讓芯片產生中斷。發現沒有RF4432PRO模塊和RF4463PRO模塊都沒有產生接收中斷。
分別將DEMO演示板設置成RF4432PRO正常發射、RF4463PRO測試接收,RF4463PRO正常發射、RF4432PRO測試接收,對比RF4432PRO和RF4463PRO發射的數據包波形,發現兩模塊的數據包格式設置不一致。
_m_gw_yqnvZxsIrrq9KAC-7TKGELV5NCOmf4ChJJ6VRHs5KvIrOzFbykU7wpBTCv_49lSGnvKYSi_B_-d7HIOpN0U6FvgVFl9YrYc6sn2DeUaTnsKadnOdZs5EtKS8vqXuX71_.jpg (61.94 KB, 下載次數: 100)
下載附件
2015-9-9 12:16 上傳
圖12: 433MHz 、1.2kbps、20khz頻偏下RF4432和RF4463發送數據包波形 經對比,發現4463的同步字與設置“0x2DD4”不符,而是“0xB42B”。且4432的前導碼為“0101...”,不是之前默認的“1010...”。將兩模塊的數據包格式重新調整,用DEMO演示板正常模式通信。發現RF4432PRO和RF4463PRO模塊都產生了接收中斷。
RF4432發射中斷
_m_gw_yqnvZxsIrrq9KAC-7TKGELV5NCOmf4ChJJ6VRHs5KvIrOzFbykU7wpBTCv_49lSGKv4d7QcoPY1rNJnFYMzIUzu_c31rIRXO0w-3q_wkYB8jQGEyU0MNadlrcwy6PACb.jpg (53.26 KB, 下載次數: 98)
下載附件
2015-9-9 12:16 上傳
|
圖13:433MHz 、1.2kbps 、20khz頻偏RF4463和RF4432中斷
4.3總體流程圖
_m_gw_yqnvZxsIrrq9KAC-7TKGELV5NCOmf4ChJJ6VRHs5KvIrOzFbykU7wpBTCv_49lSGAJWHDVMMmCYpJQyeWnkVaz9H4GH4XWVkIbyZxtwG_9-RsR-O-c4yq5tr-bOZKjbL.jpg (88.21 KB, 下載次數: 100)
下載附件
2015-9-9 12:16 上傳
圖14: RF4432PRO和RF4463PRO通信調試流程圖
五、實驗結果
5.1 硬件結果 RF4463PRO工作在DEMO演示板的正常發射模式,RF4432PRO工作在DEMO演示板的正常接收模式。發送和接收的數據包數量顯示在屏幕上。如圖18,發送一段時間后沒有丟包現象。
_m_gw_yqnvZxsIrrq9KAC-7TKGELV5NCOmf4ChJJ6VRHs5KvIrOzFbykU7wpBTCv_49lSGb3Su4WVmTyPD0ISvrwvz6kTRntAwlSzj7a3HGvs1g3OMR-3lMTQijAI0l9gMY3te.jpg (147.89 KB, 下載次數: 101)
下載附件
2015-9-9 12:16 上傳
圖15: RF4432PRO(左)與RF4463PRO通信實物圖 5.2 軟件結果
圖19中4432IRQ為RF4432PRO中斷引腳,4463IRQ為RF4463PRO的中斷引腳。可見每個發送中斷都有相應的接收中斷。
_m_gw_yqnvZxsIrrq9KAC-7TKGELV5NCOmf4ChJJ6VRHs5KvIrOzFbykU7wpBTCv_49lSGo5eueP43ot-Ac2-CmkFuH84AHjWQKUJ5QMFj_uAjjWav3DKRGEf46yCFVdGBzhrf.jpg (71.94 KB, 下載次數: 111)
下載附件
2015-9-9 12:16 上傳
圖16: RF4432PRO和RF4463PRO通信中斷 六、示例程序
實驗的關鍵在于RF4432PRO和RF4463PRO模塊的初始化設置部分,其余與相同模塊間的通信程序一致。將以下測試可行的RF4432PRO和RF4463PRO模塊初始化代碼直接代入通信程序,即可實現RF4432PRO和RF4463PRO模塊間的通信。本實驗使用的完整測試程序可見深圳市思為無線科技有限公司官網的RF4432 DEMO CODE和RF4463 DEMO CODE。
6.1 RF4432PRO初始化示例
void SI4432_init(void)
{
ItStatus1 = spi_rw(0x03,0x00); // clr RF interrupt factor
ItStatus2 = spi_rw(0x04,0x00);
SpiWriteCfg(0x06|0x80, 0x00); // Set RF interrupt
SpiWriteCfg(0x07|0x80, SI4432_PWRSTATE_READY); // enter ready mode
SpiWriteCfg(0x09|0x80, 0x7f); // load cap = 12P
SpiWriteCfg(0x0a|0x80, 0x05); // output clk set
SpiWriteCfg(0x0b|0x80,0xea); // gpio0 for digital output
SpiWriteCfg(0x0c|0x80,0xea); // gpio0 for digital output
SpiWriteCfg(0x0d|0x80, 0xf4); // GPIO 2 = rx data
SpiWriteCfg(0x70|0x80, 0x2c);
SpiWriteCfg(0x1d|0x80, 0x40); // enable afc
// 1.2K bps setting
SpiWriteCfg(0x1c, 0x16); // according to Silabs's excel
SpiWriteCfg(0x20, 0x83);
SpiWriteCfg(0x21, 0xc0);
SpiWriteCfg(0x22, 0x13);
SpiWriteCfg(0x23, 0xa9);
SpiWriteCfg(0x24, 0x00);
SpiWriteCfg(0x25, 0x04);
SpiWriteCfg(0x2a, 0x14);
SpiWriteCfg(0x72, 0x20);
SpiWriteCfg(0x6e, 0x09);
SpiWriteCfg(0x6f, 0xd5);
SpiWriteCfg(0x70, 0x2c);
// 1.2K bps setting end
SpiWriteCfg(0x30|0x80, 0x88); // enable packet handler, msb first, enable crc,
SpiWriteCfg(0x32|0x80, 0xff); // 0x32address enable for headere byte 0, 1,2,3, receive header check for byte 0, 1,2,3
SpiWriteCfg(0x33|0x80, 0x4a); // header 3, 2, 1,0 used for head length, fixed packet length,
SpiWriteCfg(0x34|0x80, 64); // preamble = 64 nibbles
SpiWriteCfg(0x35|0x80, 0x20); // preamble detection = 20 bit
SpiWriteCfg(0x36|0x80,b4); // sync word = 0xb42b
SpiWriteCfg(0x37|0x80,2b);
SpiWriteCfg(0x38|0x80, 0x00);
SpiWriteCfg(0x39|0x80, 0x00);
SpiWriteCfg(0x3a|0x80, 's'); // tx header
SpiWriteCfg(0x3b|0x80, 'w');
SpiWriteCfg(0x3c|0x80, 'w');
SpiWriteCfg(0x3d|0x80, 'x');
SpiWriteCfg(0x3e|0x80, 10); // total tx 10 byte
SpiWriteCfg(0x3f|0x80, 's'); // check hearder
SpiWriteCfg(0x40|0x80, 'w');
SpiWriteCfg(0x41|0x80, 'w');
SpiWriteCfg(0x42|0x80, 'x');
SpiWriteCfg(0x43|0x80, 0xff); // all the bit to be checked
SpiWriteCfg(0x44|0x80, 0xff); // all the bit to be checked
SpiWriteCfg(0x45|0x80, 0xff); // all the bit to be checked
SpiWriteCfg(0x46|0x80, 0xff); // all the bit to be checked
SpiWriteCfg(0x6d|0x80, 0x07); // maximum ouput power
SpiWriteCfg(0x79|0x80, 0x0); // non hop
SpiWriteCfg(0x7a|0x80, 0x0); // non hop
SpiWriteCfg(0x71|0x80, 0x22); // FiFo, FSK , not need clk
SpiWriteCfg(0x72|0x80, 0x50); // deviation: 50KHz
SpiWriteCfg(0x73|0x80, 0x0); // no frequency offset
SpiWriteCfg(0x74|0x80, 0x0); // no frequency offset
SpiWriteCfg(0x75|0x80,0x53);
SpiWriteCfg(0x76|0x80,0x57);
SpiWriteCfg(0x77|0x80,0x80); // frequency:433.5 MHz
}
6.2 RF4463初始化示例
const unsigned char RF_MODEM_CLKGEN_BAND_1_data[] = {RF_MODEM_CLKGEN_BAND_1};
//according to Silabs's wireless development suite
const unsigned char RF_FREQ_CONTROL_INTE_8_data[] = {RF_FREQ_CONTROL_INTE_8};
const unsigned char RF_POWER_UP_data[] = { RF_POWER_UP};
const unsigned char RF_GPIO_PIN_CFG_data[] = { RF_GPIO_PIN_CFG};
const unsigned char RF_GLOBAL_XO_TUNE_1_data[] = { RF_GLOBAL_XO_TUNE_1};
const unsigned char RF_GLOBAL_CONFIG_1_data[] = { RF_GLOBAL_CONFIG_1};
const unsigned char RF_FRR_CTL_A_MODE_4_data[] = { RF_FRR_CTL_A_MODE_4};
const unsigned char RF_PREAMBLE_TX_LENGTH_9_data[] = { RF_PREAMBLE_TX_LENGTH_9};
const unsigned char RF_SYNC_CONFIG_5_data[] = { RF_SYNC_CONFIG_5};
const unsigned char RF_PKT_CRC_CONFIG_1_data[] = { RF_PKT_CRC_CONFIG_1};
const unsigned char RF_PKT_CONFIG1_1_data[] = { RF_PKT_CONFIG1_1};
const unsigned char RF_PKT_LEN_3_data[] = { RF_PKT_LEN_3};
const unsigned char RF_PKT_FIELD_1_LENGTH_12_8_12_data[]={ RF_PKT_FIELD_1_LENGTH_12_8_12}; const unsigned char RF_PKT_FIELD_4_LENGTH_12_8_8_data[] = { RF_PKT_FIELD_4_LENGTH_12_8_8};
const unsigned char RF_MODEM_FREQ_DEV_0_1_data[] = { RF_MODEM_FREQ_DEV_0_1};
const unsigned char RF_MODEM_AGC_CONTROL_1_data[] ={ RF_MODEM_AGC_CONTROL_1};
const unsigned char RF_MATCH_VALUE_1_12_data[] ={ RF_MATCH_VALUE_1_12};
const unsigned char RF_MODEM_RSSI_COMP_1_data[] = { RF_MODEM_RSSI_COMP_1};
const unsigned char RF_MODEM_MOD_TYPE_12_data[]= {RF_MODEM_MOD_TYPE_12};
const unsigned char RF_MODEM_TX_RAMP_DELAY_8_data[]= {RF_MODEM_TX_RAMP_DELAY_8};
const unsigned char RF_MODEM_BCR_OSR_1_9_data[]={RF_MODEM_BCR_OSR_1_9};
const unsigned char RF_MODEM_AFC_GEAR_7_data[]={RF_MODEM_AFC_GEAR_7};
const unsigned charRF_MODEM_AGC_WINDOW_SIZE_9_data[]={RF_MODEM_AGC_WINDOW_SIZE_9}; const unsigned char RF_MODEM_OOK_CNT1_11_data[]={RF_MODEM_OOK_CNT1_11};
const unsigned char RF_MODEM_CHFLT_RX1_CHFLT_COE13_7_0_12_data[]= {RF_MODEM_CHFLT_RX1_CHFLT_COE13_7_0_12}; const unsigned char RF_MODEM_CHFLT_RX1_CHFLT_COE1_7_0_12_data[]
={RF_MODEM_CHFLT_RX1_CHFLT_COE1_7_0_12};
const unsigned char RF_MODEM_CHFLT_RX2_CHFLT_COE7_7_0_12_data[]=
{RF_MODEM_CHFLT_RX2_CHFLT_COE7_7_0_12};
const unsigned char RF_SYNTH_PFDCP_CPFF_7_data[]={RF_SYNTH_PFDCP_CPFF_7};
void SI4463_init(void)
{
U8 app_command_buf[20],i;
//spi_write(0x07, RF_GPIO_PIN_CFG_data);
app_command_buf[0] = 0x13; // SET GPIO PORT
app_command_buf[1] = 0x14; // gpio 0 ,Rx data
app_command_buf[2] = 0x02; // gpio1, output 0
app_command_buf[3] = 0x21; // gpio2, hign while in receive mode
app_command_buf[4] = 0x20; // gpio3, hign while in transmit mode
app_command_buf[5] = 0x27; // nIRQ
app_command_buf[6] = 0x0b; // sdo
spi_write(7, app_command_buf);
// spi_write(0x05, RF_GLOBAL_XO_TUNE_1_data);
app_command_buf[0] = 0x11;
app_command_buf[1] = 0x00;
app_command_buf[2] = 0x01;
app_command_buf[3] = 0x00;
app_command_buf[4] = 98; // freq adjustment
spi_write(5, app_command_buf);
// spi_write(0x05, RF_GLOBAL_CONFIG_1_data);
app_command_buf[0] = 0x11;
app_command_buf[1] = 0x00;
app_command_buf[2] = 0x01;
app_command_buf[3] = 0x03;
app_command_buf[4] = 0x40; // tx = rx = 64 byte,PH,high performance mode
spi_write(5, app_command_buf);
spi_write(0x08, RF_FRR_CTL_A_MODE_4_data); // disable all fast response register
// spi_write(0x0D, RF_PREAMBLE_TX_LENGTH_9_data); // set Preamble
app_command_buf[0] = 0x11;
app_command_buf[1] = 0x10;
app_command_buf[2] = 0x09;
app_command_buf[3] = 0x00;
app_command_buf[4] = 0x08; // 8 bytes Preamble
app_command_buf[5] = 0x14; // detect 20 bits
app_command_buf[6] = 0x00;
app_command_buf[7] = 0x0f;
app_command_buf[8] = 0x32; // no manchest.1010...
app_command_buf[9] = 0x00;
app_command_buf[10] = 0x00;
app_command_buf[11] = 0x00;
app_command_buf[12] = 0x00;
spi_write(13, app_command_buf); //
// RF_SYNC_CONFIG_5_data, // set sync
app_command_buf[0] = 0x11;
app_command_buf[1] = 0x11;
app_command_buf[2] = 0x05;
app_command_buf[3] = 0x00;
app_command_buf[4] = 0x01; // no manchest , 2 bytes
app_command_buf[5] = 0x2d; // sync byte3
app_command_buf[6] = 0xd4; // sync byte2
app_command_buf[7] = 0x00; // sync byte1
app_command_buf[8] = 0x00; // sync byte0
spi_write(9, app_command_buf);
// packet crc
app_command_buf[0] = 0x11;
app_command_buf[1] = 0x12;
app_command_buf[2] = 0x01;
app_command_buf[3] = 0x00;
app_command_buf[4] = 0x80; // no crc
spi_write(5, app_command_buf);
// packet gernale configuration
app_command_buf[0] = 0x11;
app_command_buf[1] = 0x12;
app_command_buf[2] = 0x01;
app_command_buf[3] = 0x06;
app_command_buf[4] = 0x02; // CRC MSB, data MSB
spi_write(5, app_command_buf);
// spi_write(0x07, RF_PKT_LEN_3_data);
app_command_buf[0] = 0x11;
app_command_buf[1] = 0x12;
app_command_buf[2] = 0x03;
app_command_buf[3] = 0x08;
app_command_buf[4] = 0x00;
app_command_buf[5] = 0x00;
app_command_buf[6] = 0x00;
spi_write(7, app_command_buf);
app_command_buf[0] = 0x11;
app_command_buf[1] = 0x12;
app_command_buf[2] = 0x0c;
app_command_buf[3] = 0x0d;
app_command_buf[4] = 0x00;
app_command_buf[5] = 14; //header(4)+10 bytes
app_command_buf[6] = 0x04;
app_command_buf[7] = 0xaa;
app_command_buf[8] = 0x00;
app_command_buf[9] = 0x00;
app_command_buf[10] = 0x00;
app_command_buf[11] = 0x00;
app_command_buf[12] = 0x00;
app_command_buf[13] = 0x00;
app_command_buf[14] = 0x00;
app_command_buf[15] = 0x00;
spi_write(16, app_command_buf); // set length of Field 1 -- 4
// spi_write(0x0C, RF_PKT_FIELD_4_LENGTH_12_8_8_data);
app_command_buf[0] = 0x11;
app_command_buf[1] = 0x12;
app_command_buf[2] = 0x08;
app_command_buf[3] = 0x19;
app_command_buf[4] = 0x00;
app_command_buf[5] = 0x00;
app_command_buf[6] = 0x00;
app_command_buf[7] = 0x00;
app_command_buf[8] = 0x00;
app_command_buf[9] = 0x00;
app_command_buf[10] = 0x00;
app_command_buf[11] = 0x00;
spi_write(12, app_command_buf);
spi_write(0x10, RF_MODEM_MOD_TYPE_12_data);
spi_write(0x05, RF_MODEM_FREQ_DEV_0_1_data);
spi_write(0x0C, RF_MODEM_TX_RAMP_DELAY_8_data);
spi_write(0x0D, RF_MODEM_BCR_OSR_1_9_data);
spi_write(0x0B, RF_MODEM_AFC_GEAR_7_data);
spi_write(0x05, RF_MODEM_AGC_CONTROL_1_data);
spi_write(0x0D, RF_MODEM_AGC_WINDOW_SIZE_9_data);
spi_write(0x0F, RF_MODEM_OOK_CNT1_11_data);
// spi_write(0x05, RF_MODEM_RSSI_COMP_1_data);
app_command_buf[0] = 0x11;
app_command_buf[1] = 0x20;
app_command_buf[2] = 0x01;
app_command_buf[3] = 0x4e;
app_command_buf[4] = 0x40;
spi_write(5, app_command_buf);
spi_write(0x10, RF_MODEM_CHFLT_RX1_CHFLT_COE13_7_0_12_data);
spi_write(0x10, RF_MODEM_CHFLT_RX1_CHFLT_COE1_7_0_12_data);
spi_write(0x10, RF_MODEM_CHFLT_RX2_CHFLT_COE7_7_0_12_data);
// RF_PA
app_command_buf[0] = 0x11;
app_command_buf[1] = 0x22;
app_command_buf[2] = 0x04;
app_command_buf[3] = 0x00;
app_command_buf[4] = 0x08;
app_command_buf[5] = 127; // set max power
app_command_buf[6] =0x00;
app_command_buf[7] = 0x3d;
spi_write(8, app_command_buf);
spi_write(0x0B, RF_SYNTH_PFDCP_CPFF_7_data);
// header match
app_command_buf[0] = 0x11;
app_command_buf[1] = 0x30;
app_command_buf[2] = 0x0c;
app_command_buf[3] = 0x00;
app_command_buf[4] = 's';
app_command_buf[5] = 0xff;
app_command_buf[6] = 0x40;
app_command_buf[7] = 'w';
app_command_buf[8] = 0xff;
app_command_buf[9] = 0x01;
app_command_buf[10] = 'w';
app_command_buf[11] =0xff;
app_command_buf[12] =0x02;
app_command_buf[13] = 'x';
app_command_buf[14] = 0xff;
app_command_buf[15] = 0x03;
spi_write(16, app_command_buf);
spi_write(5, RF_MODEM_CLKGEN_BAND_1_data);
spi_write(12, RF_FREQ_CONTROL_INTE_8_data); // set frequency =433.5
7 總結
本文描述了深圳市思為無線科技有限公司的無線收發模塊通信RF4432PRO和RF4463PRO間的詳細實現過程、硬件接口和示例程序,經實驗驗證可行。實現通信的基本方法是將RF4432PRO和RF4463PRO設置相同射頻參數及數據格式。這個方法也可以引申至其他不同無線模塊和無線芯片的通信。如遇到與文中不同的實驗現象,對實驗過程有疑問或其他想法歡迎與我們進行技術交流。
|