Arduino LoRa SPI Driver

Arduino與LoRa

自從去年Arduino增加了對(duì)于STM32以及Semtech LoRa的支持后袭灯,基于Arduino的開發(fā)得到了長足的發(fā)展往核。由于Arduino不局限于ARM內(nèi)核赁酝,MCU多樣性比較高清焕,至少可以使用ESP8266/ESP32/STM32/AVR/PIC/K20等罕模。而Arduino社交化程度比較高匹中。

在同一硬件中,編程平臺(tái)朱浴、協(xié)議棧吊圾、應(yīng)用的復(fù)雜度呈現(xiàn)幾何級(jí)數(shù)上升。但不管如何翰蠢,選擇受眾多项乒,開發(fā)易的平臺(tái)依然很有用。

SPI 驅(qū)動(dòng)

無論是Arduino/mbed/MicroPython/Lua/JavaScript梁沧,驅(qū)動(dòng)LoRa的接口最簡單:SPI檀何,四線SPI加上RST/D0中斷即可。要調(diào)通SPI總線廷支,必須依賴一個(gè)工具:邏輯分析儀频鉴,淘寶D版。

screenshot_Arduino_9bit_SPI.png

Fig 1: Arduino firmware, abnormal SPI operation for leading pulse

Arduino的SPI驅(qū)動(dòng)中有個(gè)SPI參數(shù)配置:

SPISettings _spiSettings(8E6, MSBFIRST, SPI_MODE0);

一開始我把它放在CS拉低之后恋拍,發(fā)現(xiàn)其初始化會(huì)導(dǎo)致一個(gè)毛刺垛孔,形成9個(gè)脈沖,導(dǎo)致總線出錯(cuò)施敢。參見附圖1周荐。

screenshot_Arduino_9bit_SPI_CS_out.png

Fig2 : Arduino firmware, normal SPI operation for leading pulse outside of CS period

于是我把參數(shù)設(shè)置放置在CS拉低之前。

uint8_t singleTransfer(uint8_t address, uint8_t value)
{
  uint8_t response;
  
  _spiSettings = SPISettings(FREQ, MSBFIRST, SPI_MODE0);
  SPI.beginTransaction(_spiSettings);
  digitalWrite(SS, LOW);
  SPI.transfer(address);
  response = SPI.transfer(value);
  SPI.endTransaction();
  digitalWrite(SS, HIGH);

  return response;
}

這段代碼中悯姊,先初始化配置羡藐,然后拉低CS,然后進(jìn)行傳輸悯许,最后要關(guān)閉SPI仆嗦。參見附圖,即便有個(gè)毛刺先壕,也是在CS周期之外瘩扼。所以總線讀寫正常。但是返回二進(jìn)制卻總是0xFF或0x00垃僚。

screenshot_mbed_8bit_normal.png

Fig3: mbed firmware, normal SPI operation

由于mbed/Arduino共享目標(biāo)板和STLINK集绰,我立刻下載了一個(gè)mbed固件,發(fā)現(xiàn)mbed的確總線比較干凈谆棺,返回值也正確:0x12栽燕,是SX127X的返回值罕袋。參考附圖3。

screenshot_Arduino_8bit_normal.png

Fig4: Arduino firmware, normal SPI operation

由于SPI總線硬件無需驗(yàn)證碍岔,剩下的就是總線速率和RST引腳浴讯,所以將總線速度升到8MHz,POR之后RST對(duì)SX127X拉低20ms后拉高“玻現(xiàn)在Arduino的代碼也可以返回0x12了榆纽。但是CS的周期很長,比較怪異捏肢。

ESP8266/STM32

ESP8266的驅(qū)動(dòng)略有不同奈籽。接下來,我會(huì)將常見的LoRa PHY驅(qū)動(dòng)集成在SPI之上鸵赫。Arduino好像不支持printf()衣屏,需要打碎成為多個(gè)print()函數(shù)。略有不便辩棒。

代碼

#include <SPI.h>

#define LED_BP PC13 // BluePill
#define REG_VERSION              0x42
#define RST A0  //PA0 //2
#define SS  D10 //PB6 //15
#define FREQ 8E6

SPISettings _spiSettings(8E6, MSBFIRST, SPI_MODE0);

uint8_t singleTransfer(uint8_t address, uint8_t value)
{
  uint8_t response;
  
  _spiSettings = SPISettings(FREQ, MSBFIRST, SPI_MODE0);
  SPI.beginTransaction(_spiSettings);
  digitalWrite(SS, LOW);
  SPI.transfer(address);
  response = SPI.transfer(value);
  SPI.endTransaction();
  digitalWrite(SS, HIGH);

  return response;
}

uint8_t readRegister(uint8_t address)
{
  return singleTransfer(address & 0x7f, 0x00);
}

void setup() {
  pinMode(LED_BP, OUTPUT);
  pinMode(SS,OUTPUT);
  pinMode(RST,OUTPUT);
  digitalWrite(RST, LOW);
  delay(20);
  digitalWrite(RST, HIGH);

  SPI.begin();
  //_spiSettings = SPISettings(1E6, MSBFIRST, SPI_MODE0);
  //SPI.beginTransaction(_spiSettings);

  Serial.begin(115200);
  Serial.println("SPI Test");  
}

void loop() {
  uint8_t res;

  res = readRegister(0x42);
  //Serial.printf("Register[0x42] = 0x%02X\n\r",res);
  Serial.print("Register[0x42]=0x");
  Serial.println(res, HEX);

  if (res!=0x12){
    digitalWrite(LED_BP, HIGH);   // turn the LED on (HIGH is the voltage level)
    delay(500);                       // wait for a second
    digitalWrite(LED_BP, LOW);    // turn the LED off by making the voltage LOW
    delay(500);                       // wait for a second
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末勾拉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子盗温,更是在濱河造成了極大的恐慌,老刑警劉巖成肘,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卖局,死亡現(xiàn)場離奇詭異,居然都是意外死亡双霍,警方通過查閱死者的電腦和手機(jī)砚偶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來洒闸,“玉大人染坯,你說我怎么就攤上這事∏鹨荩” “怎么了单鹿?”我有些...
    開封第一講書人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長深纲。 經(jīng)常有香客問我仲锄,道長,這世上最難降的妖魔是什么湃鹊? 我笑而不...
    開封第一講書人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任儒喊,我火速辦了婚禮,結(jié)果婚禮上币呵,老公的妹妹穿的比我還像新娘怀愧。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開白布芯义。 她就那樣靜靜地躺著哈垢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪毕贼。 梳的紋絲不亂的頭發(fā)上温赔,一...
    開封第一講書人閱讀 52,713評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音鬼癣,去河邊找鬼陶贼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛待秃,可吹牛的內(nèi)容都是我干的拜秧。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼章郁,長吁一口氣:“原來是場噩夢啊……” “哼枉氮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起暖庄,我...
    開封第一講書人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤聊替,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后培廓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惹悄,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年肩钠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了泣港。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡价匠,死狀恐怖当纱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情踩窖,我是刑警寧澤坡氯,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站洋腮,受9級(jí)特大地震影響廉沮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜徐矩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一滞时、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧滤灯,春花似錦坪稽、人聲如沸曼玩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽黍判。三九已至,卻和暖如春篙梢,著一層夾襖步出監(jiān)牢的瞬間顷帖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來泰國打工渤滞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贬墩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓妄呕,卻偏偏與公主長得像陶舞,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子绪励,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容