linux spi 设备节点 读写

2023-11-15

本文记录spi设备节点的操作方法。

SPI总线设备文件名通常为/dev/spidevN.P(N=0、1、2……,P=0、1、2……),

其中N表示第几路SPI总线,而P表示在该路SPI总线中使用哪个CS信号线。

参考链接:

  http://www.wzaobao.com/p/l5079K.html

  http://www.emcraft.com/stm32f429discovery/accessing-spi-devices-in-linux

  http://blog.csdn.net/yuanlulu/article/details/6320740

程序

kernel/Documentation/spi/spidev_test.c

编译之后,MISO和MOSI连接,能够收到发送的数据。

#include <stdint.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/types.h>
#include <linux/spi/spidev.h>

#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);
    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("");
}

static void print_usage(const char *prog)
{
    printf("Usage: %s [-DsbdlHOLC3]\n", prog);
    puts("  -D --device   device to use (default /dev/spidev1.1)\n"
         "  -s --speed    max speed (Hz)\n"
         "  -d --delay    delay (usec)\n"
         "  -b --bpw      bits per word \n"
         "  -l --loop     loopback\n"
         "  -H --cpha     clock phase\n"
         "  -O --cpol     clock polarity\n"
         "  -L --lsb      least significant bit first\n"
         "  -C --cs-high  chip select active high\n"
         "  -3 --3wire    SI/SO signals shared\n");
    exit(1);
}

static void parse_opts(int argc, char *argv[])
{
    while (1) {
        static const struct option lopts[] = {
            { "device",  1, 0, 'D' },
            { "speed",   1, 0, 's' },
            { "delay",   1, 0, 'd' },
            { "bpw",     1, 0, 'b' },
            { "loop",    0, 0, 'l' },
            { "cpha",    0, 0, 'H' },
            { "cpol",    0, 0, 'O' },
            { "lsb",     0, 0, 'L' },
            { "cs-high", 0, 0, 'C' },
            { "3wire",   0, 0, '3' },
            { "no-cs",   0, 0, 'N' },
            { "ready",   0, 0, 'R' },
            { NULL, 0, 0, 0 },
        };
        int c;

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

        if (c == -1)
            break;

        switch (c) {
        case 'D':
            device = optarg;
            break;
        case 's':
            speed = atoi(optarg);
            break;
        case 'd':
            delay = atoi(optarg);
            break;
        case 'b':
            bits = atoi(optarg);
            break;
        case 'l':
            mode |= SPI_LOOP;
            break;
        case 'H':
            mode |= SPI_CPHA;
            break;
        case 'O':
            mode |= SPI_CPOL;
            break;
        case 'L':
            mode |= SPI_LSB_FIRST;
            break;
        case 'C':
            mode |= SPI_CS_HIGH;
            break;
        case '3':
            mode |= SPI_3WIRE;
            break;
        case 'N':
            mode |= SPI_NO_CS;
            break;
        case 'R':
            mode |= SPI_READY;
            break;
        default:
            print_usage(argv[0]);
            break;
        }
    }
}

int main(int argc, char *argv[])
{
    int ret = 0;
    int fd;

    parse_opts(argc, argv);

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

    /*
     * spi mode
     */
    ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);
    if (ret == -1)
        pabort("can't set spi mode");

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

    /*
     * bits per word
     */
    ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
    if (ret == -1)
        pabort("can't set bits per word");

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

    /*
     * max speed hz
     */
    ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
    if (ret == -1)
        pabort("can't set max speed hz");

    ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
    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);

    while(1)
    {
        transfer(fd);
        sleep(1);
    }

    close(fd);

    return ret;
}

Tony Liu

2016-10-26, Shenzhen

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux spi 设备节点 读写 的相关文章

  • 在字节实习8个月后,成功转正!

    大家好 这里是 NewBeeNLP 今天给大家分享一位22届学弟在字节实习8个月后成功转正的经历 他向我们展示了在字节实习的日常工作 以及转正答辩该如何准备 最后告诫学弟学妹们今年秋招会很激烈 一定要尽早投递 本文堪称大厂实习转正的教科书

