SPI通信

SPI传输更快,设计简单,但硬件开销大,通信可能会造成浪费。(同步时序:同一时钟信号数据位的输入输出都是在SCK的上升沿和下降沿进行的,全双工:可以在输入时进行输出,数据发送和数据接收各占一条线)

SCK(CK):串行时钟线---提供时钟信号-完全主机掌握主机一定位输出从机为输入

MOSI接MOSI:主机MO输出--------对应DI(从机输入)

MISO接MISO:主机MI输入--------对应DO(从机输出)

SS(NSS、CS):从机选择(有几个从机有几根SS线)选择时通信置从机为低电平,一次一机

数据移位

移位过程,在波特率发生器发出信号,处于上升沿时主机与从机均发送数据到对应寄存器,之后下降沿,主从机均进行数据采样输入操作,主机输出的数据进入从机低位,从机输出的数据进入主机低位,顺次交换八次,完成主从机一个字节的数据交换。若只发送不接收或相反仍然遵守此顺序,仅仅是发送0XFF等数据进行交换,但是对应对象不读取即可。

时序

即在通信过程中,选中后从机SS接口一直置低电平到结束对应通信。

模式0

模式1

区别在于数据移入移出时间不同,模式0提前移出数据

CPHA表示时钟相位决定第一个时钟采样移入,还是第二个时钟采样移入。等于一时第二个时钟为0时第一个时钟。在CPOL确定的情况下,模式0是上升沿采样移入,模式一是下降沿采样移入

CPOL:时钟极性其英文精简解释为:Clock Polarity = IDLE state of SCK。
SPI的CPOL,表示当SCLK空闲idle的时候,其电平的值是低电平0还是高电平1:

SCLK时钟的空闲时刻,其就是当SCLK在发送8个bit比特数据之前和之后的状态,于此对应的,SCLK在发送数据的时候,就是正常的工作的时候,有效active的时刻了(CSS低电平)。

CPOL=0,时钟空闲idle时候的电平是低电平,所以当SCLK有效的时候,就是高电平,就是所谓的active-high;
CPOL=1,时钟空闲idle时候的电平是高电平,所以当SCLK有效的时候,就是低电平,就是所谓的active-low;

应用过程,发送对应指令,发送对应地址,发送对应数据。SCK上升沿进行数据采样,下降沿数据移出。

补FLASH的操作

硬件SPI和软件SPI区别

🍏软件SPI:用IO模拟SPI时序,这个模拟过程全部是CPU在负责执行,为了其稳定的存取数据,你可能会插入软件延时,这个时间在读取数据量不大的情况下并不明显,但是基本上你在读取过程中,其他非中断非异常程序是无法得到执行。


🍎硬件SPI:首先这个数据存道储的过程是不需要CPU参与得,程序中配置好SPI的访问时序,开启中断,CPU就可以在中断函数中搬移数据,省下了软件模拟IO得存取时间。
仔细研究就会发现,CPU在进行SPI中断服务程序还版是需要耽误时间得,这个过程在大数据量传输中还是很耗时,

        ARM中Cortex-M3内核得处理器在硬件SPI上加入了DMA,这个DMA直接从SPI的数据寄存器,软件配置好DMA之后,基本上整个传输都不要权CPU参与,软件设计得好的话,整个数据传输都不要CPU参与,此时CPU就可以做更多其他有意义的事了。

使用时:硬件SPI的效率要比软件模拟SPI高,写程序的时候只要把要发的数据写在寄存器里,硬件就会自动给你发了,软件模拟SPI则需要器实现时钟的拉高拉低,数据串行输出等等。硬件SPI必须要处理器支持才可以用,软件SPI就不需要特定的要求了,一般IO口就可用。只需要查STM32相应单片机对应型号引脚定义图,内找对应引脚有无SPI功能即可。

软件模拟SPI通信

过程步骤

1、新建工程

2、新建SPI模块:包括通信引脚封装、初始化、spi三拼图----起始、终止、交换一个字节。

3、硬件驱动模块:基于SPI模块建立对应外设的模块,借用底层SPI拼图,来拼接各种指令和功能的完整时序,如写使能,擦除,页编程,读数据等。

4、主函数:调用驱动层函数完成功能

知识点补充:

1)掩码:挑出数据的某一位或某几位,用来屏蔽其他的无关位,如下图0x80>>i

//uint8_t MYSPI_SwapByte(uint8_t ByteSend)//交换字节一般选模式0,先SS或SCK下降沿,再数据移出(主机移出最高位数据放在MOSI上,从机移出最高位放在MISO上),SCK上升沿,再移入数据。顺次执行

//{
//    uint8_t i, ByteReceive=0x00;//用于接收的返回值
//    for (i=0;i<8;i++)
//    {
//        MYSPI_W_MOSI(ByteSend & 0x80);//保留最高数据位
//        ByteSend<<=1;
//    if (MYSPI_R_MISO()==1)
//    {ByteSend|=0x01;}//
//    MYSPI_W_SCK(0);//主机产生下降沿从机自动移出数据
//    }
//    前一种方法用掩码一次提取数据中的每一位,不会改变传入参数本身可以继续使用原Bytesend
//    第二种用移位数据本身进行操作
//    return ByteReceive;
//}

  • 24
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_56858860

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值