SPI的应用领悟
SPI串口协议的工作原理是时钟信号控制移位寄存器的输入输出。主机发送时钟信号(SCLK),控制主机的寄存器和从机寄存器的移位。
最常用的全双工模式是这样工作的:
主机控制片选信号,使能我们要操作的从机。
然后主机写一个数据,写数据的时候,会发送相应的SCLK,同时主机按照SCLK,将寄存器位中的数据一一移位发送出来,从机也按照SCLK将从机寄存器的数据一一移位出来。到最后一个时钟的时候,他们两个寄存器的数据互换了。
如果主机发送数据的时候,从机也会发送数据,从机发送的数据也许并不是有效数据,但是我们去管他干什么呢。我买你将这次的数据放弃就是了。也就是说发送的时候肯定会有接收。要想接收那就必须要发送一个数据(无论是不是有效数据)。换句话讲,从机并不知道自己什么时候要移位发送数据,只是根据SCLK来发送数据。
我们也可以这么理解,因为单片机内部设置的是,发送数据时候才会产生相应的SCLK,这时候从机知道了就会把寄存器中的数据发出来。我们如果自己进行模拟的话,控制单片机或者FPGA发送SCLK就可以将从机的数据读出来,而不用使用主机的发送数据命令。即:SCLK控制和协调一切。
我们以 ADS1298的读取寄存器 这样一个操作为例,主机使用STM32F103。
ADS1298读取寄存器命令是这样的:
我们用单片机控制的话,不能控制SCLK的产生,那我们就用写数据,来产生SCLK,读取后面的REG DATA。至于OPCODE,我们就是直接发送了,为主机的有效数据,就是说前两个发送有效数据,接收到的数据丢弃。第三个发送过程,发送数据随便填写,无效,而接受的数据为有效数据,我们留起来用。
程序是这样子写的:
这是主程序里面的段落。
下面是读写子程序。
1、发送读寄存器的地址
2、发送读寄存器的个数
3、读发回来的数据(如果读寄存器的个数为n,那个就要有n个此条命令)
关于ADS1298,具体的还是要仔细阅读其说明文档。像我自己在做实验的时候,总是无法读取出来正常的命令。通过示波器看到输入线上的数据不对,完全为0.。后来仔细的阅读了其说明文档,发现ADS1298在连续读数据模式下,无法有效实现读寄存器。然后在前面关闭了连续读模式,就能够成功的读取到寄存器的数据了。
留此,以后翻阅。
SPI应用领 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)