小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

物聯(lián)網(wǎng)之LoRa開發(fā)與應用二(驅(qū)動移植)

 袁先森lemon 2019-04-03

LoRa官方固件下載:https://pan.baidu.com/s/1ftP-HMJTmF9PtA05Lt-Tag 密碼:bc8y

IAR代碼操作快捷鍵

如果要在整個工程中查找 某個單詞或者其他,則按照如下方式查找:

LoRa驅(qū)動框架

硬件接口設計

硬件接口函數(shù)

驅(qū)動移植過程(修改代碼之后可以先編譯,然后再看哪里還需要修改)

LoRa固件中相關文件復制到IAR工程里面

IAR工程中添加工作組

添加相關文件(platform文件中請將下圖的sx1232-Hal.c換成sx1276-Hal.c,特此更正

修改硬件平臺:添加宏定義,選擇sx1276的硬件庫(platform文件中請將下圖的sx1232-Hal.c換成sx1276-Hal.c,特此更正

添加新增文件的包含路徑

修改硬件平臺:修改相關代碼,并添加宏定義,選擇我們實際使用的MCU硬件庫(本項目中使用的是STM32F051K8)(先編譯代碼,然后根據(jù)錯誤提示修改)

注釋掉USB相關代碼和初始化函數(shù)(先編譯代碼,然后根據(jù)錯誤提示修改)

 修改led.h中IO口定義(根據(jù)IO功能映射表)

PB0 LED4 數(shù)字輸出-無線通信網(wǎng)絡指示燈
PB1 LED3 數(shù)字輸出-無線通信發(fā)送指示燈
PB2 LED2 數(shù)字輸出-無線通信接收指示燈

typedef enum { LED_GREEN = 0,//如果從第二個成員開始,第一個就沒有任何意義,隨便填一個就可以了 LED_RX = 1,//接收指示燈,根據(jù)端口映射表可知,我們實際使用了三個指示燈。假設我們從第二個成員開始 LED_TX = 2,//發(fā)送指示燈 LED_NT = 3,//網(wǎng)絡指示燈#if defined( STM32F4XX ) || defined( STM32F2XX ) || defined( STM32F429_439xx ) LED_DBG3 = 4,#endif} tLed;

// RED#define LED1_PIN                         GPIO_PIN_2  //因為我們只用了三個指示燈,而且是從第二個成員開始定義的,所以這第一個是無效的,可以隨便填一個#define LED1_GPIO_PORT                   GPIOB//#define LED1_GPIO_CLK                    RCC_APB2Periph_GPIOE//以前的固件庫時鐘定義,HAL庫是不支持的,所以注釋掉// GREEN#define LED2_PIN                         GPIO_PIN_2 //無線通信接收指示燈#define LED2_GPIO_PORT                   GPIOB//#define LED2_GPIO_CLK                    RCC_APB2Periph_GPIOE//以前的固件庫時鐘定義,HAL庫是不支持的,所以注釋掉// DBG1#define LED3_PIN                         GPIO_PIN_1 //無線通信發(fā)送指示燈#define LED3_GPIO_PORT                   GPIOB//#define LED3_GPIO_CLK                    RCC_APB2Periph_GPIOE//以前的固件庫時鐘定義,HAL庫是不支持的,所以注釋掉// DBG2#define LED4_PIN                         GPIO_PIN_0 //無線通信網(wǎng)絡指示燈#define LED4_GPIO_PORT                   GPIOB//#define LED4_GPIO_CLK                    RCC_APB2Periph_GPIOE//以前的固件庫時鐘定義,HAL庫是不支持的,所以注釋掉

修改led.c

void LedOn( tLed led )//燈亮{ HAL_GPIO_WritePin( LedPort[led], LedPin[led], LED_ON );//HAL庫函數(shù)原型:void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)}void LedOff( tLed led )//燈滅{ HAL_GPIO_WritePin( LedPort[led], LedPin[led], LED_OFF ); //HAL庫函數(shù)原型:void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)}void LedToggle( tLed led )//燈狀態(tài)翻轉(zhuǎn),此處不使用{ //LedPort[led]->ODR ^= LedPin[led]; }

#if LED_INV#define LED_ON                           GPIO_PIN_RESET#define LED_OFF                          GPIO_PIN_SET#else#define LED_ON                           GPIO_PIN_SET#define LED_OFF                          GPIO_PIN_RESET#endif

修改sx1276-Hal.c(請將下圖的sx1232-Hal.c換成sx1276-Hal.c,其代碼修改方式一致,特此更正

PA7 NSS_LoRa LoRa模塊片選接口

PA11 DIO0 數(shù)字量輸入-LoRa數(shù)字IO0
PA12 DIO1

數(shù)字量輸入-LoRa數(shù)字IO1

PA2 DIO3 數(shù)字量輸入-LoRa數(shù)字IO3
PA3 DIO2 數(shù)字量輸入-LoRa數(shù)字IO2

/*! * SX1232 SPI NSS I/O definitions */#if defined( STM32F4XX ) || defined( STM32F2XX )#define NSS_IOPORT GPIOA#define NSS_PIN GPIO_Pin_15#else#define NSS_IOPORT GPIOA#define NSS_PIN GPIO_PIN_7#endif/*! * SX1232 DIO pins I/O definitions */#if defined( STM32F4XX ) || defined( STM32F2XX )#define DIO0_IOPORT GPIOG#define DIO0_PIN GPIO_Pin_13#else#define DIO0_IOPORT GPIOA#define DIO0_PIN GPIO_PIN_11#endif#if defined( STM32F4XX ) || defined( STM32F2XX )#define DIO1_IOPORT GPIOB#define DIO1_PIN GPIO_Pin_8#else#define DIO1_IOPORT GPIOA#define DIO1_PIN GPIO_PIN_12#endif#if defined( STM32F4XX ) || defined( STM32F2XX )#define DIO2_IOPORT GPIOA#define DIO2_PIN GPIO_Pin_2#else#define DIO2_IOPORT GPIOA#define DIO2_PIN GPIO_PIN_3#endif#if defined( STM32F4XX ) || defined( STM32F2XX )#define DIO3_IOPORT #define DIO3_PIN RF_DIO3_PIN#else#define DIO3_IOPORT GPIOA#define DIO3_PIN GPIO_PIN_2#endif

另外具體分析 sx1276-Hal.c中的如下代碼:

?void SX1276WriteBuffer( uint8_t addr, uint8_t *buffer, uint8_t size ){    uint8_t i;     //NSS = 0;    HAL_GPIO_WritePin( NSS_IOPORT, NSS_PIN, GPIO_PIN_RESET );//SPI片選引腳NSS拉低,SPI被選中     SpiInOut( addr | 0x80 );//SPI第一個數(shù)據(jù)字節(jié)為地址域,bit7 為讀寫控制位, “1” 表示寫, “0” 表示讀;bit(6-0)對應當前操作的寄存器地址,這里是寫操作    for( i = 0; i < size; i++ )    {        SpiInOut( buffer[i] );    }     //NSS = 1;    HAL_GPIO_WritePin( NSS_IOPORT, NSS_PIN, GPIO_PIN_SET );//SPI片選引腳NSS拉高,SPI不工作} void SX1276ReadBuffer( uint8_t addr, uint8_t *buffer, uint8_t size ){    uint8_t i;     //NSS = 0;    HAL_GPIO_WritePin( NSS_IOPORT, NSS_PIN, GPIO_PIN_RESET );     SpiInOut( addr & 0x7F );//SPI第一個數(shù)據(jù)字節(jié)為地址域,bit7 為讀寫控制位, “1” 表示寫, “0” 表示讀;bit(6-0)對應當前操作的寄存器地址,這里是讀操作     for( i = 0; i < size; i++ )    {        buffer[i] = SpiInOut( 0 );    }     //NSS = 1;    HAL_GPIO_WritePin( NSS_IOPORT, NSS_PIN, GPIO_PIN_SET );} void SX1276Write( uint8_t addr, uint8_t data ){    SX1276WriteBuffer( addr, &data, 1 );} void SX1276Read( uint8_t addr, uint8_t *data ){    SX1276ReadBuffer( addr, data, 1 );} void SX1276WriteFifo( uint8_t *buffer, uint8_t size ){    SX1276WriteBuffer( 0, buffer, size );/* 在連續(xù)讀寫操作模式時, 寄存器會自動加“1” ,                       直到NSS腳被拉高;特別注意: FIFO操作時, 寄存器地址不會自動增加,                        而是FIFO內(nèi)的緩存地址。*/} void SX1276ReadFifo( uint8_t *buffer, uint8_t size ){    SX1276ReadBuffer( 0, buffer, size ); /*在連續(xù)讀寫操作模式時, 寄存器會自動加“1” ,                       直到NSS腳被拉高;特別注意: FIFO操作時, 寄存器地址不會自動增加,                        而是FIFO內(nèi)的緩存地址。*/} inline uint8_t SX1276ReadDio0( void ){    return HAL_GPIO_ReadPin( DIO0_IOPORT, DIO0_PIN );//讀取DIO0引腳的狀態(tài)} inline uint8_t SX1276ReadDio1( void ){    return HAL_GPIO_ReadPin( DIO1_IOPORT, DIO1_PIN );} inline uint8_t SX1276ReadDio2( void ){    return HAL_GPIO_ReadPin( DIO2_IOPORT, DIO2_PIN );}

修改sx1276-Hal.h

#define GET_TICK_COUNT( ) ( HAL_GetTick() )#define TICK_RATE_MS( ms ) ( ms )

修改spi.c

//**********************************//////函數(shù)名稱:   SpiInOut////函數(shù)描述:   SPI總線讀取寫入單個字節(jié)////函數(shù)參數(shù):   uint8_t////返回值:     uint8_t////創(chuàng)建者:     //*******************************//uint8_t SpiInOut( uint8_t outData ){  uint8_t pData = 0;//outData:發(fā)送的數(shù)據(jù)   pData:接收數(shù)據(jù)的緩存區(qū)  1:表示數(shù)據(jù)長度為1  0xffff:超時時間  if(HAL_SPI_TransmitReceive(&hspi1,&outData,&pData,1,0xffff) != HAL_OK)    return ERROR;  else    return pData;}

LoRa模塊上電自檢:如果能讀取LoRa芯片的版本號,則SPI功能正確,驅(qū)動移植成功

上電通過SPI總線讀取芯片版本,判斷讀取值是否為0x12,并打印模塊版本號。

//如果要使用sx1278相關的接口函數(shù),則需要包含如下頭文件#include 'platform.h'#include 'radio.h'#include 'sx1276-Hal.h'#include 'sx1276-LoRa.h'#include 'sx1276-LoRaMisc.h'

  uint8_t RegVersion = 0;  SX1276Read( REG_LR_VERSION, &RegVersion );    if(RegVersion != 0x12)  {    printf('LoRa read Error!\r\n');    printf('LoRa RegVersion = %d!\r\n',RegVersion);  }  else  {    printf('LoRa read Ok!\r\n');    printf('LoRa RegVersion = %d!\r\n',RegVersion);  }

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多