999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于MDM9607平臺的SPI接口驅動解析及應用

2023-06-22 12:34:30姜育生梁妮賀國旗
現代信息科技 2023年2期

姜育生 梁妮 賀國旗

摘? 要:文章從嵌入式Linux系統下MDM9607平臺的SPI驅動程序設計出發,介紹了SPI通信流程和體系結構,分析了標準4線、擴展6線SPI驅動原理并給出了部分關鍵程序的代碼,通過軟件配置給出了可供上層調用的API函數,并分別對標準4線、擴展6線SPI驅動進行了測試驗證,實驗結果表明該類驅動能夠精確地完成實時數據傳輸,對SPI外設的驅動程序設計具有較強的參考意義,可廣泛應用于CPE、4G模組、5G模組、物聯網等設備。

關鍵詞:MDM9607;Linux系統;SPI總線;驅動解析

中圖分類號:TN92? 文獻標識碼:A? 文章編號:2096-4706(2023)02-0149-04

Analysis and Application of SPI Interface Driver Based on MDM9607 Platform

JIANG Yusheng, LIANG Ni, HE Guoqi

(Shaanxi Open University, Xi'an? 710119, China)

Abstract: Starting from the design of SPI driver for MDM9607 platform under embedded Linux system, this paper introduces the SPI communication process and architecture, analyzes the principle of standard 4-wire and extended 6-wire SPI driver, and gives the code of some key programs. Through software configuration, it gives the API functions that can be called by the upper layer, and tests and verifies the standard 4-wire and extended 6-wire SPI drivers respectively. The experimental results show that this kind of driver can accurately complete the real-time data transmission, which has strong reference significance for the driver design of SPI peripherals, and can be widely used in CPE, 4G module, 5G module, Internet of Things and other devices.

Keywords: MDM9607; Linux system; SPI bus; driver analysis

0? 引? 言

SPI(Serial Peripheral interface)是一種高速的、全雙工、同步的通信總線。SPI采用主—從模式(Master-Slave)的控制方式,采用CS片來控制主機與從機通信,主機或從機的數據在時鐘上升沿或降低沿同步,并能夠同時傳輸數據。本文基于Linux操作系統與MDM9607平臺,分別介紹標準4線、擴展6線SPI驅動設計過程,并進行功能測試驗證[1]。

1? 硬件電路

SPI外接1.8 V的MCU電路參考設計(實際應用中為匹配阻抗可能需要層串聯電阻),標準4線SPI各數據線引腳默認1.8 V,不用則懸空。若另一端為3.3 V,則需要增加電平轉換芯片。如圖1所示。

SPI設備驅動,分為標準4線和擴展6線兩種。4線:SPI_CS_N(SPI片選信號)、SPI_MOSI(SPI數據輸出)、SPI_MISO(SPI數據輸入)、SPI_CLK(SPI時鐘),通常用來連接EEPROM、FLASH、LCD等,由模塊發起請求。

6線SPI主要比4線的SPI多了兩根控制線,主要用于通信前的握手功能,通信雙方都準備好了才發送數據,通常用來與MCU通信,模塊、MCU均可發起請求,相比串口通信也更高速。

相比4線SPI多出的兩個數據線功能為:

(1)SPI_MRDY:引腳用戶選擇,模塊輸出信號,空閑為低;當模塊要輸出數據時,驅動自動拉高該PIN。

(2)SPI_SRDY:引腳用戶選擇,SPI Slave ready信號,空閑為低;當SPISlave準備好接收/發送數據時,拉高該PIN。

2? 通信流程

2.1? SPI Master發起請求

SPI Master發起請求流程如圖2所示。

SPI Master流程為:

(1)驅動自動拉高SPI_MRDY通知SPI Slave。

(2)判斷SPI_SRDY是否為高,否則等待SPI_SRDY的上升沿中斷。

(3)收到Slave上升沿,開始SPI傳輸。

(4)傳輸完畢,如果要繼續發送數據,則保持SPI_MRDY為高,并繼續第二步,否則拉低SPI_MRDY。

SPI Slave流程為:

(1)收到SPI_MRDY上升沿中斷,表示SPI Master需要發送數據。

(2)準備好SPI傳輸,并拉高SPI_SRDY通知SPI Master開始SPI傳輸。

(3)等待SPI傳輸結束,并拉低SPI_SRDY。

(4)如果SPI_MRDY為高,再繼續第二步。

2.2? SPI Slave發起請求

SPI Slave發起請求流程如圖3所示。

SPI Slave流程:

(1)準備好SPI傳輸,并拉高SPI_SRDY。

(2)等待SPI傳輸結束,并拉低SPI_SRDY。

(3)如果要繼續發送數據,則繼續第1步。

SPI Master流程:

(1)收到SPI_SRDY上升沿中斷,表示從機要發送數據。

(2)拉高SPI_MRDY,并開始SPI傳輸。

(3)等待傳輸結束,并拉低SPI_MRDY[2,3]。

3? 軟件配置

3.1? SPI控制器配置說明

Linux的SPI體系結構分為以下3個組成部分。

3.1.1? SPI核心

SPI核心提供了SPI總線驅動和設備驅動的注冊、注銷方法、SPI通信方法,以及與具體控制器無關的代碼以及探測設備、檢測設備地址的上層代碼等。

3.1.2? SPI總線(控制器)驅動

SPI總線驅動是對SPI硬件體系控制器端的實現,控制器由CPU控制,也可以直接集成在CPU內部。

3.1.3? SPI 設備驅動

SPI設備驅動是對SPI硬件體系結構中設備端的實現,即客戶的SPI從設備驅動,設備一般掛接在受CPU控制的SPI控制器上,通過SPI控制器與CPU交換數據[4,5]。

以上3個部分,一般只需要關心和修改SPI設備驅動。

SPI總線驅動:即SPI控制器,MDM9607平臺使用的是設備樹節點spi-qup-v2;其硬件參數配置,如所兼容的driver、引腳的選擇、寄存器地址、CLK、中斷號,以及系統休眠和工作時的管腳配置等都已經做好,不需要關心和修改。

3.2? SPI設備驅動

3.2.1? 4線SPI設備驅動

4線SPI設備驅動位于ql-ol-kernel/drivers/spi/spidev.c,驅動不使用設備樹傳參方式,直接insmod帶入參數更靈活,內核模塊加載時支持的參數為:

(1)Busnum:SPI控制器編號為6,由下面代碼配置決定,此參數必須傳入,否則SPI從設備會找不到控制器而導致加載失敗。

aliases

{

/* smdtty devices*/

smd7 = &smdtty_data1;

smd8 = &smdtty_data4;

smd9 = &smdtty_data2;

smd21 = &smdtty_data21;

smd36 = &smdtty_loopback;

/*spi devices,Busnum = 6*/

spi6 = &spi_6;

i2c2 = &i2c_2;

i2c4 = &i2c_4;

sdhc2 = &sdhc_2;

}

(2)chipselect:片選支持0、1、2、3,此參數必須傳入,否則SPI設備會注冊失敗。

(3)spimode :SPI支持4種工作模式,其值為相位(CPHA 0x01)和極性(CPOL 0x02)的按位或,驅動代碼默認使用SPI_MODE_3模式,用戶可以在insmod時修改,時鐘極性CPOL:即SPI空閑時,時鐘信號SCLK的電平(1:空閑時高電平,0:空閑時低電平),時鐘相位CPHA:即SPI在SCLK第幾個邊沿開始采樣(0:第一個邊沿開始,1:第二個邊沿開始)[6,7]。

(4)maxspeed:可選參數,驅動默認為9.6 MHz,實際支持的最大值由SPI控制器的配置決定,與理論最大值并不沖突;支持的可選值960 000、4 800 000、9 600 000、16 000 000、19 200 000、25 000 000、50 000 000。

(5)bufsize:可選參數,設定SPI傳輸隊列中每個transfer的大小,默認值4 096 Bytes,用戶可根據自己傳輸每次數據量的大小來設定。

(6)加載命令:insmod /lib/modules/3.18.20/kernel/drivers/

spi/spidev.ko busnum=6 chipselect=0 spimode=0 maxspeed=

19200000。

執行lsmod查看載入系統的模塊,顯示:spidev 6473 0 - Live 0xbf03a000,再執行ls /dev/spidev6.0命令,顯示/dev/spidev6.0,設備加載成功[8,9]。

3.2.2? 6線SPI設備驅動

6線SPI設備驅動位于ql-ol-kernel/drivers/spi/quec_chn_spi.c,驅動不使用設備樹傳參方式,直接從insmod 命令行帶入客戶參數,內核模塊加載時支持的參數為:

(1)Busnum數值和4線相同;chipselect片選和4線一致,可選參數,驅動默認值為0;spimode和4線一致,驅動代碼默認使用SPI_MODE_0模式,用戶可以在insmod時修改;speed_hz和4線相同,frame_size默認值512 Bytes。

(2)gpiomodemready設置SPI_MRDY,gpiomcuready設置SPI_SRDY,一般使用默認管腳,可傳參修改。

加載命令:insmod /lib/modules/3.18.20/kernel/drivers/spi/quec_spi_chn.ko speed_hz=19200000

gpiomodemready=38 gpiomcuready=34。

執行lsmod查看載入系統的模塊,顯示:quec_spi_chn 9069 0 - Live 0xbf03a000,再執行ls /dev/spidev6_0_*命令,顯示:/dev/spidev6_0_0到 /dev/spidev6_0_7,6線SPI驅動虛擬出了8個數據通道,設備加載成功[10]。

4? SPI API

SDK中提供了一套完整的用戶編程接口,lib目錄下提供API接口庫,include目錄是所有API的頭文件,通過上面的配置,SPI設備節點已經注冊成功,可以直接使用下面API進行應用層操作,4線SPI操作API需要include頭文件ql_spi.h[11,12]。

4.1? Spi mode枚舉

SPI支持的工作模式:

typedef enum

{

SPIMODE0 = SPI_MODE_0,

SPIMODE1 = SPI_MODE_1,

SPIMODE2 = SPI_MODE_2,

SPIMODE3=SPI_MODE_3,

}SPI_MODE;

4.2? Spi clock枚舉

SPI默認支持的時鐘大小:

typedef enum

{

S_960K = 960000,

S_4_8M = 4800000,

S_9_6M = 9600000,

S_16M = 16000000,

S_19_2M = 19200000,

S_25M = 25000000,

S_50M = 50000000,

}SPI_SPEED;

4.3? SPI_Init函數

打開SPI設備并配置對應的參數。int Ql_SPI_Init(char *dev_name,SPI_MODE mode,uint8_t bits, SPI_SPEED speed);參數:dev_name(SPI設備,需要手動加載spidev.ko);SPI_MODE(SPI4種工作模式,SPI_MODE枚舉值);bits(發送數據字的位數,支持4,8,16,32);Speed(SPI控制器輸出時鐘,SPI_SPEED枚舉值)。

4.4? Ql_SPI_Write_Read函數

讀寫SPI數據。int Ql_SPI_Write_Read(int fd,uint8_t* write_buf,uint8_t* read_buf,uint32_t len);參數:fd(spi設備文件描述符);write_buf(SPI寫數據指針);read _buf(SPI讀數據指針);len(讀寫數據長度)。

SPI通信是全雙工的,只讀可以配置write_buf內容為0,只寫可以丟棄read_buf內容,由于標準SPI是讀寫在一個transfer里面,所有操作是全雙工的。向read_buf傳遞一個NULL,就是一次只寫操作,會丟棄MISO線上的數據;同樣向write_buf傳遞一個NULL,就是一次只讀操作。

4.5? Ql_SPI_Deinit函數

關閉SPI設備。int Ql_SPI_Deinit(int fd);參數:fd(SPI設備文件描述符)。

6線SPI驅動同時虛擬出了8個數據通道留做備用,直接使用open、read、write來讀寫SPI設備,并使用select監聽設備實現異步通知[13,14]。

5? SPI功能測試驗證

因為未連接spi slave設備,這里我們可以直接短接SPI_MOSI和SPI_MISO數據線進行自發自收測試。

5.1? 4線SPI功能驗證

以SPI_MODE_0,8bits/word,19.2M speed 初始化設備,向設備寫1 024個字節,同時讀取1 024字節回,測試程序為:

#define device "/dev/spidev6.0"

int main(int argc,char *argv[])

{

int fd;

int i;

uint8_t writebuf[1024];

uint8_t readbuf[1024];

fd = QL_SPI_Init(define,SPIMODE0,8,

S_19_2M);

for(i = 0;i < 1024;I++)

writebuf[i] = i % 256;

QL_SPI_Write_Read(fd,writebuf,readbuf,

1024);

for(i = 0;i < 1024;i++)

{

if(!(i % 32))

puts("");

printf("%.2X",readbuf[i]);

}

puts("");

}

在example/spi/std_spi目錄,make生成example_spi可執行程序,加載完驅動后執行./ example_spi,結果為:

spi mode:0x0

bits per word:8

max speed:19200000Hz(19200kHz)

00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D

0E 0F……………………………………F0

F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF

5.2? 6線SPI功能驗證

進入到example/spi/six_line目錄,make生成example_six_line_spi可執行程序,6線SPI除了短接SPI_MOSI和SPI_MISO以外,MRDY和SRDY也要進行硬件連接,才能進行自發自收測試[15,16]。加載完驅動后執行./ example_six_line_spi,結果為:

read 25 bytes hello,I am a six line spi

read 15 bytes test process!

通過實際的驗證測試,4線和6線的SPI收到的數據與發出去的一致,可以正常使用。

6? 結? 論

本文針對MDM9607平臺的SPI驅動展開研究,重點闡述了軟件的配置流程,給出了相關API調用接口,并進行了驗證測試,測試結果證明性能穩定。目前幾乎所有的處理器都支持SPI通信,尤其是對基于嵌入式Linux操作系統的驅動程序開發,具有一定的借鑒意義。

參考文獻:

[1] 徐陽.高速SPI接口電路的設計與驗證 [D].西安:西安電子科技大學,2020.

[2] 王鳴山.車聯網4GLTE模塊低紋波供電電源設計 [J].單片機與嵌入式系統應用,2019,19(11):47-52.

[3] 錢小東,宣浩,葛鵬.一種基于MLVDS的SPI通信鏈路設計 [J].數字技術與應用,2021,39(6):13-15.

[4] 閻景波,張磊,孫東亞.基于F28335的McBSP實現SPI接口的方法研究 [J].信息技術與信息化,2020(7):146-148.

[5] 陳亮,蔡聲鎮,盧麗婉.一種面向存儲的高性能雙向SPI傳輸機制 [J].微電子學與計算機,2021,38(3):72-76+83.

[6] 許云龍.基于APB總線的SPI接口的設計與實現 [J].電子質量,2020(7):128-132.

[7] 劉滿.SPI協議接口的設計與實現 [D].西安:西安電子科技大學,2020.

[8] 陸鵬.一種從機SPI通信接口的FPGA設計與實現 [J].信息通信,2020(3):142-143.

[9] 芮正新,辛克廷.一種基于DMA方式SPI接口的通信方法 [J].儀器儀表與分析監測,2020(3):9-12.

[10] 宋風雷.基于DSP的eCAN總線與SPI總線之間數據轉換器的設計與實現 [D].長沙:湖南大學,2018.

[11] 高培,何棟煒,鄭瀟.ESP32SPISlave總線接口驅動解析及應用 [J].單片機與嵌入式系統應用,2019,19(2):9-14.

[12] 趙冬青,梁璠,上官鵬,等.一種基于SPIFLASH的FPGA固件更新方法 [J].電子設計工程,2020,28(16):11-16.

[13] 李增科,李云鵬,席東學.基于SPI協議的雙DSP通訊設計與實現 [J].電子測量技術,2020,43(19):159-164.

[14] 王俊,劉國美,李興智,等.一種使用SPI接口的DSP間數據交叉傳輸技術 [J].信息技術與信息化,2021(5):206-207+210.

[15] 韓子川.28Gb/s光收發機SPI和UART的設計 [D].南京:東南大學,2019.

[16] 張拓智,孔德岐,朱恩亮,等.嵌入式Linux系統下的HI3210驅動軟件設計與實現[J].航空計算技術,2019,49(3):99-102.

作者簡介:姜育生(1979—),男,漢族,陜西西安人,高級工程師,碩士,研究方向:通信技術。

收稿日期:2022-08-26

基金項目:陜西哲學社會科學重點研究基地項目(22JZ019)

主站蜘蛛池模板: 久草网视频在线| 91精品综合| 国产在线视频福利资源站| 视频二区国产精品职场同事| 亚洲综合久久一本伊一区| 久久久精品国产SM调教网站| 亚洲中文无码h在线观看 | 亚洲成在人线av品善网好看| 亚洲无码A视频在线| 国产在线第二页| 亚洲成人在线播放 | 久久精品国产91久久综合麻豆自制| 亚洲视频a| 欧美一级在线| 日韩AV无码免费一二三区| 国产国产人免费视频成18| 黄色网址手机国内免费在线观看| 国产精品太粉嫩高中在线观看| 波多野结衣国产精品| 国产成人综合久久精品下载| 精品欧美日韩国产日漫一区不卡| 性欧美在线| 精品撒尿视频一区二区三区| 欧美国产日韩在线播放| 免费日韩在线视频| 亚洲欧美人成电影在线观看| 国产欧美日韩在线一区| 2021国产精品自产拍在线观看| 不卡网亚洲无码| 国产aaaaa一级毛片| 国产九九精品视频| 欧美成人A视频| 亚洲国产日韩视频观看| 国产91视频观看| 国产午夜福利片在线观看| 久久久久青草大香线综合精品| 亚洲成aⅴ人片在线影院八| 亚洲欧美精品一中文字幕| 一级毛片在线播放| 国产69囗曝护士吞精在线视频| 狠狠五月天中文字幕| 香蕉久久国产超碰青草| 成人在线第一页| 免费jjzz在在线播放国产| 久久精品视频一| 日本人又色又爽的视频| 欧美.成人.综合在线| 久久免费精品琪琪| 精品综合久久久久久97| 小说区 亚洲 自拍 另类| 天天摸夜夜操| 国产一级妓女av网站| 青青草国产一区二区三区| 亚洲成AV人手机在线观看网站| 久久网欧美| 国产成人在线无码免费视频| 国产高清在线观看| 国产精品亚洲片在线va| 欧美日韩一区二区在线免费观看 | 福利视频一区| 欧美一级夜夜爽www| 亚洲欧美另类中文字幕| 免费一级毛片在线播放傲雪网| 18禁高潮出水呻吟娇喘蜜芽| 成人精品免费视频| 精品三级网站| 国产精品久久自在自线观看| 国产成人亚洲精品色欲AV| 国产日本视频91| 亚洲欧美日韩中文字幕在线| 午夜欧美在线| 欧美在线一二区| 天堂亚洲网| 日韩精品高清自在线| 国产流白浆视频| 亚洲男女天堂| 久久久久人妻一区精品色奶水 | 青青久久91| 精品少妇人妻一区二区| 欧美国产日韩一区二区三区精品影视| 亚洲色欲色欲www网| 99视频在线免费|