0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

你想玩轉(zhuǎn)RT-Thread之SPI設(shè)備嗎?

RTThread物聯(lián)網(wǎng)操作系統(tǒng) ? 來源:未知 ? 作者:胡薇 ? 2018-04-17 10:20 ? 次閱讀

本應(yīng)用筆記以驅(qū)動SPI接口OLED顯示屏為例,說明了如何添加SPI設(shè)備驅(qū)動框架及底層硬件驅(qū)動,使用SPI設(shè)備驅(qū)動接口開發(fā)應(yīng)用程序。并給出了在正點(diǎn)原子STM32F4探索者開發(fā)板上驗(yàn)證的代碼示例。

1 本文的目的和結(jié)構(gòu)

1.1 本文的目的和背景

串行外設(shè)接口(Serial Peripheral Interface Bus,SPI),是一種用于短程通信的同步串行通信接口規(guī)范,主要應(yīng)用于單片機(jī)系統(tǒng)中。SPI主要應(yīng)用于 EEPROM、FLASH、實(shí)時時鐘、AD轉(zhuǎn)換器、數(shù)字信號處理器和數(shù)字信號解碼器等。在芯片的管腳上占用四根線或三根線,簡單易用,因此越來越多的芯片集成了這種通信接口。

為了方便應(yīng)用層程序開發(fā),RT-Thread中引入了SPI設(shè)備驅(qū)動框架。本文說明了如何使用RT-Thread SPI設(shè)備驅(qū)動。

1.2 本文的結(jié)構(gòu)

本文首先簡要介紹了RT-Thread SPI設(shè)備驅(qū)動框架,然后在正點(diǎn)原子STM32F4探索者開發(fā)板上運(yùn)行了SPI設(shè)備驅(qū)動示例代碼。最后詳細(xì)描述SPI設(shè)備驅(qū)動框架接口的使用方法及參數(shù)取值。

2 SPI設(shè)備驅(qū)動框架簡介

