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总线驱动(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何传入比较器_typescript专题
- 下一篇: 1053 Path of Equal W