linux spidev 应用_linux 测试 SPI 测试应用程序代码 | 学步园

这篇博客介绍了如何在Linux环境下使用spidev驱动进行SPI测试,提供了测试代码示例,适用于TI AM335X硬件平台。测试代码展示了如何设置SPI参数并进行数据传输。
摘要由CSDN通过智能技术生成

mail:bookworepeng@Hotmail.com

qq:196568501

author:DriverMonkey

phone:13410905075

测试硬件平台:TI  AM335X

测试代码:

/*

* SPI testing utility (using spidev driver)

*

* Copyright (c) 2007 MontaVista Software, Inc.

* Copyright (c) 2007 Anton Vorontsov

*

* This program is free software; you can redistribute it and/or modify

* it under the terms of the GNU General Public License as published by

* the Free Software Foundation; either version 2 of the License.

*

* Cross-compile with cross-gcc -I/path/to/cross-kernel/include

*/

#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.1";

static uint8_t mode;

static uint8_t bits = 8;

static uint32_t speed = 500000;

static uint16_t delay;

uint8_t tx[4096] = {0};

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

static void transfer(int fd)

{

int ret;

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);

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("");

}

static void print_usage(const char *prog)

{

printf("Usage: %s [-DsbdlHOLC3]\n", prog);

puts(" -D --device device to use (default /dev/spidev1.1)\n"

" -s --speed max speed (Hz)\n"

" -d --delay delay (usec)\n"

" -b --bpw bits per word \n"

" -l --loop loopback\n"

" -H --cpha clock phase\n"

" -O --cpol clock polarity\n"

" -L --lsb least significant bit first\n"

" -C --cs-high chip select active high\n"

" -3 --3wire SI/SO signals shared\n");

exit(1);

}

static void parse_opts(int argc, char *argv[])

{

while (1) {

static const struct option lopts[] = {

{ "device", 1, 0, 'D' },

{ "speed", 1, 0, 's' },

{ "delay", 1, 0, 'd' },

{ "bpw", 1, 0, 'b' },

{ "loop", 0, 0, 'l' },

{ "cpha", 0, 0, 'H' },

{ "cpol", 0, 0, 'O' },

{ "lsb", 0, 0, 'L' },

{ "cs-high", 0, 0, 'C' },

{ "3wire", 0, 0, '3' },

{ "no-cs", 0, 0, 'N' },

{ "ready", 0, 0, 'R' },

{ NULL, 0, 0, 0 },

};

int c;

c = getopt_long(argc, argv, "D:s:d:b:lHOLC3NR", lopts, NULL);

if (c == -1)

break;

switch (c) {

case 'D':

device = optarg;

break;

case 's':

speed = atoi(optarg);

break;

case 'd':

delay = atoi(optarg);

break;

case 'b':

bits = atoi(optarg);

break;

case 'l':

mode |= SPI_LOOP;

break;

case 'H':

mode |= SPI_CPHA;

break;

case 'O':

mode |= SPI_CPOL;

break;

case 'L':

mode |= SPI_LSB_FIRST;

break;

case 'C':

mode |= SPI_CS_HIGH;

break;

case '3':

mode |= SPI_3WIRE;

break;

case 'N':

mode |= SPI_NO_CS;

break;

case 'R':

mode |= SPI_READY;

break;

default:

print_usage(argv[0]);

break;

}

}

}

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

{

int err = 0;

unsigned char cmd = 32;

unsigned int mode = 0;

int handle_spi1dev = 0;

int ret = 0;

printf("init_SPI1()++\n");

printf("handle_spi1dev = %x \n", handle_spi1dev);

handle_spi1dev = open("/dev/spidev1.0",O_RDWR);

if(handle_spi1dev < 0)

{

printf("/dev/spidev1.0 error \n");

}

mode = SPI_CPHA;

err = ioctl(handle_spi1dev, SPI_IOC_WR_BITS_PER_WORD,&cmd);//change spi to 32bits mode

if (err == -1)

printf("can't set spi mode\n");

err = ioctl(handle_spi1dev, SPI_IOC_WR_MODE, &mode);

if (err == -1)

printf("can't set spi mode\n");

printf("handle_spi1dev = %x \n", handle_spi1dev);

printf("init_SPI1()--\n");

transfer(handle_spi1dev);

close(handle_spi1dev);

return ret;

}

测试结果:

当前SPI 驱动接口最多一次转送 4K Bytes 大小的数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值