RT-Thread SPI設(shè)備驅(qū)動框架把MCU的SPI硬件控制器虛擬成SPI總線(SPI BUS#n),總線上可以掛很多SPI設(shè)備(SPI BUS#0 CSm),每個SPI設(shè)備只能掛載到一個SPI總線上。目前,RT-Thread已經(jīng)實(shí)現(xiàn)了很多通用SPI設(shè)備的驅(qū)動,比如SD卡、各種系列Flash存儲器、ENC28J60以太網(wǎng)模塊等。SPI設(shè)備驅(qū)動框架的層次結(jié)構(gòu)如下圖所示。

圖2-1SPI設(shè)備驅(qū)動框架層次結(jié)構(gòu)體

基于前面的介紹用戶已經(jīng)大致了解了RT-Thread SPI設(shè)備驅(qū)動框架,那么用戶如何使用SPI設(shè)備驅(qū)動框架呢?

3 運(yùn)行示例代碼

本章節(jié)基于正點(diǎn)原子探索者STM32F4 開發(fā)板及SPI示例代碼,給出了RT-Thread SPI設(shè)備驅(qū)動框架的使用方法。

3.1 示例代碼軟硬件資源

RT-Thread 源碼

ENV工具

SPI設(shè)備驅(qū)動示例代碼

正點(diǎn)原子STM32F4探索者開發(fā)板

1.5寸彩色OLED顯示屏(SSD1351控制器)

MDK5

正點(diǎn)原子探索者STM32F4 開發(fā)板的MCU是STM32F407ZGT6,本示例使用USB轉(zhuǎn)串口(USART1)發(fā)送數(shù)據(jù)及供電,使用SEGGER J-LINK連接JTAG調(diào)試,STM32F4 有多個硬件SPI控制器,本例使用 SPI1。彩色OLED顯示屏板載SSD1351控制器,分辨率128*128。

STM32F4 與 OLED 顯示屏管腳連接如下表所示:

STM32管腳 OLED顯示屏管腳 說明
PA5 D0 SPI1 SCK,時鐘
PA6 SPI1 MISO,未使用
PA7 D1 SPI1 MOSI,主機(jī)輸出,從機(jī)輸入
PC6 D/C GPIO,輸出,命令0/數(shù)據(jù)1選擇
PC7 RES GPIO,輸出,復(fù)位,低電平有效
PC8 CS GPIO,輸出,片選,低電平有效
3.3V VCC 供電
GND GND 接地

圖3.1-1 正點(diǎn)原子開發(fā)板

圖3.1-2 彩色OLED顯示屏

SPI設(shè)備驅(qū)動示例代碼包括app.c、drv_ssd1351.c、drv_ssd1351.h3個文件,drv_ssd1351.c是OLED顯示屏驅(qū)動文件,此驅(qū)動文件包含了SPI設(shè)備ssd1351的初始化、掛載到系統(tǒng)及通過命令控制OLED顯示的操作方法。由于RT-Thread上層應(yīng)用API的通用性,因此這些代碼不局限于具體的硬件平臺,用戶可以輕松將它移植到其它平臺上。

3.2 配置工程

使用menuconfig配置工程:在env工具命令行使用cd 命令進(jìn)入 rt-threadspstm32f4xx-HAL 目錄,然后輸入menuconfig命令進(jìn)入配置界面。

修改工程芯片型號:修改 Device type為STM32F407ZG。

配置shell使用串口1:選中Using UART1,進(jìn)入RT-Thread Kernel ---> Kernel Device Object菜單,修改the device name for console為uart1。

開啟SPI總線及設(shè)備驅(qū)動并注冊SPI總線到系統(tǒng):進(jìn)入RT-Thread Components ---> Device Drivers菜單,選中Using SPI Bus/Device device drivers,RT-Thread Configuration界面會默認(rèn)選中Using SPI1,spi1總線設(shè)備會注冊到操作系統(tǒng)

圖3.2-1 使用menuconfig開啟SPI

開啟GPIO驅(qū)動:進(jìn)入RT-Thread Components ---> Device Drivers菜單,選中Using generic GPIO device drivers。OLED屏需要2個額外的GPIO用于DC、RES信號,SPI總線驅(qū)動也需要對片選管腳進(jìn)行操作,都需要調(diào)用系統(tǒng)的GPIO驅(qū)動接口。

生成新工程及修改調(diào)試選項(xiàng):退出menuconfig配置界面并保存配置,在ENV命令行輸入scons --target=mdk5 -s命令生成mdk5工程,新工程名為project。使用MDK5打開工程,修改調(diào)試選項(xiàng)為J-LINK。

圖3.2-2 修改調(diào)試選項(xiàng)

使用list_device命令查看SPI總線:添加SPI底層硬件驅(qū)動無誤后,在終端PuTTY(打開對應(yīng)端口,波特率配置為115200)使用list_device命令就能看到SPI總線。同樣可以看到我們使用的UART設(shè)備和PIN設(shè)備。

圖3.2-3使用list_device命令查看系統(tǒng)設(shè)備

3.3 添加示例代碼

將SPI設(shè)備驅(qū)動示例代碼里的app.c拷貝到 t-threadspstm32f4xx-HALapplications目錄下。drv_ssd1351.c、drv_ssd1351.h拷貝到 t-threadspstm32f4xx-HALdrivers目錄下,并將它們添加到工程中對應(yīng)分組。如圖所示:

圖3.3-1 添加示例代碼到工程

在main.c中調(diào)用app_init(),app_init()會創(chuàng)建一個oled線程,線程會循環(huán)展示彩虹顏色圖案和正方形顏圖案。

main.c調(diào)用測試代碼源碼如下:

#include #include extern int app_init(void); int main(void) { /* user app entry */ app_init(); return 0; }

圖3.3-2 使用list_device命令查看SPI設(shè)備驅(qū)動

圖3.3-3 實(shí)驗(yàn)現(xiàn)象

4 SPI設(shè)備驅(qū)動接口使用詳解

按照前文的步驟,相信讀者能很快的將RT-Thread SPI設(shè)備驅(qū)動運(yùn)行起來,那么如何使用SPI設(shè)備驅(qū)動接口開發(fā)應(yīng)用程序呢?

RT-Thread SPI設(shè)備驅(qū)動使用流程大致如下:

定義SPI設(shè)備對象,調(diào)用rt_spi_bus_attach_device()掛載SPI設(shè)備到SPI總線。

調(diào)用rt_spi_configure()配置SPI總線模式。

使用rt_spi_send()等相關(guān)數(shù)據(jù)傳輸接口傳輸數(shù)據(jù)。

接下來本章節(jié)將詳細(xì)講解示例代碼使用到的主要的SPI設(shè)備驅(qū)動接口。

4.1 掛載SPI設(shè)備到總線

用戶定義了SPI設(shè)備對象后就可以調(diào)用此函數(shù)掛載SPI設(shè)備到SPI總線。

函數(shù)原型:

rt_err_t rt_spi_bus_attach_device(struct rt_spi_device *device, const char *name, const char *bus_name, void *user_data)

參數(shù) 描述
device SPI設(shè)備句柄
name SPI設(shè)備名稱
bus_name SPI總線名稱
user_data 用戶數(shù)據(jù)指針

函數(shù)返回:成功返回RT_EOK,否則返回錯誤碼。

此函數(shù)用于掛載一個SPI設(shè)備到指定的SPI總線,向內(nèi)核注冊SPI設(shè)備,并將user_data保存到SPI設(shè)備device里。

注意

用戶首先需要定義好SPI設(shè)備對象device

推薦SPI總線命名原則為spix, SPI設(shè)備命名原則為spixy,如 本示例的spi10 表示掛載在在 spi1 總線上的 0 號設(shè)備。

SPI總線名稱可以在msh shell輸入list_device 命令查看,確定SPI設(shè)備要掛載的SPI總線。

user_data一般為SPI設(shè)備的CS引腳指針,進(jìn)行數(shù)據(jù)傳輸時SPI控制器會操作此引腳進(jìn)行片選。

本文示例代碼底層驅(qū)動drv_ssd1351.c中rt_hw_ssd1351_config()掛載ssd1351設(shè)備到SPI總線源碼如下:

#define SPI_BUS_NAME "spi1" /* SPI總線名稱 */ #define SPI_SSD1351_DEVICE_NAME "spi10" /* SPI設(shè)備名稱 */ ... ... static struct rt_spi_device spi_dev_ssd1351; /* SPI設(shè)備ssd1351對象 */ static struct stm32_hw_spi_cs spi_cs; /* SPI設(shè)備CS片選引腳 */ ... ... static int rt_hw_ssd1351_config(void) { rt_err_t res; /* oled use PC8 as CS */ spi_cs.pin = CS_PIN; rt_pin_mode(spi_cs.pin, PIN_MODE_OUTPUT); /* 設(shè)置片選管腳模式為輸出 */ res = rt_spi_bus_attach_device(&spi_dev_ssd1351, SPI_SSD1351_DEVICE_NAME, SPI_BUS_NAME, (void*)&spi_cs); if (res != RT_EOK) { OLED_TRACE("rt_spi_bus_attach_device! "); return res; } ... ... }

4.2 配置SPI模式

掛載SPI設(shè)備到SPI總線后,為滿足不同設(shè)備的時鐘、數(shù)據(jù)寬度等要求,通常需要配置SPI模式、頻率參數(shù)。

SPI從設(shè)備的模式?jīng)Q定主設(shè)備的模式,所以SPI主設(shè)備的模式必須和從設(shè)備一樣兩者才能正常通訊。

