SPI采样和输出指主从同时的采样和输出

2023-11-01

SPI总线是Motorola公司推出的三线同步接口,同步串行3线方式进行通信:一条时钟线SCK,一条数据输入线MOSI,一条数据输出线MISO;用于 CPU与各种外围器件进行全双工、同步串行通讯。SPI主要特点有:可以同时发出和接收串行数据;可以当作主机或从机工作;提供频率可编程时钟;发送结束中断标志;写冲突保护;总线竞争保护等。

SPI总线有四种工作方式(SP0, SP1, SP2, SP3),其中使用的最为广泛的是SPI0和SPI3方式。SPI模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。如果CPOL=0,串行同步时钟的空闲状态为低电平;如果CPOL=1,串行同步时钟的空闲状态为高电平。时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。如果 CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。SPI主模块和与之通信的外设音时钟相位和极性应该一致。SPI时序详解---SPI接口在模式0下输出第一位数据的时刻SPI接口有四种不同的数据传输时序,取决于CPOL和CPHL这两位的组合。图1中表现了这四种时序,时序与CPOL、CPHL的关系也可以从图中看出。

图1

CPOL是用来决定SCK时钟信号空闲时的电平,CPOL=0,空闲电平为低电平,CPOL=1时,空闲电平为高电平。CPHA是用来决定采样时刻的,CPHA=0,在每个周期的第一个时钟沿采样,CPHA=1,在每个周期的第二个时钟沿采样。由于我使用的器件工作在模式0这种时序(CPOL=0,CPHA=0),所以将图1简化为图2,只关注模式0的时序。

图2

我们来关注SCK的第一个时钟周期,在时钟的前沿采样数据(上升沿,第一个时钟沿),在时钟的后沿输出数据(下降沿,第二个时钟沿)。首先来看主器件,主器件的输出口(MOSI)输出的数据bit1,在时钟的前沿被从器件采样,那主器件是在何时刻输出bit1的呢?bit1的输出时刻实际上在SCK信号有效以前,比SCK的上升沿还要早半个时钟周期。bit1的输出时刻与SSEL信号没有关系。再来看从器件,主器件的输入口MISO同样是在时钟的前沿采样从器件输出的bit1的,那从器件又是在何时刻输出bit1的呢。从器件是在SSEL信号有效后,立即输出bit1,尽管此时SCK信号还没有起效。

从这张图就可以很清楚的看出主从器件的bit1是怎样输出的

协议举例(百度百科)

SPI是一个环形总线结构,由ss(cs)、sck、sdi、sdo构成,其时序其实很简单,主要是在sck的控制下,两个双向移位寄存器进行数据交换。

假设下面的8位寄存器装的是待发送的数据10101010,上升沿发送、下降沿接收、高位先发送。/*自己理解上升沿对应输出,下降沿对应采集*/

那么第一个上升沿来的时候 数据将会是sdo=1;寄存器中的10101010左移一位,后面补入送来的一位未知数x,成了0101010x。下降沿到来的时候,sdi上的电平将锁存到寄存器中去,那么这时寄存器=0101010sdi,这样在 8个时钟脉冲以后,两个寄存器的内容互相交换一次。这样就完成了一个spi时序。

性能补充

上文中最后一句话:SPI主模块和与之通信的外设备时钟相位和极性应该一致。个人理解这句话有2层意思:其一,主设备SPI时钟和极性的配置应该由外设来决定;其二,二者的配置应该保持一致,即主设备的SDO同从设备的SDO配置一致,主设备的SDI同从设备的SDI配置一致。因为主从设备是在SCLK的控制下,同时发送和接收数据,并通过2个双向移位寄存器来交换数据。工作原理演示如下图:

上升沿主机SDO发送数据1,同时从设备SDO发送数据0;紧接着在SCLK的下降沿的时候从设备的SDI接收到了主机发送过来的数据1,同时主机也接收到了从设备发送过来的数据0。

协议心得

SPI接口时钟配置心得:在主设备这边配置SPI接口时钟的时候一定要弄清楚从设备的时钟要求,因为主设备这边的时钟极性和相位都是以从设备为基准的。因此在时钟极性的配置上一定要搞清楚从设备是在时钟的上升沿还是下降沿接收数据,是在时钟的下降沿还是上升沿输出数据。但要注意的是,由于主设备的SDO连接从设备的SDI,从设备的SDO连接主设备的SDI,从设备SDI接收的数据是主设备的SDO发送过来的,主设备SDI接收的数据是从设备SDO发送过来的,所以主设备这边SPI时钟极性的配置(即SDO的配置)跟从设备的SDI接收数据的极性是相反的,跟从设备SDO发送数据的极性是相同的。下面这段话是Sychip Wlan8100 Module Spec上说的,充分说明了时钟极性是如何配置的:

