版权所有,转载请说明转自

原创作者:南京邮电大学  通信与信息系统专业 研二 魏清

五.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总线驱动(三)相关推荐

  1. 【SemiDrive源码分析】【MailBox核间通信】46 - Android侧 RPMSG_IPCC_RPC驱动分析(下) 之 RPMSG_IPCC_RPC驱动初始化、数据收发流程分析

    [SemiDrive源码分析][MailBox核间通信]46 - Android侧 RPMSG_IPCC_RPC驱动分析(下) 之 RPMSG_IPCC_RPC驱动初始化.数据收发流程分析 三. rp ...

  2. linux内核看门狗关闭方法,linux内核中断之看门狗

    一:内核中断 linux内核中的看门狗中断跟之前的裸板的中断差不多,在编写驱动之前,需要线把内核自带的watch dog模块裁剪掉,要不然会出现错误:在Device Drivers /Watchdog ...

  3. 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】Linux内核抢占实现机制分析

    Linux内核抢占实现机制分析 Sailor_forever  sailing_9806@163.com 转载请注明 http://blog.csdn.net/sailor_8318/archive/ ...

  4. Linux内核--网络栈实现分析(二)--数据包的传递过程--转

    转载地址http://blog.csdn.net/yming0221/article/details/7492423 作者:闫明 本文分析基于Linux Kernel 1.2.13 注:标题中的&qu ...

  5. linux内核中链表代码分析---list.h头文件分析(一)

    linux内核中链表代码分析---list.h头文件分析(一) 16年2月27日17:13:14 在学习数据结构时,有一个重要的知识点就是链表.对于链表的一些基本操作,它的最好学习资料就是内核中的li ...

  6. linux内核解析,8分钟掌握Linux内核分析的核心科技

    Linux的最大的好处之一就是它的源码公开.同时,公开的核心源码也吸引着无数的电脑爱好者和程序员:他们把解读和分析Linux的核心源码作为自己的最大兴趣,把修改Linux源码和改造Linux系统作为自 ...

  7. Linux内核抢占实现机制分析【转】

    Linux内核抢占实现机制分析 转自:http://blog.chinaunix.net/uid-24227137-id-3050754.html [摘要]本文详解了Linux内核抢占实现机制.首先介 ...

  8. linux内核中链表代码分析---list.h头文件分析(二)【转】

    转自:http://blog.chinaunix.net/uid-30254565-id-5637598.html linux内核中链表代码分析---list.h头文件分析(二) 16年2月28日16 ...

  9. PWN2OWN 2017 Linux 内核提权漏洞分析

    0.前言 在2017年PWN2OWN大赛中,长亭安全研究实验室(Chaitin Security Research Lab)成功演示了Ubuntu 16.10 Desktop的本地提权.本次攻击主要利 ...

  10. 第十期-Linux内核补丁源码分析(2)

    作者:罗宇哲,中国科学院软件研究所智能软件研究中心 在上一期中,我们通过CAKE系统的实例介绍了一种对Linux内核补丁的初步分析方法,这一期我们将继续通过CAKE系统的例子介绍一种对补丁文件源码的分 ...

最新文章

  1. sqlite3 unicode转中文
  2. jQurey 的选择器
  3. 问题集锦(21-25)
  4. 通过python建立一个web服务查看服务器上的文本、图片、视频等文件
  5. Laravel POST请求API接口 使用validate表单验证返回欢迎页
  6. ssl单向tomcat配置webservice访问方法
  7. 外网访问 KVM 虚拟机
  8. How to mount HFS EFI on macOS
  9. 洛谷——P1328 生活大爆炸版石头剪刀布
  10. python 输入参数获取_python获取输入参数
  11. Android开发环境搭建Eclipse+JDK+ADT+AVD(系列一)
  12. 时间序列模型matlab_平稳时间序列分析01---AR模型
  13. 聊聊Elasticsearch RestClient的NodeSelector
  14. 离散数学 左孝凌-教材与习题解析-分享
  15. c语言源代码大全迅雷下载,俄罗斯方块C语言源代码
  16. 富士施乐打印机双面打印设置方法
  17. Mysql集群原理整理
  18. 淘宝轮播图片制作技巧
  19. python立方根求解_python 二分查找(立方根)
  20. SVM算法实现(一)

热门文章

  1. 连载 | 知识图谱发展报告 2018 -- 前言
  2. 论文浅尝 | CFO: Conditional Focused Neural Question Answering
  3. Python中实现模糊匹配的魔法库:FuzzyWuzzy
  4. 一篇文章学习Python中的多进程
  5. 面向知识图谱的信息抽取
  6. Codeforces 1139F Dish Shopping 树状数组套平衡树 || 平衡树
  7. BZOJ 2124 等差子序列 线段树维护哈希
  8. luogu1168 中位数
  9. Redis学习笔记之Redis的对象
  10. nodejs+kafka+storm+hbase 开发