日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
詳解LinuxSPI通信實(shí)例(linuxspi實(shí)例)

SPI(Serial Peripheral Interface)作為一種常用的外設(shè)通信協(xié)議,被廣泛應(yīng)用于嵌入式系統(tǒng)中。在Linux中,也提供了完整的SPI驅(qū)動(dòng)支持,本文將結(jié)合實(shí)例詳解Linux下的SPI通信流程和實(shí)現(xiàn)方法。

一、硬件連接

在實(shí)現(xiàn)SPI通信前,需要先完成硬件的連接。在SPI通信中,分為主設(shè)備和從設(shè)備之分。主設(shè)備在數(shù)據(jù)傳輸時(shí)控制時(shí)序,從設(shè)備則被動(dòng)接收和發(fā)送數(shù)據(jù)。在主設(shè)備和從設(shè)備之間,需要通過(guò)四根連接線(xiàn)進(jìn)行串行數(shù)據(jù)傳輸,具體如下:

* MOSI(Master Output Slave Input):主設(shè)備輸出,從設(shè)備輸入

* MISO(Master Input Slave Output):主設(shè)備輸入,從設(shè)備輸出

* SCLK(Serial Clock):由主設(shè)備產(chǎn)生的時(shí)鐘信號(hào),控制數(shù)據(jù)傳輸速度

* SS(Slave Select):從設(shè)備選擇信號(hào),用于選擇通信的從設(shè)備

在連接硬件時(shí),需要將主設(shè)備的MOSI連接到從設(shè)備的MOSI,主設(shè)備的MISO連接到從設(shè)備的MISO,主設(shè)備的SCLK連接到從設(shè)備的SCLK,主設(shè)備的SS連接到從設(shè)備的SS。

二、SPI驅(qū)動(dòng)框架

Linux中的SPI驅(qū)動(dòng)分為兩個(gè)部分,一部分是核心部分,另一部分是SPI設(shè)備的驅(qū)動(dòng)部分。

核心部分:

在核心部分中,主要包括SPI驅(qū)動(dòng)核心模塊(spi-core),負(fù)責(zé)管理SPI總線(xiàn)和SPI從設(shè)備的注冊(cè)和注銷(xiāo)以及SPI數(shù)據(jù)傳輸。

SPI從設(shè)備驅(qū)動(dòng)部分:

SPI從設(shè)備驅(qū)動(dòng)部分主要是根據(jù)硬件連接和核心的SPI驅(qū)動(dòng)模塊進(jìn)行交互,負(fù)責(zé)向核心模塊注冊(cè)從設(shè)備并實(shí)現(xiàn)對(duì)從設(shè)備的控制和數(shù)據(jù)傳輸功能。

三、SPI總線(xiàn)注冊(cè)

在使用SPI接口進(jìn)行通信時(shí),首先需要在Linux中注冊(cè)SPI總線(xiàn)。SPI設(shè)備驅(qū)動(dòng)通常存放于linux/drivers/spi目錄下,各個(gè)驅(qū)動(dòng)之間彼此獨(dú)立。有關(guān)每一個(gè)SPI設(shè)備的驅(qū)動(dòng)程序需要負(fù)責(zé)向Linux kernel注冊(cè)一個(gè)spi_driver結(jié)構(gòu)體變量,以便在需要時(shí)調(diào)用這些函數(shù)。

struct spi_driver {

int (*probe)(struct spi_device *);//硬件連接時(shí),初始化設(shè)備

int (*remove)(struct spi_device *);//撤銷(xiāo)設(shè)備時(shí)的回調(diào)函數(shù)

struct device_driver driver;

const struct spi_device_id *id_table;//注冊(cè)設(shè)備ID

};

– probe函數(shù):在硬件設(shè)備匹配到驅(qū)動(dòng)時(shí)被調(diào)用,負(fù)責(zé)初始化設(shè)備。

– remove函數(shù):在設(shè)備被撤銷(xiāo)時(shí)調(diào)用的回調(diào)函數(shù)。

– id_table:存放設(shè)備ID的數(shù)組結(jié)構(gòu),通過(guò)id_table可以判斷設(shè)備是否支持當(dāng)前的驅(qū)動(dòng)程序。

四、SPI設(shè)備注冊(cè)

在SPI總線(xiàn)完成注冊(cè)后,需要在Linux中注冊(cè)每一個(gè)SPI從設(shè)備。SPI設(shè)備驅(qū)動(dòng)通常存放于linux/drivers/spi目錄下,各個(gè)驅(qū)動(dòng)之間彼此獨(dú)立。而每一個(gè)SPI從設(shè)備驅(qū)動(dòng)程序也需要負(fù)責(zé)向Linux kernel注冊(cè)一個(gè)spi_driver結(jié)構(gòu)體變量。

設(shè)備注冊(cè)分兩個(gè)步驟:

1. 生產(chǎn)spi_device

在Linux中為每一個(gè)從設(shè)備分配一個(gè)spi_device結(jié)構(gòu)體,用于存儲(chǔ)spi_driver和硬件相關(guān)的信息。在使用spi_register_device函數(shù)之前,需要先創(chuàng)建spi_device結(jié)構(gòu)體并初始化相關(guān)的成員參數(shù)。

static struct spi_device *spi_validate_device(struct spi_master *master,

struct spi_device *spi)

{

//kzalloc 分配一個(gè) spi_device 個(gè)大小的空間到進(jìn)行初始化

spi = kzalloc(sizeof(struct spi_device), GFP_KERNEL);

//初始化spi_device的成員變量

spi->master = master;

spi->dev.parent = &master->dev;

spi->dev.driver = &spi->driver;

spi->max_speed_hz = 500000;

spi->mode = SPI_MODE_0;

spi->bits_per_word = 8;

return spi;

}