The 81xx module will always input data bits at the rising edge of the clock,and the host will always output data bits on the falling edge of the clock.

意思是:主设备在时钟的下降沿发送数据,从设备在时钟的上升沿接收数据。因此主设备这边SPI时钟极性应该配置为下降沿有效。

又如,下面这段话是摘自LCD Driver IC SSD1289:

SDI is shifted into 8-bit shift register on every rising edge of SCK in the order of data bit 7,data bit 6 …… data bit 0。

意思是:从设备SSD1289在时钟的上升沿接收数据,而且是按照从高位到低位的顺序接收数据的。因此主设备的SPI时钟极性同样应该配置为下降沿有效。

时钟极性和相位配置正确后,数据才能够被准确的发送和接收。因此应该对照从设备的SPI接口时序或者Spec文档说明来正确配置主设备的时钟。

举例

假设主机和从机初始化就绪:并且主机的sbuff=0xaa,从机的sbuff=0x55,下面将分步对spi的8个时钟周期的数据情况演示一遍:假设上升沿发送数据

脉冲主机sbuff 从机sbuff sdi sdo

0 10101010 01010101 0 0

1上 0101010x 1010101x 0 1

1下 01010100 10101011 0 1

2上 1010100x 0101011x 1 0

2下 10101001 01010110 1 0

3上 0101001x 1010110x 0 1

3下 01010010 10101101 0 1

4上 1010010x 0101101x 1 0

4下 10100101 01011010 1 0

5上 0100101x 1011010x 0 1

5下 01001010 10110101 0 1

6上 1001010x 0110101x 1 0

6下 10010101 01101010 1 0

7上 0010101x 1101010x 0 1

7下 00101010 11010101 0 1

8上 0101010x 1010101x 1 0

8下 01010101 10101010 1 0

这样就完成了两个寄存器8位的交换,上面的上表示上升沿、下表示下降沿,sdi、sdo相对于主机而言的。其中ss引脚作为主机的时候,从机可以把它拉底被动选为从机,作为从机的是时候,可以作为片选脚用。根据以上分析,一个完整的传送周期是16位,即两个字节,因为,首先主机要发送命令过去,然后从机根据主机的命令准备数据,主机在下一个8位时钟周期才把数据读回来。SPI总线是Motorola公司推出的三线同步接口,同步串行3线方式进行通信:一条时钟线SCK,一条数据输入线MISO,一条数据输出线MOSI;用于CPU与各种外围器件进行全双工、同步串行通讯。SPI主要特点有:可以同时发出和接收串行数据;可以当作主机或从机工作;提供频率可编程时钟;发送结束 中断标志;写冲突保护;总线竞争保护等。下图示出SPI总线工作的四种方式,其中使用的最为广泛的是SPI0和SPI3方式 (实线表示):

SPI总线四种工作方式 SPI 模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。如果 CPOL=0,串行同步时钟的空闲状态为低电平;如果CPOL=1,串行同步时钟的空闲状态为高电平。时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。SPI主模块和与之通信的外设备时钟相位和极性应该一致。

 

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weiqifa0/article/details/82765892
1.SPI协议简介
1.1.SPI协议概括
  SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议,比如AT91RM9200.

SPI主从模式硬件连接如下图


  SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共有的,它们是SDI(数据输入),SDO(数据输出),SCK(时钟),CS(片选)。

SDO     – 主设备数据输出,从设备数据输入 对应MOSI master output slave input
SDI      – 主设备数据输入,从设备数据输出  对应MISO master input slave output
SCLK   – 时钟信号,由主设备产生
CS        – 从设备使能信号,由主设备控制
  CS: 其中CS是控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),对此芯片的操作才有效,这就允许在同一总线上连接多个SPI设备成为可能。

  SDI/SDO/SCLK: 通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。这就是SCK时钟线存在的原因,由SCK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。数据输出通过 SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使用同样原理。这样,在至少8次时钟信号的改变(上沿和下沿为一次),就可以完成8位数据的传输。

  要注意的是,SCK信号线只由主设备控制,从设备不能控制信号线。同样,在一个基于SPI的设备中,至少有一个主控设备。

