SPI子系統一

2021-06-20 12:29:33 字數 1544 閱讀 8713

一、spi連線

sdi(資料輸入),sdo(資料輸出),sck(時鐘),cs(片選)。

(1)sdo     – 主裝置資料輸出,從裝置資料輸入

(2)sdi      – 主裝置資料輸入,從裝置資料輸出

(3)sclk   – 時鐘訊號,由主裝置產生

(4)cs        – 從裝置使能訊號,由主裝置控制

其中cs是控制晶元是否被選中的,也就是說只有片選訊號為預先規定的使能訊號時(高電位或低電位),對此晶元的操作才有效。這就允許在同一匯流排上連線多個spi裝置成為可能

二、驅動的主要檔案為:

kernel/driver/spi/ spi_s3c64xx.c   spidev.c,板級註冊檔案 mach-mini6410.c

在spidev.c中,

static const struct file_operations spidev_fops = ;

spidev.c 建立裝置 裝置名為:/dev/spi0.0  spi1.0

mach-mini6410.c 中註冊了幾組spi 在 /sys/bus/spi/目錄下的devices 和driver目錄下就有相應的裝置名和驅動名。 如:

註冊資訊為:

s3c64xx_spi_set_info(0,0,2);

s3c64xx_spi_set_info(1,0,2);

spi_register_board_info(s3c6410_spi0_board, array_size(s3c6410_spi0_board));

spi_register_board_info(s3c6410_spi1_board, array_size(s3c6410_spi1_board));

/sys/bus/spi/devices/spi0.0

/sys/bus/spi/devices/spi1.0

根據參考文章1,板級註冊檔案的內容必須新增,目的是建立裝置並註冊,當有裝置驅動載入時,就可以到裝置匯流排去匹配spi裝置。

備註:如果要設定模式,速率等,則可仿照以下語句:

speed =10*1000*1000; //10mhz

if (ioctl(fd, spi_ioc_wr_max_speed_hz, &speed)

perror("spi max_speed_hz");

return;

}預設spi_io_transfer時,每個位元組之間有延時。在atmel_spi_setup.c檔案裡去掉該延時語句:

/* todo: dlybs and dlybct */

//csr |= spi_bf(dlybs, 10);

//csr |= spi_bf(dlybct, 10);

這樣就可以達到無間隙快速傳輸批量資料。

標準read(),write()兩個函式僅適用於半雙工傳輸,。在傳輸之間不啟用片選。而spi_ioc_message(n)則是全雙工傳輸,並且片選始終啟用。

spi_ioc_message傳輸長度有限制,預設是一頁的長度,但是可以更改。

spi_ioc_transfer結構的spi長度 是位元組長度,16位傳輸的時候要注意。

LInux 子系統 之 SPI 一

1.主機驅動與外設驅動分離 linux中的spi子系統利用了典型的把主機驅動和外設驅動分離的想法,讓主機端只負責產生匯流排上的傳輸波形,而外設端只是通過標準的api來讓主機端以適當的波形訪問自身。這裡面涉及到了4個軟體模組。1 主機端驅動 根據控制器的硬體手冊,操作spi控制器,產生匯流排的傳輸波形...

SPI子系統分析之一 框架

核心版本 3.9.5 spi子系統概述 乙個spi主控制器對應一條spi匯流排,當然在系統中有唯一的匯流排編號.spi匯流排上有兩類裝置 主控端是spi匯流排的控制者,通過使用spi協議主動發起spi匯流排上的會話.而受控端則被動接受spi主控端的指令,並作出響應的響應.linux目前只支援spi主...

Linux時間子系統一 時間子系統綜述

timer在硬體上是乙個非常簡單的東西 這裡不考慮虛擬化,安全相關的問題 一般來說timer都會支援兩種模式,一是periodic模式和free running模式,前者週期性的產生中斷,後者一直往前累加到配置的最大值,報一次中斷,稱為one shot。軟體上將timer抽象成clocksource...