函數(shù)原型:

rt_err_t rt_spi_configure(struct rt_spi_device *device, struct rt_spi_configuration *cfg)

參數(shù) 描述
device SPI設(shè)備句柄
cfg SPI傳輸配置參數(shù)指針

函數(shù)返回:返回RT_EOK。

此函數(shù)會保存cfg指向的模式參數(shù)到device里,當(dāng)device調(diào)用數(shù)據(jù)傳輸函數(shù)時都會使用此配置信息。

struct rt_spi_configuration 原型如下:

struct rt_spi_configuration { rt_uint8_t mode; //spi模式 rt_uint8_t data_width; //數(shù)據(jù)寬度,可取8位、16位、32位 rt_uint16_t reserved; //保留 rt_uint32_t max_hz; //最大頻率 };

模式/mode:使用spi.h中的宏定義,包含MSB/LSB、主從模式、 時序模式等,可取宏組合如下。

/* 設(shè)置數(shù)據(jù)傳輸順序是MSB位在前還是LSB位在前 */ #define RT_SPI_LSB (0<<2) ? ? ? ? ? ? ? ? ? ? ? ?/* bit[2]: 0-LSB */ #define RT_SPI_MSB ? ? ?(1<<2) ? ? ? ? ? ? ? ? ? ? ? ?/* bit[2]: 1-MSB */ /* 設(shè)置SPI的主從模式 */ #define RT_SPI_MASTER ? (0<<3) ? ? ? ? ? ? ? ? ? ? ? ?/* SPI master device */ #define RT_SPI_SLAVE ? ?(1<<3) ? ? ? ? ? ? ? ? ? ? ? ?/* SPI slave device */ /* 設(shè)置時鐘極性和時鐘相位 */ #define RT_SPI_MODE_0 ? (0 | 0) ? ? ? ? ? ? ? ? ? ? ? /* CPOL = 0, CPHA = 0 */ #define RT_SPI_MODE_1 ? (0 | RT_SPI_CPHA) ? ? ? ? ? ? /* CPOL = 0, CPHA = 1 */ #define RT_SPI_MODE_2 ? (RT_SPI_CPOL | 0) ? ? ? ? ? ? /* CPOL = 1, CPHA = 0 */ #define RT_SPI_MODE_3 ? (RT_SPI_CPOL | RT_SPI_CPHA) ? /* CPOL = 1, CPHA = 1 */ #define RT_SPI_CS_HIGH ?(1<<4) ? ? ? ? ? ? ? ? ? ? ? ?/* Chipselect active high */ #define RT_SPI_NO_CS ? ?(1<<5) ? ? ? ? ? ? ? ? ? ? ? ?/* No chipselect */ #define RT_SPI_3WIRE ? ?(1<<6) ? ? ? ? ? ? ? ? ? ? ? ?/* SI/SO pin shared */ #define RT_SPI_READY ? ?(1<<7) ? ? ? ? ? ? ? ? ? ? ? ?/* Slave pulls low to pause */

數(shù)據(jù)寬度/data_width:根據(jù)SPI主設(shè)備及SPI從設(shè)備可發(fā)送及接收的數(shù)據(jù)寬度格式設(shè)置為8位、16位或者32位。

最大頻率/max_hz:設(shè)置數(shù)據(jù)傳輸?shù)牟ㄌ芈?,同樣根?jù)SPI主設(shè)備及SPI從設(shè)備工作的波特率范圍設(shè)置。

