qnx的spi记录

news2024/9/28 16:35:45

https://www.cnblogs.com/schips/p/protocol_spi_about.html (主要)

https://www.zhihu.com/question/308406342/answer/2901148391

https://www.bbsmax.com/A/lk5aa4Pm51/ (有基础测试代码)

https://baijiahao.baidu.com/s?id=1746087964061209214&wfr=spider&for=pc

https://blog.csdn.net/qq_44810226/article/details/127991578

其中上图的通信流程如下:

  1. SPI主机首先先将SS或CS线拉低,以此来告知SPI从机通信开始。

2.主机通过发送SCLK时钟信号,来告知从机即将进行的读写操作。这里的SCLK时钟信号是由SPI的模式来决定是高电平还是低电平有效的,这点在稍后会进行介绍。

3.主机(Master)将要发送的数据写到发送数据缓存区(Memory),缓存区经过移位寄存器(0~7),串行移位寄存器通过MOSI信号线将字节一位一位地移出去传送给从机,同时MISO接口接收到的数据经过移位寄存器一位一位地移到接收缓存区。

4.从机(Slave)也将自己的串行移位寄存器(0~7)中的内容通过MISO信号线返回给主机。同时通过MOSI信号线接收主机发送的数据,这样,两个移位寄存器中的内容就被交换。

最初的疑问:

1、必须由master先发送才能读取slave端数据吗?

答:应该是,暂时理解的是由主机发送时钟信号来通知采样和发送

2、spi一侧的收发只有一个缓冲区吗?

答:理解的应该是,因为本质上是master的一个buffer与slave的buffer的一个数据交互

3、master时候发送,什么时候接收?

答:根据极性和相位决定,但是在同一个上升沿和下降沿,一定会一个负责读取(采集),一个负责发送

QNX的spi接口理解:

QNX/qnx_ap/AMSS/platform/qal/clients/spi_client/src/spi_client.c

可以发现,在封装spi的读、取、交换三个接口的时候,一定会有发送的一个buffer存在,所以总会是先发送

在exchange接口,发送参数有3个(包括设备、长度和buf),接收参数只有1个buf

在spi_write_ex接口,发送参数3个,接收参数为0,应该代表不在乎接收的数据

spi_read_ex接口,发送参数为2个(设备和buf),接收参数为1个(buf)

static int spi_xchange_ex(int fd, uint32_t device, void *wbuf, void *rbuf, int len)
{
    int32_t retval=0;
    iov_t wiov[4];
    iov_t riov[1];

    if(fd < 0) {
        errno = EINVAL;
        return -1;
    }

    SETIOV(wiov+0, &device, sizeof(device));
    SETIOV(wiov+1, &len, sizeof(len));
    SETIOV(wiov+2, wbuf, len);
    SETIOV(riov+0, rbuf, len);

    if (devctlv(fd, DCMD_SPI_XCHANGE, 3, 1, wiov, riov, &retval)) {
        LOGE("devctlv failed");
        errno = EINVAL;
        goto err;
    }

    return retval;
err:
    return -1;
}

static int spi_write_ex(int fd, uint32_t device, void *buf, int len)
{
    int32_t retval=0;
    iov_t wiov[4];

    if(fd < 0) {
        errno = EINVAL;
        return -1;
    }

    SETIOV(wiov+0, &device, sizeof(device));
    SETIOV(wiov+1, &len, sizeof(len));
    SETIOV(wiov+2, buf, len);

    if (devctlv(fd, DCMD_SPI_WRITE, 3, 0, wiov, NULL, &retval)) {
        LOGE("devctlv failed");
        errno = EINVAL;
        goto err;
    }
    if (-1 == retval) {
        LOGE("spi write failed, len:%d ret:0x%x", len, retval);
        errno = EIO;
        goto err;
    } else if (-1 > retval) {
        errno = -retval;
        goto err;
    }

    return len;
err:
    return -1;
}

int spi_read_ex(int fd, uint32_t device, void *buf, int len)
{
    int32_t retval=0;
    iov_t wiov[3];
    iov_t riov[1];

    if(fd < 0) {
        errno = EINVAL;
        return -1;
    }

    SETIOV(wiov+0, &device, sizeof(device));
    SETIOV(wiov+1, &len, sizeof(len));
    SETIOV(riov+0, buf, len);

    if (devctlv(fd, DCMD_SPI_READ, 2, 1, wiov, riov, &retval)) {
        LOGE("devctlv failed");
        errno = EINVAL;
        goto err;
    }
    if (-1 == retval) {
        LOGE("spi read failed, len:%d ret:0x%x", len, retval);
        errno = EIO;
        goto err;
    } else if (-1 > retval) {
        errno = -retval;
        goto err;
    }

    return retval;
err:
    return -1;
}

spi更底层的接口封装:

QNX/qnx_ap/AMSS/platform/resources/spi_drv/spi_drv.c

