标题: SPI读数据函数怎样理解 [打印本页]

作者: zcwjzwd    时间: 2021-1-31 23:26
标题: 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的值有事什么?是返回的状态寄存器的值还是其他的值?



作者: munuc_w    时间: 2021-2-1 08:16
从哪个寄存器地址读出的数据就是那个寄存器的,这没什么怀疑的吧。
作者: 黄youhui    时间: 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)

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




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





作者: Mr_Fu    时间: 2021-2-1 16:09
返回寄存器中的值
作者: wjcxy3166    时间: 2021-2-1 16:11
读,写数据最重要的是时序正确就问题不大。严格按时序图来写程序就行的
作者: zcwjzwd    时间: 2021-2-1 19:03
谢谢各位




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1