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,

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

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

相关文章

AI时代的高科技读心术:算法解码脑中图像

来源&#xff1a;科研圈翻译 李杨&#xff0c;审校 张梦茜&#xff0c;编辑 魏潇让我们想象一下&#xff1a;只要在心里浮现出某个人物或风景&#xff0c;就能从一堆数码照片中把它搜索出来。或者不用动笔就能画出一个新的厨房设计。又或者给心爱的人发送一张想象中的落日照…

linux 基础训练题,Linux习题练习

1 在主目录下创建abc文件&#xff0c;并设置其权限为同组用户有执行权限&#xff0c;属主有全部权限&#xff0c;其它用户没有权限。采用chmod命令&#xff0c;数字表示权限&#xff0c;分部是主&#xff0c;组&#xff0c;其他&#xff0e;权限为read,write,execute. 属主有全…

获取字段为List类型中的泛型类型

在java编程时&#xff0c;经常会使用反射去处理对象&#xff0c;有时会需要知道List的泛型类型&#xff1a;示例操作如下 obj pojo.newInstance();// 首先得到pojo所定义的字段Field[] fields pojo.getDeclaredFields();for (Field curField : fields) {// 设置字段可访问&a…

《Nature》发布毫米级软体机器人,可在没有任何物理干预情况下游走于人体

转载自公众号&#xff1a;机器人大讲堂概要&#xff1a;一直以来&#xff0c;微型机器人、软体机器人成为科学研究的热点&#xff0c;我们都期盼机器人能听从指挥的到达人体指定位置&#xff0c;在对人体危害最小的情况下递送药物或者切除病变组织。1966年著名作家艾萨克阿西莫…

Spring Data JPA 禁止自动更新

公司的项目后台架构是SpringBoot Spring Date JPA&#xff0c;采用MySQL数据库。在工作刚开始时就遇到了一个奇怪的现象。在采用Date JPA查询完数据库之后&#xff0c;若改变了查询出的对象属性&#xff0c;那么数据库就会自动更新。比如查询出一个studentPO的name为“小明”&…

Nature:寻找记忆的痕迹

来源&#xff1a;神经科技对于不是《神探夏洛克》超级粉丝的人来说&#xff0c;认知神经科学家Janice Chen对这部英国广播公司的热播侦探剧的了解比大多数人多。当观众观看这部电视剧的第一集然后描述其情节时&#xff0c;Chen能在脑部扫描仪的帮助下监视他们的脑子里正在发生什…

tcl linux 刷 安卓系统,安卓用户看过来—手把手教你刷第三方系统

来来来&#xff0c;小葵花课堂讲课啦。孩子咳嗽老不好&#xff0c;多半是废了&#xff0c;打一顿就好。手机卡顿老不好&#xff0c;先别着急&#xff0c;来刷个机吧。众所周知&#xff0c;因为安卓系统自身的特性&#xff0c;安卓手机用久了难免出现卡顿。一般来说解决的方法有…

DeepMind开源Psychlab平台——搭建AI和认知心理学的桥梁(附论文和代码下载)

来源&#xff1a;专知概要&#xff1a;DeepMind近期开源了Psychlab&#xff0c;这是一个利用认知心理学等领域知识来研究受控环境下人工智能体&#xff08;Artificial Agent&#xff09;的行为&#xff0c;从而模拟人类的行为。DeepMind近期开源了Psychlab&#xff0c;这是一个…

linux启动过程剖析,分析Linux系统的启动过程

导读一直使用linux系统&#xff0c;却对系统启动过程及系统初始化和各种服务的启动不太清楚。今天终于搞明白整个是怎么一回事了。本来想自己写篇文章&#xff0c;刚好在网上看到一篇不错的介绍&#xff0c;很详细&#xff0c;就直接拿来了。Linux系统的启动过程&#xff1a;BI…

扩展立方体 The Scale Cube