这样传输的特点:这样的传输方式有一个优点,与普通的串行通讯不同,普通的串行通讯一次连续传送至少8位数据,而SPI允许数据一位一位的传送,甚至允许暂停,因为SCK时钟线由主控设备控制,当没有时钟跳变时,从设备不采集或传送数据,也就是说,主设备通过对SCK时钟线的控制可以完成对通讯的控制。SPI还是一个数据交换协议:因为SPI的数据输入和输出线独立,所以允许同时完成数据的输入和输出。不同的SPI设备的实现方式不尽相同,主要是数据改变和采集的时间不同,在时钟信号上沿或下沿采集有不同定义,具体请参考相关器件的文档。

在点对点的通信中,SPI接口不需要进行寻址操作,且为全双工通信,显得简单高效。在多个从设备的系统中,每个从设备需要独立的使能信号,硬件上比I2C系统要稍微复杂一些。

最后,SPI接口的一个缺点:没有指定的流控制,没有应答机制确认是否接收到数据。

AT91RM9200的SPI接口主要由4个引脚构成:SPICLK、MOSI、MISO及 /SS,其中SPICLK是整个SPI总线的公用时钟,MOSI、MISO作为主机,从机的输入输出的标志,MOSI是主机的输出,从机的输入,MISO 是主机的输入,从机的输出。/SS是从机的标志管脚,在互相通信的两个SPI总线的器件,/SS管脚的电平低的是从机,相反/SS管脚的电平高的是主机。在一个SPI通信系统中,必须有主机。SPI总线可以配置成单主单从,单主多从,互为主从。

SPI的片选可以扩充选择16个外设,这时PCS输出=NPCS,说NPCS0~3接4-16译码器,这个译码器是需要外接4-16译码器,译码器的输入为NPCS0~3,输出用于16个外设的选择。

2.协议举例
如下图,是SPI的简单收发时序图。

SPI是一个环形总线结构,由ss(cs)、sck、sdi、sdo构成,其时序其实很简单,主要是在sck的控制下,两个双向移位寄存器进行数据交换。
       假设下面的8位寄存器装的是待发送的数据10101010,上升沿发送、下降沿接收、高位先发送。
       那么第一个上升沿来的时候 数据将会是sdo=1;寄存器=0101010x。下降沿到来的时候,sdi上的电平将锁存到寄存器中去,那么这时寄存器=0101010sdi,这样在 8个时钟脉冲以后,两个寄存器的内容互相交换一次。这样就完成里一个spi时序。 

举例: 
       假设主机和从机初始化就绪:并且主机的sbuff=0xaa,从机的sbuff=0x55,下面将分步对spi的8个时钟周期的数据情况演示一遍:假设上升沿发送数据

这样就完成了两个寄存器8位的交换,上面的上表示上升沿、下表示下降沿,sdi、sdo相对于主机而言的。其中ss引脚作为主机的时候,从机可以把它拉底被动选为从机,作为从机的是时候,可以作为片选脚用。根据以上分析,一个完整的传送周期是16位,即两个字节,因为,首先主机要发送命令过去,然后从机根据主机的命令准备数据,主机在下一个8位时钟周期才把数据读回来。

     

  SPI 总线是Motorola公司推出的三线同步接口,同步串行3线方式进行通信:一条时钟线SCK,一条数据输入线MOSI,一条数据输出线MISO;用于CPU与各种外围器件进行全双工、同步串行通讯。SPI主要特点有:可以同时发出和接收串行数据;可以当作主机或从机工作;提供频率可编程时钟;发送结束 中断标志;写冲突保护;总线竞争保护等。下图示出SPI总线工作的四种方式,其中使用的最为广泛的是SPI0和SPI3方式 (实线表示):                  

                                                    