static int io_devctl(resmgr_context_t *ctp, io_devctl_t *msg, IOFUNC_OCB_T *ocbp)
{
       case DCMD_SPI_READ:
       {
          char *data = (char*)_DEVCTL_DATA(msg->i);
          uint32_t device = *(uint32_t*)data;
          data += sizeof(device);
          int len = *(int*)data;
          data += sizeof(len);
    
          /* ensure that we don't transfer junk bytes for padded TX */
          memset(ocb->wbuf.virtualAddr, 0, len);
          memset(&msg->o, 0, sizeof(msg->o));
          msg->o.ret_val = start_hwd_transfer(ocb, device, &ocb->wbuf, len, &ocb->rbuf, len);
       }

        case DCMD_SPI_WRITE:
        {
          char *data = (char*)_DEVCTL_DATA(msg->i);
          uint32_t device = *(uint32_t*)data;
          data += sizeof(device);
          int len = *(int*)data;
          data += sizeof(len);
          void *buf = (void*)data;
        
          msg->o.ret_val = start_hwd_transfer(ocb, device, &ocb->wbuf, len, &ocb->rbuf, len);
        }
        break;

           case DCMD_SPI_XCHANGE:
           {
              char *data = (char*)_DEVCTL_DATA(msg->i);
              uint32_t device = *(uint32_t*)data;
              data += sizeof(device);
              int len = *(int*)data;
              data += sizeof(len);
              void *wbuf = (void*)data;
        
              memset(&msg->o, 0, sizeof(msg->o));
              msg->o.ret_val = start_hwd_transfer(ocb, device, &ocb->wbuf, len, &ocb->rbuf, len);
           }
           break;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/381436.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

聚焦技术前沿 引领行业未来 | 第四届OpenI/O 启智开发者大会深度学习与大模型产业应用专场论坛顺利举办!

为探索人工智能的重要发展方向&#xff0c;深入了解大模型、深度学习领域&#xff0c;推动人工智能的快速发展&#xff0c;2月24日&#xff0c;第四届启智开发者大会以“引领前沿技术&#xff0c;推动产业升级”为主题的“深度学习与大模型产业应用专场”在深圳人才研修院智汇中…

数学知识(算法模板)

数学知识 文章目录数学知识一、质数一、试除法判定质数二、试除法分解质因数三、朴素筛法求素数四、线性筛法求素数二、约数一、试除法求所有约数二、约数个数约数之和三、欧几里得算法三、欧拉函数一、欧拉函数的定义二、筛法求欧拉函数四、快速幂一、快速幂二、快速幂求逆元扩…

Vue中rules表单验证,表单必填*显示位置不对,*显示位置错误

<el-form :model"ruleForm" :rules"rules" ref"ruleForm"><el-form-item label"名称" prop"name"><el-input v-model"ruleForm.name"></el-input></el-form-item> </el-form>…

.NET 使用NLog增强日志输出

引言 不管你是开发单体应用还是微服务应用&#xff0c;在实际的软件的开发、测试和运行阶段&#xff0c;开发者都需要借助日志来定位问题。因此一款好的日志组件将至关重要&#xff0c;在.NET 的开源生态中&#xff0c;目前主要有Serilog、Log4Net和NLog三款优秀的日志组件&…

少儿编程 电子学会图形化编程等级考试Scratch一级真题解析(判断题)2022年12月

2022年12月scratch编程等级考试一级真题 判断题(共10题,每题2分,共20分) 26、可以通过四种方式添加新角色(不包括复制已有角色):选择一个角色、绘制、随机、上传角色 答案:对 考点分析:考查角色添加的方式,角色添加四种方式分别为题目给出的四种,所以正确 27、角…

分布式事务总结

1. 分布式事务产生的背景 1.1 数据库水平拆分 对于大部分的业务而言&#xff0c;在起步阶段&#xff0c;为了快速上线&#xff0c;一般都是单库单表的。但是随着业务的扩张&#xff0c;数据量也随着扩增&#xff0c;单库的性能逐渐变差&#xff0c;就会有数据库的单点压力。因…

大数据常见术语

大数据常见术语一览 主要内容包含以下&#xff08;收藏&#xff0c;转发给你身边的朋友&#xff09; 雪花模型、星型模型和星座模型 事实表 维度表 上钻与下钻 维度退化 数据湖 UV与PV 画像 ETL 机器学习 大数据杀熟 SKU与SPU 即席查询 数据湖 数据中台 ODS&#xff0c;DWD&…

过滤器的创建和执行顺序

过滤器的创建和执行顺序 8.1.1创建并配置过滤器 P143 重点是如何创建并配置&#xff08;xml&#xff09; 1.创建 public class EncodingFilter implements Filter {Overridepublic void init(FilterConfig filterConfig) throws ServletException {}Overridepublic void doFil…

Linux进程间通信:信号量(一)

前提知识 在介绍信号量之前&#xff0c;先来看看一些概念和一些简单的前提知识&#xff1a; 进程间通信的前提是让不同的进程看到同一份资源。于是&#xff0c;就有提出让这种资源成为一种公共资源的方法&#xff0c;方法的提出&#xff0c;导致了一种新的问题的出现&#xf…

MyBatis源码分析(二)SqlSessionFactory的构建及配置文件读取过程

文章目录一、MyBatis配置文件二、SqlSessionFactory的获取1、初始化XML配置的Document以及其他对象2、解析配置文件&#xff08;1&#xff09;配置Environment&#xff08;2&#xff09;存放Mapper&#xff08;3&#xff09;解析Mapper3、构造SqlSessionFactory4、总结未完待续…

测试2年,当初一起入行的朋友很多月薪20k了,自己却还没过万,到底差在了哪里?

说来奇怪&#xff0c;不管是读书还是工作&#xff0c;都存在一个现象&#xff0c;那就是人比人&#xff0c;比死人。读书的时候&#xff0c;不管是老师还是家长口中&#xff0c;总会有一个“别人家的孩子”。同样&#xff0c;到工作中&#xff0c;领导口中总会有一个“别人的员…

Doxygen 详细使用

doxygen的安装和基本使用可参考&#xff1a;Doxygen的安装和基本使用常用选项doxygen的所有选项的参考文档&#xff1a;doxygen官网文档2、样式说明doxygen可以自己自定义样式。手写 .css文件 &#xff08;可以查看doxygen的源码&#xff0c;进行相对应修改&#xff09;在Exper…

推荐一个.Net Core开发的蜘蛛爬虫开源项目

更多开源项目请查看&#xff1a;一个专注推荐.Net开源项目的榜单 如果我们需要抓取网络上的数据&#xff0c;这时候我们就要写爬虫&#xff0c;这里面就涉及到网页的抓取、以及网页分析与数据提取、抓取的性能等知识&#xff0c;今天就给大家推荐一个开源项目&#xff0c;它可以…

java基础复习(练习写博客)

文章目录Java特性和优势java三大版本JDK、JRE、JVM(从前到后包含)Java开发环境搭建步骤Java程序运行机制IDEJava基础语法一、注释、标识符、关键字二、数据类型&#xff08;shift双击问题&#xff09;三、变量、常量、作用域四、运算符五、包机制、JavaDocJava进阶语法一、Scan…

【Java】代码中的安全漏洞解决合集(更新中)

汝之观览&#xff0c;吾之幸也&#xff01;本文主要讲解Java的一些安全漏洞&#xff0c;并且给出浅知的解决方案。 具体国内的风险可查看网址工业和信息化部网络安全威胁和漏洞信息共享平台 1、Spring Framework反射型文件下载漏洞&#xff08;CVE-2020-5421&#xff09; 漏洞…

Linux 进程:fork()与vfork()的对比

目录一、fork函数二、vfork函数1.函数的原理2.函数的隐患3.解决函数隐患的方法在Linux的进程学习中&#xff0c;常使用fork函数来创建子进程&#xff0c;但其实还有一个vfork函数也可以创建子进程。但是这两个函数的实现机制不同&#xff0c;fork函数使用了写实拷贝技术&#x…

Ubuntu 20搭建srs3.0

SRS官网&#xff0c;v3Home介绍&#xff0c;部署帮助。 1.创建一个srs项目文件夹 2.进入后用git命令拉取3.0release版本&#xff1a;git clone -b 3.0release https://gitee.com/ossrs/srs.git 3.进入srs/trunk目录打开终端输入命令&#xff1a;./configure 4.继续输入命令&a…

Python+tkinter添加滚动条

大家好&#xff0c;我是IKUN的真爱粉&#xff0c;有时候我们需要在tkinter上加滚动条&#xff0c;那么怎么制作呢&#xff0c;我们先看下面的视频展示效果&#xff0c;是不是你想要的 展示 感觉制作的略微粗糙&#xff0c;各位可以后期自己慢慢调整 创建滚动条重要的步骤是&a…

【C++进阶】四、STL---set和map的介绍和使用

目录 一、关联式容器 二、键值对 三、树形结构的关联式容器 四、set的介绍及使用 4.1 set的介绍 4.2 set的使用 五、multiset的介绍及使用 六、map的介绍和使用 6.1 map的介绍 6.2 map的使用 七、multimap的介绍和使用 一、关联式容器 前面已经接触过 STL 中的部分…

SAP 详解ST02

问&#xff1a;在st02中看到&#xff0c;Program和Export/Import的Swap出现红的了&#xff0c;这个是什么原因啊&#xff0c;是不是对系统的性能有影响啊&#xff0c;是否应该调整一些参数啊。要怎么调整呢&#xff1f; 复1&#xff1a;双击红色的部分就可以看到相应的参数修改…