转自&#xff1a; https://akfpartners.com/growth-blog/scale-cube/ 比例立方体 2018年4月25日| 发布者&#xff1a;Robin McGlothin Scale Cube是用于定义微服务和扩展技术产品的模型。AKF Partners于2007年发明了Scale Cube&#xff0c;最初于2007年在我们的博客上在线发…

人脑动态功能网络连接模式能够鉴别个体并预测其认知功能

来源&#xff1a;神经科技概要&#xff1a;近二十年来&#xff0c;基于静息态功能磁共振影像的人脑连接组学快速发展&#xff0c;为无创研究活体人脑的功能组织规律和网络运作机制提供了重要手段&#xff0c;大大促进了研究者对脑认知、脑发育和脑疾病神经机制的理解。近日&…

linux中dhcp如何配置两个子网,linux – 配置DHCP服务器以在同一VLAN上为多个子网提供服务...

我有一个由多个子网组成的VLAN,我想使用DHCP集中IP地址指定.DHCP服务器(100.100.25.88)是子网100.100.25.64/27上的Debian计算机.我想为子网100.100.68.0/24中的计算机分配IP地址.最终目标是在100.100.68.0/24子网中的所有计算机上启用PXE引导.下面是我的dhcpd.conf文件,# DHCP…

JMS之企业消息传送

企业消息传送&#xff1a;消息是通过网络从一个系统异步传送给其他系统的。 客户端&#xff1a;使用消息传送API 的一个业务应用程序或组件&#xff08;如&#xff1a;JMS&#xff09; 集中式体系结构 分散式体系结构

linux看系统硬件,Linux 查看系统硬件信息(实例详解)

cpulscpu命令&#xff0c;查看的是cpu的统计信息.blueblue-pc:~$lscpuArchitecture:i686#cpu架构CPUop-mode(s):32-bit,64-bitByteOrder:LittleEndian#小尾序CPU(s):4#总共cpulscpu命令&#xff0c;&#xff0c;查看的是cpu的统计信息.blueblue-pc:~$ lscpuArchitecture:i686#c…

达沃斯群英纵论人工智能,核心观点汇总

来源&#xff1a;AI科技大本营概要&#xff1a;一年一度的世界经济论坛年会&#xff08;达沃斯论坛&#xff09;上&#xff0c;来自不同领域的精英纷纷发表了自己对于人工智能的看法。一年一度的世界经济论坛年会&#xff08;达沃斯论坛&#xff09;已经召开了3天&#xff0c;该…

Java消息服务思维导图笔记

https://www.processon.com/view/link/610b5f201efad40724bdfae2

window计算的chk在linux下可以读,Linux系统命令从入门到完全忘记(四)

系统安全相关命令chmod概要&#xff1a;用于改变文件或目录的访问权限&#xff0c;用它控制文件或目录的访问权限。语法格式&#xff1a;chmod [-cfvR] [–help] [–version] mode file参数&#xff1a;参数说明-c当发生改变时&#xff0c;报告处理信息-f错误信息不输出-R处理指…

如何设计一个安全对外的接口

来源&#xff1a;https://mp.weixin.qq.com/s/eDXsqyfIKDXii0DB6W0UcA

三大国有银行同时入股 AI 公司第四范式

来源&#xff1a;新华社概要&#xff1a;人工智能公司第四范式于1月26日宣布完成B&#xff0b;轮融资&#xff0c;并同时宣布获得来自中国工商银行、中国银行、中国建设银行三家国有银行及所属基金的联合战略投资。人工智能公司第四范式于1月26日宣布完成B&#xff0b;轮融资&a…

freedos能够编译c语言嘛,Freedos freedos核心源代码包含汇编和C语言代码 - 下载 - 搜珍网...

Freedos 内核源代码Freedos 内核源代码/KE2035AFreedos 内核源代码/KE2035A/BINFreedos 内核源代码/KE2035A/BIN/AUTOEXEC.BATFreedos 内核源代码/KE2035A/BIN/CONFIG.SYSFreedos 内核源代码/KE2035A/BIN/INSTALL.BATFreedos 内核源代码/KE2035A/BOOTFreedos 内核源代码/KE2035…