一、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...