CubieBoard中文论坛

 找回密码
 立即注册
搜索
热搜: unable
查看: 6754|回复: 0

Linux系统 测试spi自发自收数据

[复制链接]
发表于 2018-6-1 16:23:36 | 显示全部楼层 |阅读模式
本帖最后由 FizZ 于 2018-6-1 16:23 编辑

关于SPI驱动,测试SPI自发自收数据,需要在设备下生成SPI节点
1.查看SPI0节点(以板子生成的SPI节点以为准)
  1. $ ls /dev/spidev0.0
  2. /dev/spidev0.0
复制代码
2.把spi测试程序移到板子上进行gcc编译
以下为spi测试程序:
可以根据SPI节点的不同修改代码中的节点名称(41行)
  1. /************************************************************
  2. 1.SPI_IOC_RD_MODE                     //读 模式
  3. 2.SPI_IOC_RD_LSB_FIRST                //读 LSB
  4. 3.SPI_IOC_RD_BITS_PER_WORD            //读 每字多少位
  5. 4.SPI_IOC_RD_MAX_SPEED_HZ             //读 最大速率
  6. 5.SPI_IOC_WR_MODE                     //写 模式
  7. 6.SPI_IOC_WR_LSB_FIRST                //写 LSB
  8. 7.SPI_IOC_WR_BITS_PER_WORD            //写 每字多少位
  9. 8.SPI_IOC_WR_MAX_SPEED_HZ             //写 最大速率
  10. 9.SPI_IOC_MESSAGE(n)                  //传输n个数据包
  11. *************************************************************/








  12. #include <stdint.h>
  13. #include <unistd.h>
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16. #include <getopt.h>
  17. #include <fcntl.h>
  18. #include <sys/ioctl.h>
  19. #include <linux/types.h>
  20. #include <linux/spi/spidev.h>


  21. #include <unistd.h>

  22. #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))

  23. static void pabort(const char *s)
  24. {
  25.     perror(s);
  26.     abort();
  27. }

  28. static const char *device = "/dev/spidev0.0";
  29. static uint8_t mode;
  30. static uint8_t bits = 8;
  31. static uint32_t speed = 1000; //500000;
  32. static uint16_t delay;

  33. static void transfer(int fd)
  34. {
  35.     int ret;
  36.      
  37.     //要发送的数据数组


  38.     uint8_t tx[] = {
  39.         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  40.         0x40, 0x00, 0x00, 0x00, 0x00, 0x95,
  41.         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  42.         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  43.         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  44.         0xDE, 0xAD, 0xBE, 0xEF, 0xBA, 0xAD,
  45.         0xF0, 0x0D,
  46.     };



  47.      

  48. //    uint8_t tx[] = {
  49. //        0x55,0xaa,0xf5};
  50.      
  51.     uint8_t rx[ARRAY_SIZE(tx)] = {0, };    //接收的数据数据
  52.     //声明并初始化spi_ioc_transfer结构体
  53.     struct spi_ioc_transfer tr = {
  54.         .tx_buf = (unsigned long)tx,
  55.         .rx_buf = (unsigned long)rx,
  56.         .len = ARRAY_SIZE(tx),
  57.         .delay_usecs = delay,
  58.         .speed_hz = speed,
  59.         .bits_per_word = bits,
  60.     };

  61.     //SPI_IOC_MESSAGE(1)的1表示spi_ioc_transfer的数量
  62.     ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);        //ioctl默认操作,传输数据
  63.       
  64.     if (ret == 1)
  65.         pabort("can't send spi message");

  66.     for (ret = 0; ret < ARRAY_SIZE(tx); ret++) {    //打印接收缓冲区
  67.         if (!(ret % 6))                                //6个数据为一簇打印
  68.             puts("");
  69.         printf("%.2X ", rx[ret]);
  70.     }
  71.     puts("");
  72. }

  73. static void print_usage(const char *prog)            //参数错误则打印帮助信息
  74. {
  75.     printf("Usage: %s [-DsbdlHOLC3]\n", prog);
  76.     puts("  -D --device   device to use (default /dev/spidev1.1)\n"
  77.          "  -s --speed    max speed (Hz)\n"
  78.          "  -d --delay    delay (usec)\n"
  79.          "  -b --bpw      bits per word \n"
  80.          "  -l --loop     loopback\n"
  81.          "  -H --cpha     clock phase\n"
  82.          "  -O --cpol     clock polarity\n"
  83.          "  -L --lsb      least significant bit first\n"
  84.          "  -C --cs-high  chip select active high\n"
  85.          "  -3 --3wire    SI/SO signals shared\n");
  86.     exit(1);
  87. }

  88. static void parse_opts(int argc, char *argv[])
  89. {
  90.     while (1) {
  91.         static const struct option lopts[] = {
  92.             { "device",  1, 0, 'D' },
  93.             { "speed",   1, 0, 's' },
  94.             { "delay",   1, 0, 'd' },
  95.             { "bpw",     1, 0, 'b' },
  96.             { "loop",    0, 0, 'l' },
  97.             { "cpha",    0, 0, 'H' },
  98.             { "cpol",    0, 0, 'O' },
  99.             { "lsb",     0, 0, 'L' },
  100.             { "cs-high", 0, 0, 'C' },
  101.             { "3wire",   0, 0, '3' },
  102.             { "no-cs",   0, 0, 'N' },
  103.             { "ready",   0, 0, 'R' },
  104.             { NULL, 0, 0, 0 },
  105.         };
  106.         int c;

  107.         c = getopt_long(argc, argv, "D:s:d:b:lHOLC3NR", lopts, NULL);

  108.         if (c == -1)
  109.             break;

  110.         switch (c) {
  111.         case 'D':
  112.             device = optarg;
  113.             break;
  114.         case 's':
  115.             speed = atoi(optarg);
  116.             break;
  117.         case 'd':
  118.             delay = atoi(optarg);
  119.             break;
  120.         case 'b':
  121.             bits = atoi(optarg);
  122.             break;
  123.         case 'l':
  124.             mode |= SPI_LOOP;
  125.             break;
  126.         case 'H':
  127.             mode |= SPI_CPHA;
  128.             break;
  129.         case 'O':
  130.             mode |= SPI_CPOL;
  131.             break;
  132.         case 'L':
  133.             mode |= SPI_LSB_FIRST;
  134.             break;
  135.         case 'C':
  136.             mode |= SPI_CS_HIGH;
  137.             break;
  138.         case '3':
  139.             mode |= SPI_3WIRE;
  140.             break;
  141.         case 'N':
  142.             mode |= SPI_NO_CS;
  143.             break;
  144.         case 'R':
  145.             mode |= SPI_READY;
  146.             break;
  147.         default:
  148.             print_usage(argv[0]);
  149.             break;
  150.         }
  151.     }
  152. }

  153. int main(int argc, char *argv[])
  154. {
  155.     int ret = 0;
  156.     int fd;

  157.      int count=0;
  158.      char buf[]={0x11,0x22,0x33,0x44,0x55};

  159.     parse_opts(argc, argv);

  160.     fd = open(device, O_RDWR);
  161.     if (fd < 0)
  162.         pabort("can't open device");

  163.     /*
  164.      * spi mode
  165.      */
  166.     ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);
  167.     if (ret == -1)
  168.         pabort("can't set spi mode");

  169.     ret = ioctl(fd, SPI_IOC_RD_MODE, &mode);
  170.     if (ret == -1)
  171.         pabort("can't get spi mode");

  172.     /*
  173.      * bits per word
  174.      */
  175.     ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
  176.     if (ret == -1)
  177.         pabort("can't set bits per word");

  178.     ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);
  179.     if (ret == -1)
  180.         pabort("can't get bits per word");

  181.     /*
  182.      * max speed hz
  183.      */
  184.     ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
  185.     if (ret == -1)
  186.         pabort("can't set max speed hz");

  187.     ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
  188.     if (ret == -1)
  189.         pabort("can't get max speed hz");

  190.     printf("spi mode: %d\n", mode);
  191.     printf("bits per word: %d\n", bits);
  192.     printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000);

  193.     while(1)
  194.     {
  195.         transfer(fd);            //传输测试   
  196.         sleep(1);
  197.          
  198.          

  199.     //count=write(fd,buf,sizeof(buf)/sizeof(buf[0]));
  200.     //read(fd,buf,count);   
  201.     //printf("read byte is: 0x%02X\n",buf[0]);
  202.      //sleep(1);         
  203.          
  204.          
  205.     }
  206.      

  207.     close(fd);

  208.     return ret;
  209. }