3. SPI总线四种工作方式
SPI 模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。

       时序详解:

  CPOL:时钟极性选择,为0时SPI总线空闲为低电平,为1时SPI总线空闲为高电平

  CPHA:时钟相位选择,为0时在SCK第一个跳变沿采样,为1时在SCK第二个跳变沿采样

  工作方式1:

  当CPHA=0、CPOL=0时SPI总线工作在方式1。MISO引脚上的数据在第一个SPSCK沿跳变之前已经上线了,而为了保证正确传输,MOSI引脚的MSB位必须与SPSCK的第一个边沿同步,在SPI传输过程中,首先将数据上线,然后在同步时钟信号的上升沿时,SPI的接收方捕捉位信号,在时钟信号的一个周期结束时(下降沿),下一位数据信号上线,再重复上述过程,直到一个字节的8位信号传输结束。

  工作方式2:

  当CPHA=0、CPOL=1时SPI总线工作在方式2。与前者唯一不同之处只是在同步时钟信号的下降沿时捕捉位信号,上升沿时下一位数据上线。

  工作方式3:

  当CPHA=1、CPOL=0时SPI总线工作在方式3。MISO引脚和MOSI引脚上的数据的MSB位必须与SPSCK的第一个边沿同步,在SPI传输过程中,在同步时钟信号周期开始时(上升沿)数据上线,然后在同步时钟信号的下降沿时,SPI的接收方捕捉位信号,在时钟信号的一个周期结束时(上升沿),下一位数据信号上线,再重复上述过程,直到一个字节的8位信号传输结束。

  工作方式4:

  当CPHA=1、CPOL=1时SPI总线工作在方式4。与前者唯一不同之处只是在同步时钟信号的上升沿时捕捉位信号,下降沿时下一位数据上线。

4种工作模式波形时序如下图:

4.协议心得
SPI接口时钟配置心得:

  在主设备这边配置SPI接口时钟的时候一定要弄清楚从设备的时钟要求,因为主设备这边的时钟极性和相位都是以从设备为基准的。因此在时钟极性的配置上一定要搞清楚从设备是在时钟的上升沿还是下降沿接收数据,是在时钟的下降沿还是上升沿输出数据。但要注意的是,由于主设备的SDO连接从设备的SDI,从设备的SDO连接主设备的SDI,从设备SDI接收的数据是主设备的SDO发送过来的,主设备SDI接收的数据是从设备SDO发送过来的,所以主设备这边SPI时钟极性的配置(即SDO的配置)跟从设备的SDI接收数据的极性是相反的,跟从设备SDO发送数据的极性是相同的。下面这段话是Sychip Wlan8100 Module Spec上说的,充分说明了时钟极性是如何配置的:

The 81xx module will always input data bits at the rising edge of the clock, and the host will always output data bits on the falling edge of the clock.

意思是:主设备在时钟的下降沿发送数据,从设备在时钟的上升沿接收数据。因此主设备这边SPI时钟极性应该配置为下降沿有效。

又如,下面这段话是摘自LCD Driver IC SSD1289:

SDI is shifted into 8-bit shift register on every rising edge of SCK in the order of data bit 7, data bit 6 …… data bit 0.

意思是:从设备SSD1289在时钟的上升沿接收数据,而且是按照从高位到地位的顺序接收数据的。因此主设备的SPI时钟极性同样应该配置为下降沿有效。

时钟极性和相位配置正确后,数据才能够被准确的发送和接收, 因此应该对照从设备的SPI接口时序或者Spec文档说明来正确配置主设备的时钟。

5.SPI协议软件模拟
5.1.单片机软件模拟SPI接口—加深理解SPI总线协议
        现以 AT89C205l单片机模拟SPI总线操作串行EEPROM 93CA6为例,如图1所示,介绍利用单片机的I/O口通过软件模拟SPI总线的实现方法。在这里,仅介绍读命令的时序和应用子程序。 

5.2.93C46存储器SPI总线的工作原理
          93CA6作为从设备,其SPI接口使用4条I/O口线:串行时钟线(SK)、输出数据线DO、输入数据线DI和高电平有效的从机选择线CS。其数据的传输格式是高位(MSB)在前,低位(LsB)在后。93C46的SPI总线接口读命令时序如图2所示。 

5.3.软件模拟SPI接口的实现方法 
          对于不带SPI串行总线接口的AT89C2051单片 机来说,可以使用软件来模拟SPI的操作,图1所示 为AT89C2051单片机与串行EEPROM 93C46的硬件 连接图,其中,P1.0模拟SPI主设备的数据输出端 SDO,P1.2模拟SPI的时钟输出端SCK,P1.3模拟 SPI的从机选择端SCS,P1.1模拟SPI的数据输入 SDI。
         上电复位后首先先将P1.2(SCK)的初始状态设置为0(空闲状态)。
         读操作:AT89C2051首先通过P1.0口发送1位起始位(1),2位操作码(10),6位被读的数据地址(A5A4A3A2A1A0),然后通过P1.1口读1位空位(0),之后再读l6位数据(高位在前)。
         写操作:AT89C2051首先通过P1.0口发送1位起始位(1),2位操作码(01),6位被写的数据地址(A5A4A3A2A1A0),之后通过P1.0口发送被写的l6位数据(高位在前),写操作之前要发送写允许命令,写之后要发送写禁止命令。
         写允许操作(WEN)):写操作首先发送1位起始位(1),2位操作码(00),6位数据(11XXXX)。              

         写禁止操作(WDS)):写操作首先发送1位起始位(1),2位操作码(00),6位数据(00XXXX)。

        下面介绍用C51模拟SPI的子程序。

