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

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

五.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 驱动入门 魏清,Linux下的SPI总线驱动(三)相关推荐

  1. linux内核spi总线驱动分析,Linux下的SPI总线驱动(三)

    版权所有,转载请说明转自 原创作者:南京邮电大学  通信与信息系统专业 研二 魏清 五.SPI测试代码 对于SPI总线驱动,我们可以分为SPI控制设备驱动和SPI接口设备驱动.而作为驱动开发人员主要是 ...

  2. Linux下的USB总线驱动 mouse

    Linux下的USB总线驱动(03)--USB鼠标驱动 usbmouse.c USB鼠标驱动 usbmouse.c 原文链接:http://www.linuxidc.com/Linux/2012-12 ...

  3. *Linux下的USB总线驱动 u盘驱动分析*

    Linux下的USB总线驱动(三) u盘驱动分析 版权所有,转载请说明转自 http://my.csdn.net/weiqing1981127 https://www.xuebuyuan.com/13 ...

  4. linux内核SPI总线驱动分析(一)

    下面有两个大的模块: 一个是SPI总线驱动的分析            (研究了具体实现的过程) 另一个是SPI总线驱动的编写(不用研究具体的实现过程) SPI总线驱动分析   1 SPI概述     ...

  5. Linux下的USB总线驱动 1

    版权所有,转载请说明转自 http://my.csdn.NET/weiqing1981127 一.USB理论 1.      USB概念概述 USB1.0版本速度1.5Mbps(低速USB) USB1 ...

  6. Linux下的USB总线驱动 3

    版权所有,转载请说明转自 http://my.csdn.net/weiqing1981127 4.U盘驱动分析 USB Mass Storage是一类USB存储设备,这些设备包括USB磁盘.USB硬盘 ...

  7. Linux下的PCI总线驱动

    版权所有,转载请说明转自  http://my.csdn.net/weiqing1981127 原创作者:南京邮电大学  通信与信息系统专业 研二 魏清 一.理论 1.      PCI总线的特点: ...

  8. Linux下的USB总线驱动(三) u盘驱动分析

    版权所有,转载请说明转自 http://my.csdn.net/weiqing1981127 4.U盘驱动分析 USB Mass Storage是一类USB存储设备,这些设备包括USB磁盘.USB硬盘 ...

  9. Linux内核入门-如何获取Linux内核源代码、生成配置内核

    如何获取Linux内核源代码 如何获取Linux内核源代码 下载Linux内核当然要去官方网站了,网站提供了两种文件下载,一种是完整的Linux内核,另一种是内核增量补丁,它们都是tar归档压缩包.除 ...

最新文章

  1. 清华导学故事|卓晴:在每个人生阶段中,找到自己的定位
  2. Mac下使用可执行脚本记录远程服务器账号和密码
  3. 一次线上JVM调优实践,FullGC40次/天到10天一次的优化过程
  4. DCMTK:解压缩DICOM文件
  5. 解决在Mac上用pyenv安装python3失败的问题
  6. Linux中locate命令查找文件位置
  7. python数码管应用到物流_使用Python,实现程序运行计时的数码管表示
  8. python编写性别比例失衡_性别比例失衡加剧什么情况?什么原因导致这样的结果?...
  9. 服务器虚拟化相关技术介绍,虚拟化技术介绍
  10. 图像特征提取之Haar特征
  11. itextpdf 数字签名
  12. matlab数字电路仿真,MATLAB环境下的数字电路仿真
  13. 麒麟KY-RTI分布仿真技术:第三章 KY-OMT对象模型模板工具
  14. python scapy2.3 在windows上的安装
  15. Linux下分区、挂载、删除分区说明
  16. VS code 显示中文异常解决办法
  17. vdsm:vdsm-client 命令行使用演示
  18. 拼音首字母缩写在线翻译源码
  19. Yocto开发篇 | Ubuntu构建与体验Poky发行版(Yocto 3.1版本)
  20. CI information

热门文章

  1. react学习(49)--参数判定
  2. 前端学习(3067):vue+element今日头条管理-频道筛选完成
  3. 前端学习(2810):完成安卓打包
  4. 前端学习(2361):下拉刷新的学习
  5. 前端学习(1296):第三方模块nodemon
  6. 前端学习(768):构造对象与对象区别
  7. 前端学习(706):do-while案例
  8. mybatis学习(28):获取自增id方式二(在全局中配置setting选项)
  9. mybatis学习(21):MySQL 字符串 转换 CAST与CONVERT 函数的用法
  10. 第七十二期:Visual Studio Online 终于公开上线了