linux 驱动入门 魏清,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,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/410843.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[html] 如何在IOS下启用WebApp全屏模式?

[html] 如何在IOS下启用WebApp全屏模式&#xff1f; 手机端打开Web检查器&#xff0c;Mac端接入手机&#xff0c;打开Safari开发模式。 设置<meta>标签&#xff1a; <meta name"apple-mobile-web-app-capable" content"yes" /> <meta name…

【2019年07月08日】A股最便宜的股票

查看更多A股最便宜的股票&#xff1a;androidinvest.com/CNValueTop/ 便宜指数 PE PB 股息 ROE&#xff0c;四因子等权&#xff0c;数值越大代表越低估。 本策略只是根据最新的数据来选股&#xff0c;完全无人工参与的过程&#xff0c;所以并不能对接下来的利润或业绩做预测…

[html] 举例说明使用data-有什么优点?

[html] 举例说明使用data-有什么优点&#xff1f; 可以方便的缓存数据在dom上个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

linux 粘贴网站地址,linux 复制粘贴

ListView 完全优化 &plus; 多种listitem布局处理# 百度了下,感觉下面的博客文章还都挺全面的,写的很好,直接分享得了 Android性能优化--Listview优化 - tonycheng93 - 博客园http://www.cnblogs.co ...自动切换的JS菜单ADO&period;NET 快速入门(十四)&#xff1a;使用…

NOIP2002题目汇总

普及组 阶级求和&#xff08;模拟&#xff09;选数&#xff08;数学&#xff09;产生数&#xff08;高精度&#xff09;马拦过河卒&#xff08;递推&#xff09;提高组 均分纸牌&#xff08;模拟&#xff09;字串变换&#xff08;搜索&#xff09;自由落体&#xff08;模拟&…

Xpath语法学习记录

高级参考&#xff1a;https://blog.csdn.net/wudaoshihun/article/details/82226122 举例: 1 <!DOCTYPE html>2 <html>3 <head>4 <meta charset"utf-8">5 <title></title>6 </head>7 <bod…

[html] 可替换元素和不可替换元素有什么不同的特点?

[html] 可替换元素和不可替换元素有什么不同的特点&#xff1f; 可替换元素的内容由元素的某些属性的值决定不可替换元素的内容由子节点的内容决定个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目…

Linux循环登录怎么解决,文本模式循环登录! 求解决

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼的确只有/etc/bash.bashrc。。/etc/bash.bashrc:[ -z "$PS1" ] && returnshopt -s checkwinsizeif [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; thendebian_chroot$(cat /etc/deb…

Sharepoint 2010新体验之一-----基于Claims的全新验证机制

在SharePoint Server 2007中世界中&#xff0c;如果我们想在一个Web应用程序中并存多种验证机制&#xff0c;只能通过“扩展Web应用程序”来实现&#xff0c;这种方式实现上是通过不同的应用程序来交互同一内容数据库。但是在SharePoint 2010中&#xff0c;我们看到了新的身份验…

[html] 写一个三栏布局,两边固定,中间自适应

[html] 写一个三栏布局&#xff0c;两边固定&#xff0c;中间自适应 position marginfloat marginflex个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

手写springmvc

手写springmvc 既然已经手写了spring的IOC&#xff0c;那springmvc肯定也要尝试写写了。手写spring博客:https://www.cnblogs.com/xiaojiesir/p/11139203.html SpringMVC的运行流程&#xff1a; &#xff08;1&#xff09;首先浏览器发送请求——>DispatcherServlet&#xf…

[html] 页面需要支持多语言,如果是你该怎么做?

[html] 页面需要支持多语言&#xff0c;如果是你该怎么做&#xff1f; 有多语言选项利用i18n来适配多语言个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

工厂方法

工厂方法特点&#xff1a;将对象的创建放在工厂类中&#xff0c;利用抽象原理&#xff0c;将实例化行为延迟到工厂类中 using System;using System.Collections.Generic;using System.Text; namespace OOAD_FactoryMethod{ class Program { static void Main(stri…

centos7安装svn客户端和使用

rpm -qa subversion yum remove -y subversion yum install -y subversion svnserve --version svn checkout http://xxx.xx.xx/xx转载于:https://www.cnblogs.com/lihan829/p/11154631.html

linux可用机场客户端,Linux系统可用的6款Bittorrent客户端

大家都知道迅雷目前尚不支持Linux系统&#xff0c;其实使用Bittorrent客户端进行下载未尝不是一个好的选择&#xff0c;这里给大家介绍6款Linux可用Bittorrent客户端&#xff0c;方便经常需要进行文件下载的Linux用户。1.KtorrentKtorrent是KDE桌面环境默认安装的Bittorrent工具…

linux中resize的含义,linux的resize2fs命令

Linux下的resize2fs命令被用来增大或收缩未加载的文件系统的大小。下面由学习啦小编为大家整理了linux下resize2fs命令的相关知识&#xff0c;希望对大家有帮助!linux的resize2fs命令详解文件系统管理 resize2fs命令被用来增大或者收缩未加载的“ext2/ext3”文件系统的大小。如…

C#理论知识

override&#xff1a;要扩展或修改继承的方法、属性、索引器或事件的抽象实现或虚实现&#xff0c;必须使用 override 修饰符。重写的基方法必须是 virtual、abstract 或 override 的。override 声明不能更改 virtual 方法的可访问性。 override 方法和 virtual 方法必须具有相…

H3C 环路避免机制一:路由毒化

转载于:https://www.cnblogs.com/fanweisheng/p/11156838.html

c语言循环字符,字符串 非暴力for循环法(内附C语言代码)

对于长度为5位的一个01串&#xff0c;每一位都可能是0或1&#xff0c;一共有32种可能。它们的前几个是&#xff1a;0000000001000100001100100请按从小到大的顺序输出这32种01串。输入格式本试题没有输入。输出格式输出32行&#xff0c;按从小到大的顺序每行一个长度为5的01串。…

.net自定义控件Control、WebControl、CompositeControl

.net自定义控件Control、WebControl、CompositeControl 一、呈现方法 1、Control主要有以下4个方法用于呈现 1 //该方法为入口方法2 public virtual void RenderControl (HtmlTextWriter writer) 3 { 4 this.RenderControl(writer,this.xxxAdapter); 5 } 6 7 p…