/*例子1*/
//首先定义好I/O口
sbit SDO=P1^0;
sbit SDI=P1^1;
sbit SCK=P1^ 2;
sbit SCS=P1^3;
sbit ACC_7= ACC^7;
unsigned int SpiRead(unsigned char add)
{
    unsigned char i;
    unsigned int datal6;
    add&=0x3f;/*6位地址*/
    add |=0x80;/*读操作码l0*/
    SDO=1;/*发送1为起始位*/
    SCK=0;
    SCK=1;
    for(i=0;<8;i++)/*发送操作码和地址*/
    {
        if(add&0x80==1)
            SDO=1;
        else 
            SDO=0;
        SCK=0;/*从设备上升沿接收数据*/
        SCK=1;
        add<<= 1;
    }
    SCK=1;/*从设备时钟线下降沿后发送数据,空读1位数据*/
    SCK=0;
    datal6<<= 1;/*读16位数据*/
    for(i=0;<16;i++)
    {
        SCK= 1;
        _nop_();
        if(SDI==1)
            datal6|=0x01;
        SCK =0;
        datal6< < =1;
    }
    return datal6;
}
    
/*例子2*/
    #define SS      252                     //定义SS所对应的GPIO接口编号  
    #define SCLK    253                     //定义SCLK所对应的GPIO接口编号  
    #define MOSI    254                     //定义SCLK所对应的GPIO接口编号  
    #define MISO    255                     //定义MISO所对应的GPIO接口编号  
    #define OUTP    1                       //表示GPIO接口方向为输出  
    #define INP 0                           //表示GPIO接口方向为输入  
    
    /* SPI端口初始化 */  
    void spi_init()  
    {  
        set_gpio_direction(SS, OUTP);  
        set_gpio_direction(SCLK, OUTP);  
        set_gpio_direction(MOSI, OUTP);  
        set_gpio_direction(MISO, INP);  
        set_gpio_value(SCLK, 0);//CPOL=0 
        set_gpio_value(MOSI, 0);
    }  
    /*  
    从设备使能  
    enable:为1时,使能信号有效,SS低电平  
    为0时,使能信号无效,SS高电平  
    */  
    void ss_enable(int enable)  
    {  
        if (enable)  
            set_gpio_value(SS, 0);//SS低电平,从设备使能有效  
        else  
            set_gpio_value(SS, 1);//SS高电平,从设备使能无效  
    }  
    
    /* SPI字节写 */  
    void spi_write_byte(unsigned char b)  
    {  
        int i;  
        for (i=7; i>=0; i--) {  
            set_gpio_value(SCLK, 0);  
            set_gpio_value(MOSI, b&(1<<i));//从高位7到低位0进行串行写入  
            delay();//延时  
            set_gpio_value(SCLK, 1);// CPHA=1,在时钟的第一个跳变沿采样  
            delay();      
        }  
    }  
    /* SPI字节读 */  
    unsigned char spi_read_byte()  
    {  
        int i;  
        unsigned char r = 0;  
        for (i=0; i<8; i++) {  
            set_gpio_value(SCLK, 0);  
            delay();//延时  
            set_gpio_value(SCLK, 1);// CPHA=1,在时钟的第一个跳变沿采样  
            r = (r <<1) | get_gpio_value(MISO);//从高位7到低位0进行串行读出  
            delay();  
        }  
    }  
    /*  
        SPI写操作  
        buf:写缓冲区  
        len:写入字节的长度  
    */  
    void spi_write (unsigned char* buf, int len)  
    {  
        int i;  
        spi_init();//初始化GPIO接口  
        ss_enable(1);//从设备使能有效,通信开始  
        delay();//延时  
        //写入数据  
        for (i=0; i<len; i++)
            spi_write_byte(buf[i]);
        delay();
        ss_enable(0);//从设备使能无效,通信结束  
    }  
    /*  
    SPI读操作  
    buf:读缓冲区  
    len:读入字节的长度  
    */  
    void spi_read(unsigned char* buf, int len)  
    {  
        int i;  
        spi_init();//初始化GPIO接口  
        ss_enable(1);//从设备使能有效,通信开始  
        delay();//延时  
        //读入数据
        for (i=0; i<len; i++)
            buf[i] = spi_read_byte();
        delay();
        ss_enable(0);//从设备使能无效,通信结束  
    }
  对于不同的串行接口外围芯片,它们的时钟时序是不同的。上述子程序是针对在SCK的上升沿输入(接收)数据和在下降沿输出(发送)数据的器件。这些子程序也适用于在串行时钟)的上升沿输入和下降沿输出的其它各种串行外围接口芯片,只要在程序中改变P1.2(SCK)的输出电平顺序进行相应调整即可。

 

