找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1881|回复: 6
打印 上一主题 下一主题
收起左侧

SPI读数据函数怎样理解

[复制链接]
跳转到指定楼层
楼主
本帖最后由 zcwjzwd 于 2021-1-31 23:27 编辑

uchar SPI_Read(uchar reg)
{
        uchar reg_val;
        
        CSN = 0;                // CSN low, initialize SPI communication...
        SPI_RW(reg);            // Select register to read from..
        reg_val = SPI_RW(0);    // ..then read register value
        CSN = 1;                // CSN high, terminate SPI communication
        
        return(reg_val);        // return register value
}
reg_val是返回的状态寄存器的值还是其他的值?如果sta=SPI_Read(STATUS);//STATUS为状态寄存器地址。
sta的值有事什么?是返回的状态寄存器的值还是其他的值?


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:752974 发表于 2021-2-1 08:16 | 只看该作者
从哪个寄存器地址读出的数据就是那个寄存器的,这没什么怀疑的吧。
回复

使用道具 举报

板凳
ID:592807 发表于 2021-2-1 08:23 | 只看该作者
寄存器的值,举个例子(这里仅仅是举例子,不涉及任何单片机)
比如一个GPIO口的寄存器(8位)
第1位如果值是1则代表PA^0输出1,反之则输出0
第2位如果值是1则代表PA^1输出1,反之则输出0
第3位如果值是1则代表PA^2输出1,反之则输出0
........................
如果PA^0~PA^7输出全是1,那么你用这个函数之后返回值reg_val = 0xff


如果你想要的查看PA^5的输出值(或者说状态status),那么就要自己转换 out5 = reg_val & (0x01 << 4)
回复

使用道具 举报

地板
ID:226055 发表于 2021-2-1 11:54 | 只看该作者
    1、从你的问题描述来看,你的疑惑不是SPI通信总线。SPI通信是可以模拟SPI和硬件SPI两种方式进行。
    2、不管是硬件SPI还是模拟SPI,你需要知道SPI通信是回环结构,我也是通过艾克姆科技的文档描述搞得比较清楚的。所以,SPI读一个字节的时候必写一个字节才可。




    3、你的疑惑点应该是在你需要操作的SPI的对象上,属于应用层次的。这需要看你操作的对象的技术手册,你分析的状态寄存器返回的是状态值,没有问题,手册上肯定也是这样说的。但至于你写0x00,收到的是什么,这个必须去看操作对象的手册,比如你操作的是一个SPI接口的存储器,则你必须去看这个存储器的芯片手册,这是厂家定义的,和SPI没有关系。




回复

使用道具 举报

5#
ID:875789 发表于 2021-2-1 16:09 | 只看该作者
返回寄存器中的值
回复

使用道具 举报

6#
ID:288629 发表于 2021-2-1 16:11 | 只看该作者
读,写数据最重要的是时序正确就问题不大。严格按时序图来写程序就行的
回复

使用道具 举报

7#
ID:493146 发表于 2021-2-1 19:03 来自手机 | 只看该作者
谢谢各位
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表