LoRaWAN stack移植筆記 三

2022-07-18 07:24:09 字數 3109 閱讀 2741

由於例程使用的主控晶元為stm32l151c8t6,而在本設計中使用的主控晶元為stm32l051c8t6,核心不一樣,並且cube庫相關的函式介面及配置也會有不同,所以晶元的驅動所以做修改。

spi使用的是stm32的硬體介面-spi1 mosi miso

可以看到例程中,對spi介面進行了再一層的封裝,封裝如下:

/*!

* spi driver structure definition

*/struct spi_s

;

其中:

spi_handletypedef spi;
是原先的stm32cube庫的封裝,在此基礎上,將spi的引腳也封裝進了自定義的spi_s結構體中。這樣,檢視結構體就可以看到spi的所有情況。

初始化的函式體如下:

void spiinit( spi_t *obj, pinnames mosi, pinnames miso, pinnames sclk, pinnames nss )

else

if( nss == nc )

else

obj->spi.init.baudrateprescaler = spi_baudrateprescaler_8;

hal_spi_init( &obj->spi );

}``` c

spi的初始化函式是這樣被呼叫的:

``` c

spiinit( &sx1276.spi, radio_mosi, radio_miso,radio_sclk, nc );

//初始化函式的原型

void spiinit( spi_t *obj, pinnames mosi, pinnames miso, pinnames sclk, pinnames nss );

其中引腳定義是這樣的

#define radio_mosi                                pa_7

#define radio_miso pa_6

#define radio_sclk pa_5

#define radio_nss pa_4

可以看到spi的mosi/miso/sclk腳都有看到,但是nss腳看到,而是傳了nc。

這是為什麼呢?

可以看到程式裡面有段話

if( nss != nc )

else

其意思就是設定為nc就配置nss 為軟體控制,即nss腳只做片選使用,x像gpio一樣控制他拉高拉低就可以控制片選的使能與否了。

還有一處,設定spi的工作頻率的

spifrequency( obj, 10000000 );

void spifrequency( spi_t *obj, uint32_t hz )

由於__ffs這個函式只有cotex-m3以上核心才能呼叫,但是通過計算可知若傳參為10000000,__ffs這個函式的返回值為0x03,所以可得obj->spi.init.baudrateprescaler = 8,即spi_baudrateprescaler_8

因為

#define spi_baudrateprescaler_8         ((uint32_t)spi_cr1_br_1)

#define spi_cr1_br_1 (0x2u << spi_cr1_br_pos)

#define spi_cr1_br_pos (3u)

所以此處設定spi.init.baudrateprescaler = spi_baudrateprescaler_8;

最後再呼叫

hal_spi_init( &obj->spi );
至此,spi的初始化就完成了。

接下來就是spi的讀寫操作了,由於都是使用的cube庫,對暫存器的命名並沒有什麼不同,直接保留例程中的**就可以了。

//獲取spi的標誌位狀態

flagstatus spigetflag( spi_t *obj, uint16_t flag )

else

// return the spi_i2s_flag status

return bitstatus;

}//spi讀寫

uint16_t spiinout( spi_t *obj, uint16_t outdata )

__hal_spi_enable( &obj->spi );

while( spigetflag( obj, spi_flag_txe ) == reset );

obj->spi.instance->dr = ( uint16_t ) ( outdata & 0xff );

while( spigetflag( obj, spi_flag_rxne ) == reset );

rxdata = ( uint16_t ) obj->spi.instance->dr;

return( rxdata );

}

在使用上,需要注意nss引腳的操作,在進行讀寫前進行使能,讀寫完畢之後失能。程式如下圖所示:

//spi寫

void sx1276writebuffer( uint8_t addr, uint8_t *buffer, uint8_t size )

//nss = 1;

gpiowrite( &sx1276.spi.nss, 1 );

}//spi讀

void sx1276readbuffer( uint8_t addr, uint8_t *buffer, uint8_t size )

//nss = 1;

gpiowrite( &sx1276.spi.nss, 1 );

}

至此,lorawan例程中的spi的移植就完成了。

python可以移植嗎 移植python筆記

編譯環境 ubuntu 14.04.1 編譯器 gcc arm hisiv200 linux gnueabi python版本 2.7.3 整個過程相對簡單,分為三個步驟 編譯x86版本的python 給python原始碼打上交叉編譯補丁 交叉編譯python 編譯x86版本python 進入pyt...

STM32 FreeRtos Lwip移植筆記

現在,遇到了串列埠除錯的問題。串列埠傳輸有兩種方案 1 中斷函式接收完完整的frame之後用二值訊號量觸發阻塞的解析資料程序 2 新建佇列,中斷中將接收的資料send到佇列,解析程序讀佇列 但是在中斷裡傳送佇列這種行為想想都覺得危險,實時性再好 主頻再高也經不起這麼折騰。在同事小文的建議下,我果斷讓...

ok6410移植u boot 2012 10筆記

1.先根據這個文件移植nandflash,網絡卡部分 其它部分參考下面第四步的文章 2.以上是解決raise signal 8 caught的替換 3.關於nand的移植,文件中還差一步 在 driver mtd nand nand base.c 的 int nand scan tail struc...