,,,
(1.福建商學(xué)院,福州 350012;2.福建工程學(xué)院)
RT-Thread的SPI總線驅(qū)動結(jié)構(gòu)分析、移植及應(yīng)用*
高培1,何棟煒2,李文翔1,林丹楠1
(1.福建商學(xué)院,福州 350012;2.福建工程學(xué)院)
介紹了串行外設(shè)接口SPI的通信原理,對RT-Thread操作系統(tǒng)下的SPI總線驅(qū)動結(jié)構(gòu)進(jìn)行了詳細(xì)的研究與分析。以STM32F407ZG對W25Q64的讀寫為例,介紹了硬件SPI總線驅(qū)動的移植步驟,并詳細(xì)介紹了SPI應(yīng)用程序設(shè)計及技術(shù)實施細(xì)節(jié)。最后通過實驗,對SPI驅(qū)動移植及程序設(shè)計的可行性及有效性進(jìn)行驗證,實驗結(jié)果表明,RT-Thread操作系統(tǒng)下的SPI總線驅(qū)動結(jié)構(gòu)設(shè)計合理,移植方便且應(yīng)用程序設(shè)計簡單,本文所介紹的移植與應(yīng)用方法可行有效。
RT-Thread;SPI;驅(qū)動結(jié)構(gòu);分析;移植;應(yīng)用
RT-Thread是開源的嵌入式實時操作系統(tǒng),由國內(nèi)一些專業(yè)開發(fā)人員開發(fā)、維護(hù),主要優(yōu)點是實時、小型、可裁剪以及支持的處理器平臺廣泛[1]。RT-thread不僅是一款高效、穩(wěn)定的實時核心,也是一套面向嵌入式系統(tǒng)的軟件平臺,在借鑒其他實時操作系統(tǒng)優(yōu)點的基礎(chǔ)上又具有自己的特點,被廣泛應(yīng)用在工業(yè)控制和物聯(lián)網(wǎng)應(yīng)用等領(lǐng)域[2-4]。由于SPI在芯片的引腳上只占用4根線,節(jié)約了芯片的引腳,同時為PCB的布局節(jié)省空間,提供方便。正是出于這種簡單易用的特性,如今越來越多的芯片集成了這種通信協(xié)議,被廣泛應(yīng)用在嵌入式系統(tǒng)中[5]。
本文介紹了SPI驅(qū)動的通信原理,對RT-Thread操作系統(tǒng)下SPI驅(qū)動結(jié)構(gòu)進(jìn)行了分析,以STM32F407ZG讀寫64 Mb的串行Flash存儲器W25Q64為例,對SPI總線驅(qū)動移植步驟及應(yīng)用程序設(shè)計進(jìn)行了詳細(xì)的描述。
SPI系統(tǒng)可以直接與各個廠家生產(chǎn)的多種標(biāo)準(zhǔn)外圍器件直接連接,它以主從方式工作,通常有一個主設(shè)備和一個或多個從設(shè)備,一般使用4條線,分別是:總線主機(jī)輸入/從機(jī)輸出MISO、總線主機(jī)輸出/從機(jī)輸入MOSI、時鐘信號SCLK、使能信號CS。其中,MISO信號是一個單向信號,它將數(shù)據(jù)由從設(shè)備傳輸?shù)街髟O(shè)備,MOSI信號也是一個單向信號,它則將數(shù)據(jù)從主設(shè)備傳輸?shù)綇脑O(shè)備。時鐘信號SCLK由主設(shè)備產(chǎn)生,從設(shè)備接收,用于同步SPI接口間數(shù)據(jù)傳輸?shù)臅r鐘信號。圖1所示為SPI總線架構(gòu)圖,只有片選信號為預(yù)先規(guī)定的使能信號時(高電位或低電位),對該芯片的操作才有效,這就允許在同一總線上連接多個SPI設(shè)備。
圖1 SPI總線架構(gòu)圖
SPI通信是通過數(shù)據(jù)交換完成的,SPI是串行通信協(xié)議,數(shù)據(jù)是一位一位傳輸?shù)摹CLK提供時鐘脈沖,MOSI和MISO基于此脈沖完成數(shù)據(jù)傳輸。主設(shè)備數(shù)據(jù)輸出通過MOSI線,數(shù)據(jù)在時鐘上升沿或下降沿時改變,在緊接著的下降沿或上升沿被從設(shè)備讀取,經(jīng)過8個時鐘周期完成1個字節(jié)的發(fā)送。主設(shè)備通過對SCLK時鐘線的控制可以完成對通信的控制,當(dāng)沒有時鐘跳變時,從設(shè)備不采集或傳送數(shù)據(jù)。常用CPOL (Clock Polarity)表示時鐘極性,CPHA(Clock Phase)表示時鐘相位,CPOL和CPHA可以是0或是1,對應(yīng)有4種組合及說明,如表1所列。[6]
表1 SPI數(shù)據(jù)與時鐘相位關(guān)系
圖2為CPHA=0時,SPI的數(shù)據(jù)傳輸格式時序圖,圖3為CPHA=1時SPI的數(shù)據(jù)傳輸格式時序圖。
圖2 CPHA=0時SPI的數(shù)據(jù)傳輸格式時序圖
圖3 CPHA=1時SPI的數(shù)據(jù)傳輸格式時序圖
RT-Thread下的SPI總線驅(qū)動架構(gòu)(如圖4所示)可分為:SPI外設(shè)驅(qū)動層/應(yīng)用程序(需要根據(jù)所使用硬件設(shè)備自行設(shè)計或移植)、設(shè)備層(spi_dev.c,位于DeviceDrivers目錄下)、總線核心層(spi_core.c,位于DeviceDrivers目錄下)、SPI硬件驅(qū)動層(移植目標(biāo),本項目中為stm32_i2c.c)[7-8]。
圖4 RT-Thread下SPI總線驅(qū)動架構(gòu)
各層間通過結(jié)構(gòu)體聯(lián)系,主要結(jié)構(gòu)體之間的關(guān)系如圖5所示。
rt_spi_device結(jié)構(gòu)體用來描述SPI虛擬總線(SPI總線允許在同一總線上連接多個SPI設(shè)備,每個SPI設(shè)備對應(yīng)一個CS引腳,使用虛擬總線可以簡化設(shè)備層及上層驅(qū)動和應(yīng)用程序設(shè)計);rt_spi_bus結(jié)構(gòu)體用來描述設(shè)備對應(yīng)的物理SPI總線,其主要功能是提供具體的SPI總線配置與操作接口;rt_spi_ops結(jié)構(gòu)體用來描述物理總線的操作,主要包括總線的配置(configure)與數(shù)據(jù)傳輸接口(xfer)。
設(shè)備層(spi_dev.c)是操作系統(tǒng)與總線核心層間的接口,它規(guī)范了SPI設(shè)備的讀寫接口,使得SPI設(shè)備驅(qū)動或程序可以通過標(biāo)準(zhǔn)接口實現(xiàn)總線配置及操作,在RT-Thread 1.2.0版本中將設(shè)備接口分為總線接口(如:_spi_bus_device_init等)和總線設(shè)備接口(如_spidev_device_init等),其中_spi_bus_device_control、_spidev_device_control等并沒有實現(xiàn)具體的功能,僅僅是為了兼容RT-Thread低版本(如0.3.x、1.0.x等)。
圖5 SPI驅(qū)動結(jié)構(gòu)體關(guān)系圖
設(shè)備層(spi_dev.c)將SPI設(shè)備的操作分為:總線與設(shè)備兩種,其操作抽象為4種基本操作:初始化、讀操作、寫操作、控制等,主要函數(shù)見表2。
表2 spi_dev.c主要函數(shù)
常用的接口函數(shù)如下所示:
① rt_err_t rt_spi_bus_device_init(struct rt_spi_bus *bus, const char *name)。其中,bus為被初始化SPI總線的rt_spi_bus類型結(jié)構(gòu)體指針,name指向注冊到系統(tǒng)中的SPI總線的名稱,應(yīng)用程序或驅(qū)動可以通過name向系統(tǒng)查找、申請和訪問對應(yīng)的總線。
② rt_err_t rt_spidev_device_init(struct rt_spi_device *dev, const char *name)。其中,dev為被初始化SPI總線設(shè)備的rt_spi_device類型結(jié)構(gòu)體指針,name指向注冊到系統(tǒng)中的SPI總線設(shè)備名稱,應(yīng)用程序或驅(qū)動可以通過name向系統(tǒng)查找、申請和訪問對應(yīng)的總線設(shè)備,該函數(shù)僅由spi_core.c中的rt_spi_bus_attach_device函數(shù)調(diào)用,完成總線設(shè)備向系統(tǒng)注冊。
核心層(spi_core.c)作為應(yīng)用程序或者SPI外設(shè)驅(qū)動的接口,規(guī)定了SPI總線的初始化、配置及通信的標(biāo)準(zhǔn)接口,是SPI設(shè)備驅(qū)動及應(yīng)用程序與SPI硬件驅(qū)動層的媒介,主要函數(shù)見表3。
表3 核心層(spi_core.c)主要函數(shù)
常用的接口函數(shù)如下所示:
① rt_err_t rt_spi_bus_register(struct rt_spi_bus *bus, const char *name, const struct rt_spi_ops *ops)。該函數(shù)是系統(tǒng)提供給硬件驅(qū)動層或應(yīng)用程序?qū)崿F(xiàn)向系統(tǒng)注冊SPI硬件操作函數(shù)的接口。其中,name指向注冊到系統(tǒng)中的SPI總線名稱,該名稱由用戶決定并最終通過rt_spi_bus_device_init函數(shù)注冊到系統(tǒng)中;ops結(jié)構(gòu)體指針用來將移植好的SPI操作接口傳遞給SPI核心層,具體結(jié)構(gòu)如圖5所示。
② rt_err_t rt_spi_bus_attach_device(struct rt_spi_device *device, const char *name, const char *bus_name, void *user_data)。SPI總線通過使用多個CS及復(fù)用總線的方式實現(xiàn)在同一總線上連接多個SPI設(shè)備,即每個CS引腳對應(yīng)一個SPI設(shè)備。因此,在SPI核心層中在對SPI總線進(jìn)行注冊的基礎(chǔ)上還需要使用rt_spi_bus_attach_device函數(shù)對各個SPI設(shè)備進(jìn)行注冊。函數(shù)中device指向當(dāng)前初始化SPI設(shè)備對應(yīng)的rt_spi_device結(jié)構(gòu)體;name指向要向系統(tǒng)進(jìn)行注冊的SPI設(shè)備總線的名稱;bus_name指向當(dāng)前設(shè)備對應(yīng)的SPI總線名稱,系統(tǒng)可以根據(jù)bus_name查找并訪問該總線;user_data指向需要傳遞給系統(tǒng)設(shè)備層的自定義用戶數(shù)據(jù)。
③ rt_err_t rt_spi_configure(struct rt_spi_device *device, struct rt_spi_configuration *cfg)。該函數(shù)是SPI設(shè)備配置接口函數(shù)。其中device指向要進(jìn)行配置的SPI設(shè)備;cfg為SPI設(shè)備的配置參數(shù),包括:SPI時鐘極性、時鐘相位和比特序(MSB或LSB),驅(qū)動中分別用mode的第0~2位表示,詳見spi.h;data_width表示數(shù)據(jù)幀長度(8或16bits);max_hz為SCLK頻率,該結(jié)構(gòu)體如下所示:
struct rt_spi_configuration{
rt_uint8_t mode;
rt_uint8_t data_width;
rt_uint16_t reserved;
rt_uint32_t max_hz;
};
此外,在SPI核心層中沒有提供總線或總線設(shè)備申請函數(shù),用戶向系統(tǒng)申請總線或總線設(shè)備需要使用rt_device_find函數(shù)來實現(xiàn),其具體形式為:rt_device_t rt_device_find(const char *name),其中name指向要申請的總線或總線設(shè)備名稱對應(yīng)的字符串,該函數(shù)返回結(jié)果為rt_device_t類型,因此,對于SPI總線或總線設(shè)備申請需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換。
在數(shù)據(jù)傳輸方面,SPI核心層提供了rt_spi_send_then_send等4種模式。其中,rt_spi_send_then_send為連續(xù)數(shù)據(jù)段發(fā)送操作,rt_spi_send_then_recv為數(shù)據(jù)段發(fā)送后再接收操作,這兩種方式較為簡單、直接,具體見spi_core.c。rt_spi_transfer提供收發(fā)同步操作,即發(fā)送數(shù)據(jù)段的同時進(jìn)行接收,其接口函數(shù)具體為:rt_size_t rt_spi_transfer(struct rt_spi_device *device, const void *send_buf, void *recv_buf, rt_size_t length),該接口形式簡潔,不做詳細(xì)說明。rt_spi_transfer_message提供message數(shù)據(jù)包形式的數(shù)據(jù)傳輸,message數(shù)據(jù)包結(jié)構(gòu)為:
struct rt_spi_message{
const void *send_buf;
void *recv_buf;
rt_size_t length;
struct rt_spi_message *next;
unsigned cs_take : 1;
unsigned cs_release : 1;
};
其中,send_buf和recv_buf分別指向發(fā)送和接收緩沖區(qū);length為發(fā)送數(shù)據(jù)的長度;next指向存儲的下一個message數(shù)據(jù)包,用來實現(xiàn)隊列化數(shù)據(jù)包傳輸。message數(shù)據(jù)包形式的SPI數(shù)據(jù)傳輸接口函數(shù)為:struct rt_spi_message *rt_spi_transfer_message(struct rt_spi_device *device, struct rt_spi_message *message),只需要根據(jù)發(fā)送的內(nèi)容組織message數(shù)據(jù)結(jié)構(gòu),然后調(diào)用該函數(shù)即可快速完成數(shù)據(jù)傳輸。message數(shù)據(jù)包形式的SPI數(shù)據(jù)傳輸,實際可以看作對transfer形式進(jìn)行了對象化,transfer形式程序?qū)崿F(xiàn)過程中實際上使用了message數(shù)據(jù)包(詳見spi_core.c)。
SPI硬件驅(qū)動層是SPI核心層與硬件間的接口,是SPI操作的具體實現(xiàn)部分,也是驅(qū)動移植時的主要部分。RT-Thread將具體SPI操作抽象并封裝為SPI總線設(shè)備配置(configure)和SPI數(shù)據(jù)傳輸(xfer)。對用戶來說,只需要完成硬件初始化和所需基本操作的驅(qū)動編寫即可完成驅(qū)動的移植工作[9-10]。
SPI總線一般用于高速數(shù)據(jù)通信,大都采用硬件實現(xiàn)。對于硬件SPI,SPI總線的讀寫等具體操作都是通過對寄存器的讀寫來完成的,驅(qū)動移植時只需要參照接口格式,依照寄存器手冊,即可完成程序編寫[11-13]。
若使用軟件SPI,則需要根據(jù)SPI通信時序規(guī)則來編寫模擬程序再通過I/O口的輸入/輸出操作實現(xiàn)通信,并根據(jù)SPI核心層接口格式編寫操作接口函數(shù),軟件SPI的硬件驅(qū)動層可以參考軟件I2C驅(qū)動移植過程,但RT-Thread操作系統(tǒng)并未提供軟件SPI標(biāo)準(zhǔn)接口層,因此軟件SPI驅(qū)動移植工作量相對較大。
本節(jié)將詳細(xì)介紹RT-Thread下的SPI總線驅(qū)動移植,以STM32F407ZG連接W25Q64的讀寫為例介紹硬件SPI總線驅(qū)動移植與應(yīng)用,實驗電路連接如圖6所示。
圖6 實驗電路圖
W25Q64是64 Mb的串行Flash存儲器,支持2.7~3.6 V的電壓,支持標(biāo)準(zhǔn)的SPI,同時支持雙輸出/四輸出的SPI,最大SPI時鐘可達(dá)80 MHz。為便于描述,SPI總線驅(qū)動不使用DMA模式,本文使用STM32F407ZG的SPI2,以主模式連接W25Q64,W25Q64的其他引腳(VCC等)連接較為簡單,詳見參考文獻(xiàn)[11]。
首先,為了使用RT-Thread 1.2.0版本中提供的SPI模塊,需要將spi_dev.c、spi_core.c兩個文件添加到工程項目中,并在rtconfig.h添加宏定義:#define RT_USING_SPI。接下來進(jìn)行SPI硬件驅(qū)動層的移植,SPI硬件驅(qū)動層移植主要工作分為兩部分:①SPI硬件初始化;②SPI硬件驅(qū)動接口函數(shù)移植。
3.1.1 SPI硬件初始化
SPI硬件初始化主要完成SPI總線所涉及的4個引腳和SPI模塊時鐘等硬件初始化。對于STM32F407ZG,SPI總線驅(qū)動硬件初始化函數(shù)需要完成的操作如圖7所示,具體包括:
① 開啟SPI接口所在GPIO引腳及SPI外設(shè)時鐘。由于硬件SPI接口除了使用到對應(yīng)GPIO引腳外,還需要芯片中的SPI控制器的支持,因此需要開啟對應(yīng)的兩個時鐘。
② GPIO引腳模式初始化。所使用的SPI引腳都是復(fù)用的,需要對各個引腳(MISO、MOSI、SCLK、CS)初始化為SPI模式,具體設(shè)置請參考參考文獻(xiàn)[12]。
③ 結(jié)構(gòu)體初始化。SPI驅(qū)動中總線及設(shè)備的信息是以結(jié)構(gòu)體形式存儲并借助結(jié)構(gòu)體完成調(diào)用的。這些結(jié)構(gòu)體包括:SPI設(shè)備結(jié)構(gòu)體(rt_spi_device)、SPI總線結(jié)構(gòu)體(rt_spi_bus),該結(jié)構(gòu)體只需要完成定義、SPI操作接口結(jié)構(gòu)體(rt_spi_ops),SPI核心層通過該結(jié)構(gòu)體中的函數(shù)接口指針完成操作函數(shù)的調(diào)用,該結(jié)構(gòu)體定義好后需要對其進(jìn)行初始化,即將移植完成的configure和xfer兩個函數(shù)入口指針賦值給該結(jié)構(gòu)體。由于這些結(jié)構(gòu)體在系統(tǒng)運行期間一直處于使用狀態(tài),所以必須定義為靜態(tài)形式(static)。
④ 完成以上信息初始化后,接著使用核心層中的rt_spi_bus_register接口函數(shù)向系統(tǒng)注冊SPI總線,再使用rt_spi_bus_attach_device接口函數(shù)向系統(tǒng)注冊SPI設(shè)備,即可完成SPI總線驅(qū)動的硬件及系統(tǒng)初始化工作。初始化流程圖如圖7所示。
圖7 SPI總線驅(qū)動硬件初始化流程圖
3.1.2 SPI硬件驅(qū)動接口函數(shù)移植
SPI硬件驅(qū)動接口函數(shù)所涉及的configure和xfer兩個函數(shù)是SPI驅(qū)動移植工作中最核心的部分,也是工作量最大的部分。其中,configure函數(shù)具體形式為:
static rt_err_t configure(struct rt_spi_device* device, struct rt_spi_configuration* configuration)
其作用是根據(jù)rt_spi_configuration結(jié)構(gòu)體中SPI設(shè)備的配置信息完成對指定的SPI設(shè)備的配置操作(具體信息詳見第2.2節(jié)),對于硬件SPI來說,這些配置操作最后都?xì)w結(jié)為對應(yīng)寄存器的配置。configure函數(shù)的設(shè)計過程為:
① 查找各個SPI設(shè)備參數(shù)(工作模式mode、數(shù)據(jù)幀長度data_width、時鐘SCLK頻率max_hz;)和對應(yīng)的寄存器。
② 將SPI設(shè)備參數(shù)轉(zhuǎn)換為對應(yīng)的寄存器值。
③ 根據(jù)寄存器配置規(guī)則寫入相應(yīng)寄存器值。
如時鐘SCLK頻率配置,由于max_hz變量中的數(shù)值一般是以Hz為單位,而根據(jù)數(shù)據(jù)手冊可知對于STM32F407ZG來說,該頻率值設(shè)置涉及芯片內(nèi)核SystemCoreClock、SPI模塊所使用的APB總線時鐘及SPI_CR1寄存器中的BR[2:0]位。因此,程序設(shè)計中需要考慮這些因素,根據(jù)max_hz值計算出各個時鐘配置的值,并對max_hz超出硬件允許值等進(jìn)行判斷和保護(hù)。該函數(shù)編寫可以參考STMicroelectronics公司提供的固件庫。
數(shù)據(jù)傳輸函數(shù)xfer具體形式為:
static rt_uint32_t xfer(struct rt_spi_device* device, struct rt_spi_message* message)
其功能為:在指定的SPI設(shè)備上,完成rt_spi_message結(jié)構(gòu)體中指定的數(shù)據(jù)傳輸(包括數(shù)據(jù)發(fā)送和接收)。該功能實現(xiàn)比較簡單,只需要根據(jù)發(fā)送數(shù)據(jù)長度(length),將發(fā)送緩沖區(qū)(send_buf)中的數(shù)據(jù)逐個寫入SPI發(fā)送寄存器中,在發(fā)送的同時讀取SPI接收寄存器并將數(shù)據(jù)存儲到接收緩沖區(qū)(recv_buf)。需要注意的是,需要根據(jù)SPI設(shè)備當(dāng)前工作的數(shù)據(jù)幀長度,對接收與發(fā)送寄存器進(jìn)行讀寫才能保證數(shù)據(jù)的正確傳輸。
W25Q64的操作采用“指令+數(shù)據(jù)”形式,讀寫操作時序如圖8所示。
圖8 W25Q64的讀寫操作時序圖
圖9 W25Q64讀寫程序流程
實現(xiàn)W25Q64讀寫的程序流程如圖9所示。
首先調(diào)用rt_device_find函數(shù),語句如下:
struct rt_spi_device * spi_dev;
dev = (struct rt_spi_device *)rt_device_find("spi20");
若正確申請到總線設(shè)備后,系統(tǒng)會將該SPI總線設(shè)備的rt_spi_device類型結(jié)構(gòu)體指針返回,利用該指針和SPI核心層中的接口函數(shù)(詳見第2.2節(jié))即可實現(xiàn)W25Q64的讀寫操作。接下來,根據(jù)W25Q64的SPI總線特性配置SPI設(shè)備。根據(jù)W25Q64的數(shù)據(jù)手冊,其SPI采用Mode 0和Mode 3,數(shù)據(jù)幀長度為8位,MSB模式,SPI時鐘最高支持133 MHz。結(jié)合硬件情況,進(jìn)行如下配置:
struct rt_spi_configuration cfg;
cfg.data_width = 8;
cfg.mode = RT_SPI_MODE_0 | RT_SPI_MSB; /* SPI Compatible: Mode 0 and Mode 3 */
cfg.max_hz = 20 * 1000 * 1000; /* 50M */
rt_spi_configure(spi_dev, &cfg);
最后,以讀取W25Q64的JEDEC ID為例(JEDEC用來幫助程序讀取Flash的制造商ID和設(shè)備ID,以確定Flash的大小和算法)介紹SPI設(shè)備的讀寫操作。根據(jù)W25Q64的指令集,JEDEC ID對應(yīng)指令為0x9F,芯片將返回24位的ID數(shù)據(jù),其中三個字節(jié)分別代表制造商ID、存儲器類型及存儲器容量,若操作正確,應(yīng)讀取到0xEF、0x40、0x17。
該操作主要程序如下:
rt_uint8_t cmd = 0x9F;//JEDEC ID指令
rt_uint8_t id_recv[3];//接收緩沖區(qū)
rt_spi_send_then_recv(spi_dev, &cmd, 1, id_recv, 3);//發(fā)送指令并讀取
rt_kprintf(JEDEC ID: %02X %02X %02X ", id_recv[0], id_recv[1], id_recv[2]);//顯示返回數(shù)據(jù)
程序正確申請到SPI設(shè)備后,對W25Q64進(jìn)行JEDEC ID讀取操作,通過對比可以看出,讀取到的數(shù)據(jù)與預(yù)期數(shù)據(jù)一致,由此證明所移植的SPI驅(qū)動及SPI接口應(yīng)用正確。綜上所述,本次SPI總線驅(qū)動移植是成功的,并且利用SPI核心層接口讀寫W25Q64也是成功的。
[1] 曹成. 嵌入式實時操作系統(tǒng)RT-Thread原理分析與應(yīng)用[D]. 青島:山東科技大學(xué), 2011.
[2] 張麗彪, 駱東佳, 張艦航,等. 基于RT-Thread和Yeelink的物聯(lián)網(wǎng)平臺開發(fā)的應(yīng)用設(shè)計[J]. 電子技術(shù)與軟件工程, 2015(16):70.
[3] 陳偉. 基于RT-thread的遠(yuǎn)程家用服務(wù)機(jī)器人系統(tǒng)開發(fā)[D]. 杭州:浙江工業(yè)大學(xué), 2015.
[4] Yu-Xiang W U, Xin L I, Liu Q. Design of Digital Photo Frame Based on RT-Thread and STM32[J].Electronics World, 2013(18).
[5] 鄭毛祥. SPI總線接口擴(kuò)展與應(yīng)用[J]. 自動化技術(shù)與應(yīng)用, 2012, 31(9):75-79.
[6] 嚴(yán)海穎, 趙宇楓.ARM嵌入式系統(tǒng)應(yīng)用開發(fā)基礎(chǔ)[M].大連:東軟電子出版社,2013:211-214.
[7] 高培. RT Thread的I2 C總線驅(qū)動結(jié)構(gòu)分析、移植及應(yīng)用[J]. 單片機(jī)與嵌入式系統(tǒng)應(yīng)用, 2016, 16(12):26-30.
[8] 葉思超. 基于RT-Thread的手持式高性能RFID讀寫器設(shè)計[D]. 成都:電子科技大學(xué), 2015.
[9] 涂撰, 趙標(biāo). RT-Thread在LPC2378上的移植與應(yīng)用[J]. 上海船舶運輸科學(xué)研究所學(xué)報, 2013, 36(1):44-49.
[10] 朱志國. RT-Thread操作系統(tǒng)在STM32中移植的研究[J]. 計算機(jī)光盤軟件與應(yīng)用, 2012(22):119-120.
[11] Winbond Inc. 64M-bit Serial Flash Memory with uniform 4KB sectors and Dual/Quad SPI, 2014.
[12] ST Microelectronics. RM0090 Reference manual STM32F405xx, STM32F407xx, STM32F415xx and STM32F417xx advanced ARM-based 32-bit MCUs, 2012.
[13] RT-Thread開發(fā)組. RT-Thread編程指南, 2014.
高培(講師)、何棟煒(副教授),主要研究方向為嵌入式技術(shù)與物聯(lián)網(wǎng)應(yīng)用。
StructureAnalysis,MigrationandApplicationofSPIBusDriverforRT-Thread
GaoPei1,HeDongwei2,LiWenxiang1,LinDannan1
(1.Fujian Business University,Fuzhou 350012,China;2.Fujian University of Technology)
In the paper,the communication principle of SPI and the SPI bus driver structure of the RT-Thread operating system are researched and analyzed.Taking the example of STM32F407ZG’s read and write operation on W25Q64,the transplant procedure of hardware SPI bus driver,the SPI application design and technical implementation are introduced.Finally,the experiment is carried out to verify the feasibility and effectiveness of driver transplantation and program design of SPI.The experiment results show that the RT-Thread operating system under the SPI bus driver has reasonable structural design,it is convenient to migration and easy for program design,the transplantation and application method introduced in the paper is feasible and effective.
RT-Thread;SPI;driver structure;analysis;migration;application
福建對外經(jīng)濟(jì)貿(mào)易職業(yè)技術(shù)學(xué)院校級課題《UWB技術(shù)在智慧城市中的應(yīng)用》(KT201612)。
TP316.2
A
楊迪娜
2017-09-07)