复制代码
3.运行程序,会有以下打印:
  1. root@debian:~# ./spidev_test  
  2. spi mode: 0
  3. bits per word: 8
  4. max speed: 1000 Hz (1 KHz)

  5. 00 00 00 00 00 00
  6. 00 00 00 00 00 00
  7. 00 00 00 00 00 00
  8. 00 00 00 00 00 00
  9. 00 00 00 00 00 00
  10. 00 00 00 00 00 00
  11. 00 00

  12. 00 00 00 00 00 00
  13. 00 00 00 00 00 00
  14. 00 00 00 00 00 00
  15. 00 00 00 00 00 00
  16. 00 00 00 00 00 00
  17. 00 00 00 00 00 00
  18. 00 00
复制代码
此时短接SPI0_MOSI引脚和SPI0_MISO引脚,会有以下打印:
  1. FF FF FF FF FF FF
  2. 40 00 00 00 00 95
  3. FF FF FF FF FF FF
  4. FF FF FF FF FF FF
  5. FF FF FF FF FF FF
  6. DE AD BE EF BA AD
  7. F0 0D
复制代码
断开时又会重新变回0.

参考:https://bbs.csdn.net/topics/391055813?page=1




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|粤ICP备13051116号|cubie.cc---深刻的嵌入式技术讨论社区

GMT+8, 2024-4-19 12:42 , Processed in 0.022086 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2012 Comsenz Inc. | Style by Coxxs

返回顶部