2. 注冊(cè)spi_device

調(diào)用spi_register_device函數(shù),將從設(shè)備注冊(cè)到核心SPI總線(xiàn)。spi_register_device函數(shù)包含兩個(gè)參數(shù):spi_device和spi_driver。

int spi_register_device(struct spi_device *spi)

{

struct spi_master *master = spi->master;

struct spi_drv_data *drv_data = master->drv_data;

spi_setup(spi);

spin_lock(&drv_data->device_lock);

list_add(&spi->device_entry, &drv_data->device_list);

spin_unlock(&drv_data->device_lock);

spi_dev_put(spi);

return 0;

}

五、數(shù)據(jù)傳輸

在設(shè)備注冊(cè)完成后,即可進(jìn)行SPI的讀寫(xiě)操作。SPI的數(shù)據(jù)傳輸操作分為兩種:全雙工(full duplex)和半雙工(half duplex)。

1. 全雙工數(shù)據(jù)傳輸

主從設(shè)備同步進(jìn)行全雙工的SPI通信。只通過(guò)一個(gè)clock線(xiàn)控制數(shù)據(jù)的傳輸。主設(shè)備在源碼中對(duì)全雙工SPI傳輸方式的設(shè)備進(jìn)行傳輸時(shí),首先通過(guò)spi_transfer函數(shù)對(duì)一次數(shù)據(jù)傳輸?shù)南嚓P(guān)參數(shù)進(jìn)行設(shè)置,然后通過(guò)spi_sync函數(shù)進(jìn)行數(shù)據(jù)的傳輸和同步等待操作。

struct spi_transfer {

char *tx_buf;//發(fā)送緩存區(qū)

char *rx_buf;//接收緩存區(qū)

unsigned len;//傳輸數(shù)據(jù)長(zhǎng)度

unsigned speed_hz;//傳輸速度

unsigned bits_per_word;//每個(gè)字的位數(shù)

u16 delay_usecs;//傳輸間隔

unsigned cs_change;//傳輸開(kāi)始之前,先將C進(jìn)行操作

void *tx_dma;//發(fā)送緩存區(qū)DMA

void *rx_dma;//接收緩存區(qū)DMA

void (*rx_sg)();//scatter-gather 變量的內(nèi)核提供者

void (*tx_sg)();//scatter-gather 變量的內(nèi)核提供者

};

int spi_sync(struct spi_device *spi, struct spi_message *msg)

{

mutex_lock(&spi->master->bus_lock);

status = _spi_sync(spi, msg, spi_transfer);

mutex_unlock(&spi->master->bus_lock);

}

2. 半雙工數(shù)據(jù)傳輸

半雙工傳輸是主從設(shè)備順序半雙工傳輸,一次僅僅進(jìn)行發(fā)送和接收其中的一個(gè)操作。主設(shè)備在源碼中對(duì)半雙工SPI傳輸方式的設(shè)備進(jìn)行傳輸時(shí),分別將SPITRANSF_WRITE和SPITRANSFER_READ兩個(gè)參數(shù)傳遞給spi_message,分別進(jìn)行發(fā)送和接收的操作。

struct spi_message {

struct list_head transfer_list;

unsigned is_dma_mapped:1; // DMA mapping related

bool is_poll:1;

};

int spi_sync(struct spi_device *spi, struct spi_message *msg)

{

// …

status = _spi_sync(spi, msg, spi_transfer);

// …

}

六、

本文結(jié)合實(shí)例詳解了Linux下的SPI通信流程和實(shí)現(xiàn)方法,包括硬件連接、SPI驅(qū)動(dòng)框架、SPI總線(xiàn)注冊(cè)以及數(shù)據(jù)傳輸?shù)榷鄠€(gè)方面。希望本文能為L(zhǎng)inux應(yīng)用開(kāi)發(fā)者提供借鑒和參考,方便大家在嵌入式系統(tǒng)中使用SPI進(jìn)行通信。

成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù)!

linux 自帶spidev應(yīng)用問(wèn)題

read /write是半雙讓啟工, 只發(fā)/歷慧只受, 你單個(gè)spi在發(fā)送肢滑答時(shí)沒(méi)接收,數(shù)據(jù)丟掉了.

linux2.4+arm9下spi總線(xiàn)驅(qū)動(dòng)問(wèn)題

arm上的SPI控制一點(diǎn)都不復(fù)雜,如果你的SPI線(xiàn)上沒(méi)有其他設(shè)備,可以直接寫(xiě)那個(gè)無(wú)線(xiàn)芯片的驅(qū)動(dòng)

linux spi實(shí)例的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux spi實(shí)例,詳解Linux SPI通信實(shí)例,linux 自帶spidev應(yīng)用問(wèn)題,linux2.4+arm9下spi總線(xiàn)驅(qū)動(dòng)問(wèn)題的信息別忘了在本站進(jìn)行查找喔。

創(chuàng)新互聯(lián)(cdcxhl.com)提供穩(wěn)定的云服務(wù)器,香港云服務(wù)器,BGP云服務(wù)器,雙線(xiàn)云服務(wù)器,高防云服務(wù)器,成都云服務(wù)器,服務(wù)器托管。精選鉅惠,歡迎咨詢(xún):028-86922220。


本文題目:詳解LinuxSPI通信實(shí)例(linuxspi實(shí)例)
分享網(wǎng)址:http://www.5511xx.com/article/dhhhsgp.html