注意

掛載SPI設(shè)備到SPI總線后必須使用此函數(shù)配置SPI設(shè)備的傳輸參數(shù)。

本文示例代碼底層驅(qū)動drv_ssd1351.c中rt_hw_ssd1351_config()配置SPI傳輸參數(shù)源碼如下:

static int rt_hw_ssd1351_config(void) { ... ... /* config spi */ { struct rt_spi_configuration cfg; cfg.data_width = 8; cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB; cfg.max_hz = 20 * 1000 *1000; /* 20M,SPI max 42MHz,ssd1351 4-wire spi */ rt_spi_configure(&spi_dev_ssd1351, &cfg); } ... ...

4.3 數(shù)據(jù)傳輸

SPI設(shè)備掛載到SPI總線并配置好相關(guān)SPI傳輸參數(shù)后就可以調(diào)用RT-Thread提供的一系列SPI設(shè)備驅(qū)動數(shù)據(jù)傳輸函數(shù)。

rt_spi_transfer_message()

函數(shù)原型:

struct rt_spi_message *rt_spi_transfer_message(struct rt_spi_device *device, struct rt_spi_message *message)

參數(shù) 描述
device SPI設(shè)備句柄
message 消息指針

函數(shù)返回: 成功發(fā)送返回RT_NULL,否則返回指向剩余未發(fā)送的message

此函數(shù)可以傳輸一連串消息,用戶可以很靈活的設(shè)置message結(jié)構(gòu)體各參數(shù)的數(shù)值,從而可以很方便的控制數(shù)據(jù)傳輸方式。

struct rt_spi_message原型如下:

struct rt_spi_message { const void *send_buf; /* 發(fā)送緩沖區(qū)指針 */ void *recv_buf; /* 接收緩沖區(qū)指針 */ rt_size_t length; /* 發(fā)送/接收 數(shù)據(jù)字節(jié)數(shù) */ struct rt_spi_message *next; /* 指向繼續(xù)發(fā)送的下一條消息的指針 */ unsigned cs_take : 1; /* 值為1,CS引腳拉低,值為0,不改變引腳狀態(tài) */ unsigned cs_release : 1; /* 值為1,CS引腳拉高,值為0,不改變引腳狀態(tài) */ };

SPI是一種全雙工的通信總線,發(fā)送一字節(jié)數(shù)據(jù)的同時也會接收一字節(jié)數(shù)據(jù),參數(shù)length為傳輸一次數(shù)據(jù)時發(fā)送/接收的數(shù)據(jù)字節(jié)數(shù),發(fā)送的數(shù)據(jù)為send_buf指向的緩沖區(qū)數(shù)據(jù),接收到的數(shù)據(jù)保存在recv_buf指向的緩沖區(qū)。若忽視接收的數(shù)據(jù)則recv_buf值為NULL,若忽視發(fā)送的數(shù)據(jù)只接收數(shù)據(jù),則send_buf值為NULL。

參數(shù)next是指向繼續(xù)發(fā)送的下一條消息的指針,若只發(fā)送一條消息,則此指針值置為NULL。

rt_spi_send()

函數(shù)原型:

rt_size_t rt_spi_send(struct rt_spi_device *device, const void *send_buf, rt_size_t length)

參數(shù) 描述
device SPI設(shè)備句柄
send_buf 發(fā)送緩沖區(qū)指針
length 發(fā)送數(shù)據(jù)的字節(jié)數(shù)

函數(shù)返回: 成功發(fā)送的數(shù)據(jù)字節(jié)數(shù)

調(diào)用此函數(shù)發(fā)送send_buf指向的緩沖區(qū)的數(shù)據(jù),忽略接收到的數(shù)據(jù)。

此函數(shù)等同于調(diào)用rt_spi_transfer_message()傳輸一條消息,message參數(shù)配置如下:

struct rt_spi_message msg; msg.send_buf = send_buf; msg.recv_buf = RT_NULL; msg.length = length; msg.cs_take = 1; msg.cs_release = 1; msg.next = RT_NULL;

注意

調(diào)用此函數(shù)將發(fā)送一次數(shù)據(jù)。開始發(fā)送數(shù)據(jù)時片選開始,函數(shù)返回時片選結(jié)束。

本文示例代碼底層驅(qū)動drv_ssd1351.c調(diào)用rt_spi_send()向SSD1351發(fā)送指令和數(shù)據(jù)的函數(shù)源碼如下:

rt_err_t ssd1351_write_cmd(const rt_uint8_t cmd) { rt_size_t len; rt_pin_write(DC_PIN, PIN_LOW); /* 命令低電平 */ len = rt_spi_send(&spi_dev_ssd1351, &cmd, 1); if (len != 1) { OLED_TRACE("ssd1351_write_cmd error. %d ",len); return -RT_ERROR; } else { return RT_EOK; } } rt_err_t ssd1351_write_data(const rt_uint8_t data) { rt_size_t len; rt_pin_write(DC_PIN, PIN_HIGH); /* 數(shù)據(jù)高電平 */ len = rt_spi_send(&spi_dev_ssd1351, &data, 1); if (len != 1) { OLED_TRACE("ssd1351_write_data error. %d ",len); return -RT_ERROR; } else { return RT_EOK; } }

rt_spi_recv()

函數(shù)原型:

rt_size_t rt_spi_recv(struct rt_spi_device *device, void *recv_buf, rt_size_t length)

參數(shù) 描述
device SPI設(shè)備句柄
recv_buf 接受緩沖區(qū)指針
length 接受到的數(shù)據(jù)字節(jié)數(shù)

函數(shù)返回: 成功接受的數(shù)據(jù)字節(jié)數(shù)

調(diào)用此函數(shù)將保存接受到的數(shù)據(jù)到recv_buf指向的緩沖區(qū)。

此函數(shù)等同于調(diào)用rt_spi_transfer_message()傳輸一條消息,message參數(shù)配置如下:

struct rt_spi_message msg; msg.send_buf = RT_NULL; msg.recv_buf = recv_buf; msg.length = length; msg.cs_take = 1; msg.cs_release = 1; msg.next = RT_NULL;

注意

調(diào)用此函數(shù)將接受一次數(shù)據(jù)。開始接收數(shù)據(jù)時片選開始,函數(shù)返回時片選結(jié)束。

rt_spi_send_then_send()

函數(shù)原型:

rt_err_t rt_spi_send_then_send(struct rt_spi_device *device, const void *send_buf1, rt_size_t send_length1, const void *send_buf2, rt_size_t send_length2);

參數(shù) 描述
device SPI總線設(shè)備句柄
send_buf1 發(fā)送緩沖區(qū)1數(shù)據(jù)指針
send_length1 發(fā)送緩沖區(qū)數(shù)據(jù)字節(jié)數(shù)
send_buf2 發(fā)送緩沖區(qū)2數(shù)據(jù)指針
send_length2 發(fā)送緩沖區(qū)2數(shù)據(jù)字節(jié)數(shù)

函數(shù)返回: 成功返回RT_EOK,否則返回錯誤碼

此函數(shù)可以連續(xù)發(fā)送2個緩沖區(qū)的數(shù)據(jù),忽略接收到的數(shù)據(jù)。發(fā)送send_buf1時片選開始,發(fā)送完send_buf2后片選結(jié)束。

此函數(shù)等同于調(diào)用rt_spi_transfer_message()傳輸2條消息,message參數(shù)配置如下:

struct rt_spi_message msg1,msg2; msg1.send_buf = send_buf1; msg1.recv_buf = RT_NULL; msg1.length = send_length1; msg1.cs_take = 1; msg1.cs_release = 0; msg1.next = &msg2; msg2.send_buf = send_buf2; msg2.recv_buf = RT_NULL; msg2.length = send_length2; msg2.cs_take = 0; msg2.cs_release = 1; msg2.next = RT_NULL;

rt_spi_send_then_recv()

函數(shù)原型:

rt_err_t rt_spi_send_then_recv(struct rt_spi_device *device, const void *send_buf, rt_size_t send_length, void *recv_buf, rt_size_t recv_length);

參數(shù) 描述
device SPI總線設(shè)備句柄
send_buf 發(fā)送緩沖區(qū)數(shù)據(jù)指針
send_length 發(fā)送緩沖區(qū)數(shù)據(jù)字節(jié)數(shù)
recv_buf 接收緩沖區(qū)數(shù)據(jù)指針,spi是全雙工的,支持同時收發(fā)
length 接收緩沖區(qū)數(shù)據(jù)字節(jié)數(shù)

函數(shù)返回: 成功返回RT_EOK,否則返回錯誤碼

此函數(shù)發(fā)送第一條消息send_buf時開始片選,此時忽略接收到的數(shù)據(jù),然后發(fā)送第二條消息,此時發(fā)送的數(shù)據(jù)為空,接收到的數(shù)據(jù)保存在recv_buf里,函數(shù)返回時片選結(jié)束。

此函數(shù)等同于調(diào)用rt_spi_transfer_message()傳輸2條消息,message參數(shù)配置如下:

struct rt_spi_message msg1,msg2; msg1.send_buf = send_buf; msg1.recv_buf = RT_NULL; msg1.length = send_length; msg1.cs_take = 1; msg1.cs_release = 0; msg1.next = &msg2; msg2.send_buf = RT_NULL; msg2.recv_buf = recv_buf; msg2.length = recv_length; msg2.cs_take = 0; msg2.cs_release = 1; msg2.next = RT_NULL;

rt_spi_sendrecv8()和rt_spi_sendrecv16()函數(shù)是對此函數(shù)的封裝,rt_spi_sendrecv8()發(fā)送一個字節(jié)數(shù)據(jù)同時收到一個字節(jié)數(shù)據(jù),rt_spi_sendrecv16()發(fā)送2個字節(jié)數(shù)據(jù)同時收到2個字節(jié)數(shù)據(jù)。

4.4 SPI設(shè)備驅(qū)動應(yīng)用

本文示例使用SSD1351顯示圖像信息,首先需要確定信息在顯示器上的行列起始地址,調(diào)用ssd1351_write_cmd()向SSD1351發(fā)送指令,調(diào)用ssd1351_write_data()向SSD1351發(fā)送數(shù)據(jù),源代碼如下:

void set_column_address(rt_uint8_t start_address, rt_uint8_t end_address) { ssd1351_write_cmd(0x15); // Set Column Address ssd1351_write_data(start_address); // Default => 0x00 (Start Address) ssd1351_write_data(end_address); // Default => 0x7F (End Address) } void set_row_address(rt_uint8_t start_address, rt_uint8_t end_address) { ssd1351_write_cmd(0x75); // Set Row Address ssd1351_write_data(start_address); // Default => 0x00 (Start Address) ssd1351_write_data(end_address); // Default => 0x7F (End Address) }

5 參考

本文所有相關(guān)的API

SPI設(shè)備驅(qū)動框架所有API 頭文件
rt_spi_bus_register() rt-threadcomponentsdriversincludedriversspi.h
rt_spi_bus_attach_device() rt-threadcomponentsdriversincludedriversspi.h
rt_spi_configure () rt-threadcomponentsdriversincludedriversspi.h
rt_spi_send_then_send() rt-threadcomponentsdriversincludedriversspi.h
rt_spi_send_then_recv() rt-threadcomponentsdriversincludedriversspi.h
rt_spi_transfer() rt-threadcomponentsdriversincludedriversspi.h
rt_spi_transfer_message() rt-threadcomponentsdriversincludedriversspi.h
rt_spi_take_bus() rt-threadcomponentsdriversincludedriversspi.h
rt_spi_release_bus() rt-threadcomponentsdriversincludedriversspi.h
rt_spi_take() rt-threadcomponentsdriversincludedriversspi.h
rt_spi_release() rt-threadcomponentsdriversincludedriversspi.h
rt_spi_recv() rt-threadcomponentsdriversincludedriversspi.h
rt_spi_send() rt-threadcomponentsdriversincludedriversspi.h
rt_spi_sendrecv8() rt-threadcomponentsdriversincludedriversspi.h
rt_spi_sendrecv16() rt-threadcomponentsdriversincludedriversspi.h
rt_spi_message_append() rt-threadcomponentsdriversincludedriversspi.h
示例代碼相關(guān)API 位置
ssd1351_write_cmd() drv_ssd1351.c
ssd1351_write_data() drv_ssd1351.c
rt_hw_ssd1351_config() drv_ssd1351.c

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6030

    文章

    44489

    瀏覽量

    631971
  • OLED
    +關(guān)注

    關(guān)注

    119

    文章

    6171

    瀏覽量

    223679
  • SPI
    SPI
    +關(guān)注

    關(guān)注

    17

    文章

    1688

    瀏覽量

    91202

原文標(biāo)題:【應(yīng)用筆記】小白也能玩轉(zhuǎn)RT-Thread之 SPI設(shè)備

文章出處:【微信號:RTThread,微信公眾號:RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    基于RT-ThreadSPI通訊

    ? ? ?sdk 目前還不支持 spi,沒有 spi 就失去了很多樂趣,如 easyflash、spi 的屏幕,藍(lán)訊的這次活動我接到了模擬 spi 的任務(wù),下面介紹如何寫
    的頭像 發(fā)表于 08-22 09:28 ?1632次閱讀

    RT-ThreadSPI的細(xì)節(jié)內(nèi)容

    作為通信協(xié)議的兩大基礎(chǔ),IIC和SPI兩者的應(yīng)用都非常廣泛,上一篇文章講過了RTT上IIC的移植與實(shí)踐。 《一步到位!教你RT-Thread設(shè)備IIC驅(qū)動移植》 講完IIC,自然少不了SPI
    的頭像 發(fā)表于 09-30 15:35 ?3828次閱讀
    <b class='flag-5'>RT-Thread</b>上<b class='flag-5'>SPI</b>的細(xì)節(jié)內(nèi)容

    RT-Thread文檔_RT-Thread 簡介

    RT-Thread文檔_RT-Thread 簡介
    發(fā)表于 02-22 18:22 ?5次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> 簡介

    RT-Thread文檔_RT-Thread SMP 介紹與移植

    RT-Thread文檔_RT-Thread SMP 介紹與移植
    發(fā)表于 02-22 18:31 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> SMP 介紹與移植

    RT-Thread文檔_UART 設(shè)備

    RT-Thread文檔_UART 設(shè)備
    發(fā)表于 02-22 18:32 ?2次下載
    <b class='flag-5'>RT-Thread</b>文檔_UART <b class='flag-5'>設(shè)備</b>

    RT-Thread文檔_CAN 設(shè)備

    RT-Thread文檔_CAN 設(shè)備
    發(fā)表于 02-22 18:34 ?0次下載
    <b class='flag-5'>RT-Thread</b>文檔_CAN <b class='flag-5'>設(shè)備</b>

    RT-Thread文檔_HWTIMER 設(shè)備

    RT-Thread文檔_HWTIMER 設(shè)備
    發(fā)表于 02-22 18:34 ?0次下載
    <b class='flag-5'>RT-Thread</b>文檔_HWTIMER <b class='flag-5'>設(shè)備</b>

    RT-Thread文檔_PWM 設(shè)備

    RT-Thread文檔_PWM 設(shè)備
    發(fā)表于 02-22 18:35 ?1次下載
    <b class='flag-5'>RT-Thread</b>文檔_PWM <b class='flag-5'>設(shè)備</b>

    RT-Thread文檔_RTC 設(shè)備

    RT-Thread文檔_RTC 設(shè)備
    發(fā)表于 02-22 18:36 ?3次下載
    <b class='flag-5'>RT-Thread</b>文檔_RTC <b class='flag-5'>設(shè)備</b>

    RT-Thread文檔_SPI 設(shè)備

    RT-Thread文檔_SPI 設(shè)備
    發(fā)表于 02-22 18:36 ?2次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>SPI</b> <b class='flag-5'>設(shè)備</b>

    RT-Thread文檔_WATCHDOG 設(shè)備

    RT-Thread文檔_WATCHDOG 設(shè)備
    發(fā)表于 02-22 18:36 ?1次下載
    <b class='flag-5'>RT-Thread</b>文檔_WATCHDOG <b class='flag-5'>設(shè)備</b>

    RT-Thread文檔_SENSOR 設(shè)備

    RT-Thread文檔_SENSOR 設(shè)備
    發(fā)表于 02-22 18:37 ?0次下載
    <b class='flag-5'>RT-Thread</b>文檔_SENSOR <b class='flag-5'>設(shè)備</b>

    RT-Thread文檔_AUDIO 設(shè)備

    RT-Thread文檔_AUDIO 設(shè)備
    發(fā)表于 02-22 18:38 ?0次下載
    <b class='flag-5'>RT-Thread</b>文檔_AUDIO <b class='flag-5'>設(shè)備</b>

    RT-Thread文檔_Pulse Encoder 設(shè)備

    RT-Thread文檔_Pulse Encoder 設(shè)備
    發(fā)表于 02-22 18:39 ?1次下載
    <b class='flag-5'>RT-Thread</b>文檔_Pulse Encoder <b class='flag-5'>設(shè)備</b>

    【S32K146 RT-thread SPI驅(qū)動適配

    概述RT-ThreadSPI總線的驅(qū)動,抽象出了spibus的設(shè)備驅(qū)動,我們基于S32K146的硬件學(xué)習(xí)spibus設(shè)備驅(qū)動。
    的頭像 發(fā)表于 11-01 08:11 ?121次閱讀
    【S32K146 <b class='flag-5'>RT-thread</b>】<b class='flag-5'>之</b> <b class='flag-5'>SPI</b>驅(qū)動適配