日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux内核spi总线驱动分析,Linux下的SPI总线驱动(三)

發布時間:2024/7/23 linux 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux内核spi总线驱动分析,Linux下的SPI总线驱动(三) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

版權所有,轉載請說明轉自

原創作者:南京郵電大學? 通信與信息系統專業 研二 魏清

五.SPI測試代碼

對于SPI總線驅動,我們可以分為SPI控制設備驅動和SPI接口設備驅動。而作為驅動開發人員主要是像SPI移植的時候一樣會添加SPI控制設備和SPI接口設備的私有數據,同時驅動開發人員還需要會開發SPI接口設備驅動,而我們這個SPI測試實驗中,我們使用的是內核自帶的SPI接口設備驅動代碼spidev.c。我們也對內核給的SPI測試代碼spidev_test.c進行了修改。同時我們利用mini2440自帶的兩個SPI接口(spi0和spi1),測試過程中我們只使用spi1,根據查找datesheet我們知道,spi1的SPIMISO1是GPG5,也就是CON4的19引腳。spi1的SPIMOSI1是GPG6,也就是CON4的20引腳。所以我們這個應用層測試代碼采用自發自收方式,所以需要將CON4的19引腳和CON4的20引腳短接。

實驗環境:內核linux2.6.32.2,arm-linux-gcc交叉編譯器,mini2440開發板。

內核配置:配置時候我們需要選中spi.c spi_gpio.c?? spi_s3c24xx.c? spi_bitbang.c? spi_s3c24xx_gpio.cspidev.c文件

具體測試代碼如下

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))

static void pabort(const char *s)

{

perror(s);

abort();

}

static const char *device = "/dev/spidev1.0";//設備名

static uint8_t mode;

static uint8_t bits = 8;

static uint32_t speed = 500000;

static uint16_t delay;

static void transfer(int fd)

{

int ret;

uint8_t tx[] = {????? //定義待發送的數據

0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,

0x40, 0x00, 0x00, 0x00, 0x00, 0x95,

0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,

0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,

0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,

0xDE, 0xAD, 0xBE, 0xEF, 0xBA, 0xAD,

0xF0, 0x0D,

};

uint8_t rx[ARRAY_SIZE(tx)] = {0, };

struct spi_ioc_transfer tr = {

.tx_buf = (unsigned long)tx,?? //定義發送緩沖區指針

.rx_buf = (unsigned long)rx,?? //定義接收緩沖區指針

.len = ARRAY_SIZE(tx),

.delay_usecs = delay,

.speed_hz = speed,

.bits_per_word = bits,

};

ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);//執行spidev.c中ioctl的default進行數據傳輸

if (ret == 1)

pabort("can't send spi message");

for (ret = 0; ret < ARRAY_SIZE(tx); ret++) {

if (!(ret % 6))

puts("");

printf("%.2X ", rx[ret]);????? //打印接收到的數據

}

puts("");

}

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

{

int ret = 0;

int fd;

mode |= SPI_CPHA;

mode |= SPI_CPOL;

mode &= ~SPI_CS_HIGH;

fd = open(device, O_RDWR);?????? //打開"/dev/spidev1.0"

if (fd < 0)

pabort("can't open device");

ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);? //SPI模式設置可寫

if (ret == -1)

pabort("can't set spi mode");

ret = ioctl(fd, SPI_IOC_RD_MODE, &mode); //SPI模式設置可讀

if (ret == -1)

pabort("can't get spi mode");

ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);? //SPI的bit/word設置可寫

if (ret == -1)

pabort("can't set bits per word");

ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);?? //SPI的bit/word設置可讀

if (ret == -1)

pabort("can't get bits per word");

ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);???? //SPI的波特率設置可寫

if (ret == -1)

pabort("can't set max speed hz");

ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);?? //SPI的波特率設置可讀

if (ret == -1)

pabort("can't get max speed hz");

printf("spi mode: %d\n", mode);

printf("bits per word: %d\n", bits);

printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000);

transfer(fd);??????????????????????????????????????????????????????? //數據傳輸

close(fd);

return ret;

}

測試結果:

虛擬機下編譯arm-linux-gcc? spi_test.c? -o? spi_test

在超級終端下運行:./spi_test

可以見到:

0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,

0x40, 0x00, 0x00, 0x00, 0x00, 0x95,

0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,

0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,

0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,

0xDE, 0xAD, 0xBE, 0xEF, 0xBA, 0xAD,

0xF0, 0x0D,

總結

以上是生活随笔為你收集整理的linux内核spi总线驱动分析,Linux下的SPI总线驱动(三)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。