Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1710634
  • 博文数量: 143
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1462
  • 用 户 组: 普通用户
  • 注册时间: 2016-08-23 11:14
文章分类

全部博文(143)

文章存档

2022年(3)

2021年(13)

2020年(21)

2019年(8)

2018年(28)

2017年(7)

2016年(63)

我的朋友

分类: 嵌入式

2016-08-30 12:17:27

背景介绍:紧接着上一篇文章,当成功添加spi字符设备后,我们就可以在用户空间的应用程序中对spi外设进行“读”“写”“设置”操作,而spidev.c提供了两种读写模式:全双工模式和半双工模式。这里仍然参考文章:http://zch7811.blog.163.com/blog/static/1770522820135423251597/ ,其详细的介绍了两种模式下应用程序的编写。其中全双工模式应用程序,其实就是Linux自带的kernel.sdk/Documentation/spi/spidev_test.c。这里转载其半双工模式的应用程序见如下,并记录了我自己的调试过程。
半双工应用程序

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <fcntl.h>
  3. #include <stdlib.h>

  4. #define ARRAY_SIZE(array) sizeof(array)/sizeof(array[0])

  5. int main(int argc, char **argv)
  6. {
  7.     int i,fd;
  8.     char wr_buf[]={0xff,0x00,0x00,0xff};
  9.     char rd_buf[10];;

  10.     if (argc<2) {
  11.         printf("Usage:\n%s [device]\n", argv[0]);
  12.         exit(1);
  13.     }
  14.        
  15.     fd = open(argv[1], O_RDWR);
  16.     if (fd<=0) {
  17.         printf("%s: Device %s not found\n", argv[0], argv[1]);
  18.         exit(1);
  19.     }
  20.     
  21.     if (write(fd, wr_buf, ARRAY_SIZE(wr_buf)) != ARRAY_SIZE(wr_buf))
  22.         perror("Write Error");
  23.     if (read(fd, rd_buf, ARRAY_SIZE(rd_buf)) != ARRAY_SIZE(rd_buf))
  24.         perror("Read Error");
  25.     else
  26.         for (i=0;i<ARRAY_SIZE(rd_buf);i++) {
  27.         printf("0x%02X ", rd_buf[i]);
  28.         if (i%2)
  29.             printf("\n");
  30.     }

  31.     close(fd);
  32.     return 0;
  33. }

调试步骤

  1 使用交叉编译工具链编译好半双工模式的应用程序,重命名为spidevtest。半双工应用程序不再列出,见如上链接。
  2 拷贝应用程序spidevtest到单板。使用tftp下载或nfs方法都可以。
  3 单板启动后,串口下执行:./spidevtest /dev/spidev1.1。与此同时,使用示波器测量spi1的数据输出Pin的电平信号,与软件所写的数据一致,即可证明应用程序写OK;并且,串口打印出来的读数据,也与软件所写的数据一致,即可证明应用程序读OK。
阅读(2936) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~