6. Linux下的SPI源码
链接:https://pan.baidu.com/s/1Jm_gDxj-to965ZH3I16dug 密码:c9ki
 ———————————————— 
版权声明:本文为CSDN博主「写代码的篮球球痴」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weiqifa0/article/details/82765892

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

SPI采样和输出指主从同时的采样和输出 的相关文章

  • 追根究底,剖析MFC六大关键技术(1)

    题外话 我并不认为MFC减轻了程序员们的负担 MFC出现的目的虽然似乎是为了让程序员不用懂得太多就可以进行视窗编程 但本人在MFC里徘徊了很久很久 因为那时没有书本详细介绍MFC的原理 毫无收获 可能朋友们会说 怎么一定要了解MFC的具体呢
  • 适合儿童学习的编程语言一览

    近两年我们常常会看到如下新闻 4 5岁的就能具备独立开发APP的能力 6 7岁的孩子甚至可以设计出可以上线的小游戏 在我们感慨小朋友们出色的编程能力的同时 不难发现编程已从边缘学科逐渐被大家重视 编程普及率不断提升 而且逐渐呈现出低龄化发展
  • HTML5编程简介及示例代码

    HTML5是一种用于构建网页和Web应用程序的标准 它引入了许多新的元素 属性和API 为开发者提供了更多的功能和灵活性 在本文中 我们将探讨HTML5编程的一些不同方面 并提供相应的示例代码 标题 Headings HTML5引入了新的标
  • 优秀网站源码、编程源码下载网站大集中

    摘自http topic csdn net u 20080501 12 0a9bc720 0bb1 42b0 98bc da9783782d09 html 优秀网站源码 编程源码下载网站大集中 1 51源码 http www 51aspx
  • 经典问题(20)天平与砝码问题

    题目 如果有砝码序列 1 3 9 27 81 243 729 我们至少可以称量1000以内的所有整数重量 比如 5 9 3 1 即 9 放入对侧盘 3 1 放入同侧盘 再比如 19 27 9 1 编程的目标是 给定一个重量 求 天平称重时
  • 程序员水平分级

    导读 近日 whattofix com刊登了一篇 DanielMarkham的文章 What Level Programmer Are You 文内将参差不齐的程序员按照技术水平分为从 只读 到 上帝 共十一个阶段 以帮助广大程序员找到自身
  • 阿里老哥独家珍藏的Java面试突击宝典,轻松应对95%秋招面试题

    临近秋招 想必有不少老哥已经在为面试做准备了 大家想必也知道现在面试就是看项目经验 基本技术 个人潜力 也就是值不值得培养 总之就是每一次面试都是对我们能力的检验 无论是软实力还是硬实力 软实力其实就是简历包装 自我介绍 与面试官交谈技巧等
  • LabVIEW 读写和缩放音频文件

    LabVIEW 提供了多种方式来读取和写入 WAV 格式的音频文件 完成本模块后 您将能够使用位于 Programming Graphics Sound Sound Files 中的 Simple Read 和 Simple Write 用
  • 12款最常使用的网络爬虫工具推荐

    网络爬虫在当今的许多领域得到广泛应用 它的作用是从任何网站获取特定的或更新的数据并存储下来 网络爬虫工具越来越为人所熟知 因为网络爬虫简化并自动化了整个爬取过程 使每个人都可以轻松访问网站数据资源 使用网络爬虫工具可以让人们免于重复打字或复
  • MFC多线程编程之一——问题提出

    原文地址 http www vckbase com document viewdoc id 1704 一 问题的提出 编写一个耗时的单线程程序 新建一个基于对话框的应用程序SingleThread 在主对话框IDD SINGLETHREAD
  • C#初始化数组的三种方式

    C 声明数组并初始化 有三种方式 对于一维数组 using System using System Data using System Configuration using System Web using System Web Secu
  • 【CSDN】删除文章后,浏览量会减少吗?了解软删除和硬删除

    hello 我是小索奇 如果你也在博客写作的话 有没有考虑到一个问题 文章删除后 浏览量会减少吗 下面就给大家阐述一下 当在CSDN中删除已发布的文章后 该文章的浏览量统计会有以下情况 软删除状态的文章 浏览量统计会保留 不会下降或者重置
  • java 字符串拼接

    最常用的有4种方法 运算符 如果拼接的都是字符串直接量 则适合使用 运算符实现拼接 public static void main String args method1 字符串拼接 public static void method1 S
  • QT编程----事件

    QT程序设计进阶 事件 Qt事件 Qt程序是事件驱动的 程序的每个动作都是由幕后某个事件所触发 Qt事件的类型很多 常见的qt的事件如下 键盘事件 按键按下和松开 鼠标事件 鼠标移动 鼠标按键的按下和松开 拖放事件 用鼠标进行拖放 滚轮事件
  • 《OpenGL编程指南》示例笔记(2)--独立地移动光源

    TITLE OpenGL编程指南 示例笔记 2 独立地移动光源 AUTHOR norains DATE Monday 21 June 2010 Environment Windows XP 示例概述 例名 独立地移动光源 序号 5 6 页码
  • KMP比较简单的讲法。

    转载链接 http blog csdn net yearn520 article details 6729426 我们在一个母字符串中查找一个子字符串有很多方法 KMP是一种最常见的改进算法 它可以在匹配过程中失配的情况下 有效地多往后面跳
  • Matlab中文注释在Linux中乱码解决

    Linux for Matlab中文注释乱码 Linux for Matlab中文注释乱码 亲测有效 中文注释乱码的原因是windows下的m文件采用的是gbk编码 只要将所有的m文件转成 utf8文件 显示就正常了 查看支持的语言 enc
  • 使用Draw.io制作泳道图

    使用Draw io制作泳道图 一 横向泳道图 1 有标题泳道图 2 无标题泳道图 3 横纵向扩展泳道 二 纵向泳道图
  • Linux值得学习吗?打工人利用业务时间学习Linux需要多长时间?

    nbsp Linux值得学习吗 打工人利用业务时间学习Linux需要多长时间 在开始前我有一些资料 是我根据自己从业十年经验 熬夜搞了几个通宵 精心整理了一份 Linux的资料从专业入门到高级教程 工具包 点个关注 全部无偿共享给大家 在评
  • Java语言真的跌落神坛了吗?

    Java语言真的跌落神坛了吗 在开始前我有一些资料 是我根据自己从业十年经验 熬夜搞了几个通宵 精心整理了一份 Java的资料从专业入门到高级教程 工具包 点个关注 全部无偿共享给大家 在评论区回复 888 之后私信回复 888 即可拿走