随机推荐

  • SQLITE3 使用总结

    SQLITE3 使用总结 3 5 转 3 不使用回调查询数据库 T6 F H m2 上面介绍的 sqlite3 exec 是使用回调来执行 select 操作 还有一个方法可以直接查询而不需要回调 但是 我个人感觉还是回调好 因为代码可以更
  • 安卓手机玩游戏卡顿怎么解决_员工在上班时间玩手机怎么办?解决方案来了!...

    人性化管理不是嘴上说说而已 员工为什么上班期间看手机 你思考过吗 gt gt gt gt 第一种员工自然是工作效率很高 这种员工也是很多公司想要拥有的 如果a员工在工作期间忙的鸡飞狗跳 b员工则胜似 闲庭漫步 这足以说明两者之间的工作效率
  • 基于深度学习识别模型的缺陷检测

    一 介绍 缺陷检测被广泛使用于布匹瑕疵检测 工件表面质量检测 航空航天领域等 传统的算法对规则缺陷以及场景比较简单的场合 能够很好工作 但是对特征不明显的 形状多样 场景比较混乱的场合 则不再适用 近年来 基于深度学习的识别算法越来越成熟
  • 西班牙放大招,利用区块链技术防腐

    链客 专为开发者而生 有问必答 此文章来自区块链技术社区 未经允许拒绝转载 在过去十年来 西班牙爆发了一系列引人注目的腐败丑闻 其中以公共采购最甚 但据TI 2017年的腐败认知指数表明 西班牙下滑了8个百分点 成为欧盟排名最低的国家之一
  • windows下解决matplotib中文乱码问题

    matplotlib默认是不支持中文的 在window系统下如何设置使其可以显示中文 参考文章
  • 科目一:信息系统综合知识——4.嵌入式技术

    4 嵌入式技术 4 1 嵌入式微处理器体系结构 冯诺依曼结构 传统计算机采用 也称普林斯顿结构 该结构下的存储器将程序指令存储器和数据存储器合并在一起 计算机程序和数据共用一个存储空间 程序指令存储地址和数据存储地址指向同一存储器的不同物理
  • treectrl遍历

    树是一种十分重要的数据结构 在程序设计中 我们经常用树来组织数据 对于树的遍历也是一种常规的运算 下面提供了两个算法 前面一个只是简单的遍历了所有的结点 后面一个则可以根据传入条件返回相应的结点 功能 遍历CTreeCtrl所有结点 参数
  • expected type: java.lang.String, actual value: $Proxy26

    这个错误是在什么情况下报出的 sqlsever ssh的 时候 使用的是非持久化的查询 因为是多服务器查询 query getSession createSQLQuery sql setResultTransformer Transform
  • 2023-9-14 最长上升子序列

    题目链接 最长上升子序列 include
  • C# 序列化与反序列化几种格式的转换

    这里介绍了几种方式之间的序列化与反序列化之间的转换 首先介绍的如何序列化 将object对象序列化常见的两种方式即string和xml对象 第一种将object转换为string对象 这种比较简单没有什么可谈的 public string
  • Eclipse-修改工程名

    直接修改工程可能会产生一些莫名其妙的问题 需遵循以下四步 1 右键工程 Refactor gt Rename 或选中工程按F2 修改名称 2 右键工程 Properties gt Web Project Settings 修改Context
  • 性能测试的方法

    性能测试主要采用的方法有 1 负载测试 通过对系统不断的加压 直到超过预定的指标或者部分资源达到一种饱和状态不能再加压为止 该方法主要用于找到系统最大的负载能力 为性能调优提供数据 2 压力测试 指系统已经达到一定的饱和程度 CPU 磁盘等
  • Django2.0-redis

    redis 概述 redis是一种nosql数据库 他的数据是保存在内存中 同时redis可以定时把内存数据同步到磁盘 即可以将数据持久化 并且他比memcached支持更多的数据结构 string list列表 队列和栈 set 集合 s
  • LRU和LFU的区别

    分析 回答 LRU和LFU都是内存管理的页面置换算法 LRU 即 最近最少使用淘汰算法 Least Recently Used LRU是淘汰最长时间没有被使用的页面 LRU关键是看数据最后一次被使用到发生替换的时间长短 时间越长 数据就会被
  • 都在用 AI 生成美少女,而我却。。。

    最近 AI 画画特别的火 你能从网上看到非常多好看的图片 于是我就开始了我的安装之旅 我看到的图是这样的 这样的 还有这样的 然后我就开始了我的 AI 安装生成计划 安装环境 首先我们需要安装 Python 环境 因为这个需要显卡 我估计我
  • [C++]for 循环多个限制条件

    for int i 0 j 0 i lt 5 j lt 7 i j 那么最后判断的会是j lt 7的条件 应该写成 for int i 0 j 0 i lt 5 j lt 7 i j 转载于 https www cnblogs com dr
  • django celery简单 例子

    django celery简单 例子 https docs celeryq dev en latest django first steps with django html pip list pip install Django4 2 3
  • Oracle的基本数据类型总结

    1 字符类型 CHAR 一个定长字符串 当位数不足自动用空格填充来达到其最大长度 如非NULL的CHAR 12 总是包含12字节信息 CHAR字段最多可以存储2 000字节的信息 VARCHAR2 这是一个变长字符串 与CHAR 类型不同
  • JavaScript WebGL 三维相关概念

    引子 在 JavaScript WebGL 矩阵之后 发现在实现三维效果之前还有一些概念需要理解 就去查了下资料 按照自己的习惯整合了一下 Origin My GitHub 齐次坐标 三维坐标理论上三个分量就够了 但在看相关程序的时候 发现
  • linux spi 设备节点 读写

    本文记录spi设备节点的操作方法 SPI总线设备文件名通常为 dev spidevN P N 0 1 2 P 0 1 2 其中N表示第几路SPI总线 而P表示在该路SPI总线中使用哪个CS信号线 参考链接 http www wzaobao