随机推荐

  • shell脚本中的if语句与case语句

    一 if语句 if语句从上至下按照顺序依次判定执行 格式如下 if 判定条件 如果 then 那么 elif 重新的一次判定 又如果 then 那么 else 否则 可以添加也可以不加 fi 结尾 倒写 注意 其中的elif不限个数 可以多
  • new与默认构造函数

    class A public A int i int 0 private int a b class B public 无需构造函数 因为数据成员的全部为public int a b c int main A a 3 B b 1 2 3 A
  • Python之selenium,使用webdriver模拟登录网站(含验证码)

    文章目录 一 前言 二 准备工作 三 模拟登陆网站 1 加载驱动和配置 2 打开网站 3 寻找元素并填入账号密码 4 填写验证码 四 遇到的一些坑 五 后记 一 前言 这段时间做了一个小项目 其中有一段需要自动获取网站后台的数据 但是这个网
  • 如何扩展mvc的消息转换器?

    问题 在服务端向客户端传输id时 由于是采用雪花算法 id长度足有19位之多 于是js接收时就产生了精度丢失问题 那么我们就需要扩展mvc的消息转换器来使后台传向前台的数据格式化为我们想要的格式 自定义消息转换器 public class
  • LaTex创建四级目录

    默认情况下 目录的深度是3级 也就是说 对于 ctexart article 文类 只对 section subsection subsubsection 编目 如果你的文档结构用到了 paragraph 一级 那么它将不会被编入目录中 但
  • Qt5类之QLine and QLineF

    QLine include
  • 成功解决 /bin/sh: 1: source: not found

    执行下列语句报错 解决办法 在命令行输入 exec bash 或直接输入bash 如下图 便可成功使用source命令
  • C++ 开发 Web 服务框架 - HTTP Web 框架的设计与实现(二)

    C 开发 Web 服务框架 HTTP Web 框架的设计与实现 一 概述 项目介绍 服务器开发中 Web 服务是一个基本的代码单元 将服务端的请求和响应部分的逻辑抽象出来形成框架 能够做到最高级别的框架级代码复用 本次项目将综合使用 C 1
  • 【unity】角色动画的 Has Exit Time是什么?什么时候需要打钩?

    场景 在动画的状态机Animator中的Transitions中总能看到Has Exit Time这个选项 到底是否勾选 探究 Has Exit Time 我的理解翻译过来是 是否有一个结束的时间 如果不勾选的话 就是没有结束的反应时间 那
  • 什么是IOC(控制反转),IOC的原理

    什么是控制反转 控制反转也可以理解为创建对象权利的交接 我们在获取对象时 都是采用 new 的方式 是主动的 现在 我们获取对象时 同时跟工厂要 由工厂为我们查找或者创建对象 是被动的 IOC的原理 IOC是通过反射 工厂 容器来完成了对象
  • Win11安装wsl2及深度学习环境配置(Win10应该类似)

    一 wsl2 Ubuntu安装 参考教程 https blog csdn net qq 36622589 article details 123402704 我是从第3步开始的 做到第9步结束就行 图形化我装了 但如果要安装pycharm专
  • Java学习之IDEA环境搭建

    Java学习之IDEA环境搭建 序言 PicGO的Gitee图床设置 owner QMei repo BlogHome path 环境搭建 IDEA环境搭建 同步 2020 11 1 IDEA 版本 Ultimate 2020 2 搜索功能
  • (ros/navigation/slam_gmapping) map_server地图服务器

    http wiki ros org map server 概述 map server提供map server ROS节点 它提供地图数据作为一个ROS服务器 也提供map saver命令行功能 能动态生成保存到文件中的地图 地图格式 包中通
  • leetcode872. 叶子相似的树(java)

    叶子相似的树 题目描述 递归 题目描述 难度 简单 leetcode 872 叶子相似的树 请考虑一棵二叉树上所有的叶子 这些叶子的值按从左到右的顺序排列形成一个 叶值序列 举个例子 如上图所示 给定一棵叶值序列为 6 7 4 9 8 的树
  • QT注册界面练习(信号与槽实现页面跳转)

    一 注册界面练习思路以及具体代码 在完成注册页面搭建的前提下 通过信号与槽机制实现多组件之间的相互通信 实现页面跳转 基本步骤 首先 将注册页面的登录按钮与成功登陆信号绑定 当用户名与密码均匹配时 关闭注册页面 发送跳转信号 其次 在成功登
  • 10款强大的开源 Javascript 图表库

    1 ECharts ECharts 由百度前端技术部开发的 是一个纯 Javascript 的图表库 可以流畅的运行在 PC 和移动设备上 兼容当前绝大部分浏览器 IE8 9 10 11 Chrome Firefox Safari等 底层依
  • 网络安全入门学习第九课——计算机网络基础

    文章目录 一 网路通信三要素 1 IP地址 互联网协议地址 分为公网地址和私有地址 1 1 公网地址的范围 1 2 私网地址的范围 2 端口 2 1 周知端口 2 2 注册端口 2 3 动态端口 3 协议 二 两个终端间通信的五大要素 三
  • vs 引用动态链接库

    1 添加头文件目录 工程 属性 配置属性 c c 常规 附加包含目录 加入头文件所在目录 2 添加静态库目录 工程 属性 配置属性 连接器 常规 附加库目录 加入lib文件所在目录 3 添加lib文件名 工程 属性 配置属性 连接器 输入
  • 浅谈电源芯片选型之低功耗

    浅谈电源芯片选型之低功耗 硬件电路设计中电源芯片选型必不可少 电源芯片选型的好坏关系到系统的稳定性 电源的转换效率等等 在低功耗产品设计中 更关系到系统睡眠或者低功耗模式时的系统总的耗电情况 低功耗产品设计中 电源芯片选型 暂时以LDO电源
  • SPI采样和输出指主从同时的采样和输出

    SPI总线是Motorola公司推出的三线同步接口 同步串行3线方式进行通信 一条时钟线SCK 一条数据输入线MOSI 一条数据输出线MISO 用于 CPU与各种外围器件进行全双工 同步串行通讯 SPI主要特点有 可以同时发出和接收串行数据