软件模拟SPI

这篇具有很好参考价值的文章主要介绍了软件模拟SPI。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、SPI简介

二、移位示意图(重点)

三、SPI时序(重点)

1.模式0

2.模式1

3.模式2

4.模式3

四、软件代码模拟(模式0)


一、SPI简介

       SPI 协议是由摩托罗拉公司提出的通讯协议(Serial Peripheral Interface),串行外围设备接口,允许芯片与外部设备以半/全双工、同步、串行方式通信。此接口可以被配置成主模式,并为外部从设备提供通信时钟(SCK)。它被广泛地使用在 ADC、LCD 等设备与MCU间,要求通讯速率较高的场合。

1.四根通信线:SCK(时钟)、MOSI(主设备输出从设备输入)、MISO(主设备输入从设备输出)、SS(片选)

2.同步、全双工 接收数据线和发送数据线可同时工作

3.支持总线挂载多个设备,实现一主多从模式

4.所有SPI设备的SCK、MOSI、MISO、SS分别连在一起,主机另外引出多条SS控制线,分别接到各从机SS引脚

5.输出引脚配置为推挽输出,输入引脚配置为浮空输入

      主机挂载多个从机设备接线图,时钟线都是连接在一起,片选线SS分别接在不同设备上MOSI和MISO交叉连接,电源的VCC和GND和主设备连接在一起,VCC也可以单独供电,但是GND一定要接在一起,这样才有个参照

模拟spi,单片机,嵌入式硬件

主机挂载多个从机示意图 

二、移位示意图(重点)

       主机和从机都有一个8位的移位寄存器,移位寄存器下面有一个时钟输入端,SPI一般都是高位先行,所以每来一个时钟,主机的移位寄存器都会向左移动一位,同理从机也是一样。主机移位寄存器左移出去的数据通过MOSI引脚输入到从机移位寄存器的右边,从机移位寄存器左边移出去的数据通过MISO引脚输入到主机移位寄存器的右边,这个就是SPI的内部基本工作原理。也就是,主机发送一个字节数据的同时也接收了一个字节数据

模拟spi,单片机,嵌入式硬件

 移位示意图

三、SPI时序(重点)

起始条件:SS从高电平切换到低电平

终止条件:SS从低电平切换到高电平

       一般默认SS低电平有效(具体情况根据芯片手册来),从高电平切换到低电平就是代表选中某个从机,这就是通信的开始。当从低电平切换到高电平就是代表终止这次通信。

模拟spi,单片机,嵌入式硬件

 起始和终止时序图

SPI有两个可配置的位分别是CPOL时钟极性,CPHA时钟相位

CPOL=0:时钟空闲状态时,SCK为低电平

CPOL=1:时钟空闲状态时,SCK为高电平

CPHA=0:  SCK第一个边沿移入数据,第二个边沿移出数据

CPHA=1:  SCK第一个边沿移出数据,第二个边沿移入数据(SCK的第二个边沿进行数据采样或者是SCK的偶数边沿进行数据采样)

1.模式0

CPOL=0:时钟空闲状态时,SCK为低电平

CPHA=0:  SCK第一个边沿移入数据,第二个边沿移出数据

       数据移入移出的时机会提前半个时钟,也就是相位提前了。在时钟上升沿,主机和从机同时移入数据的,主机通过MISO移入最高位,从机通过MOSI移入最高位,然后时钟运行产生下降沿,此时主机和从机移出数据,这里主机移出的最高位进入从机移位寄存器的最低位,从机移出的最高位进入主机移位寄存器的最低位。

模拟spi,单片机,嵌入式硬件

 模式0时序图

2.模式1

CPOL=0:时钟空闲状态时,SCK为低电平

CPHA=1:  SCK第一个边沿移出数据,第二个边沿移入数据

       在时钟上升沿,主机和从机同时移出数据的,主机通过MOSI移出最高位,此时MOSI的电平就表示主机要发送的数据B7,从机通过MISO移出最高位,此时MISO的电平就表示从机要发送的数据B7,然后时钟运行产生下降沿,此时主机和从机移入数据,也就是进行数据采样,这里主机移出的B7进入从机移位寄存器的最低位,从机移出的B7进入主机移位寄存器的最低位。这样,一个时钟脉冲产生完毕,一个数据位传输完毕。

模拟spi,单片机,嵌入式硬件

  模式1时序图

3.模式2

CPOL=1:空闲状态时,SCK为高电平

CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据

模拟spi,单片机,嵌入式硬件

  模式2时序图

4.模式3

CPOL=1:空闲状态时,SCK为高电平

CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据

模拟spi,单片机,嵌入式硬件

四、软件代码模拟(模式0)

1.先配置4根通信线

先初始化4根通信线,给它们配置成相应的状态函数

void MySPI_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	MySPI_W_SS(1);  //初始化好给片选引脚拉高
	MySPI_W_SCK(0);  //时钟引脚拉低
}

void MySPI_W_SS(uint8_t BitValue)  //片选高低电平配置函数
{
	GPIO_WriteBit(GPIOA, GPIO_Pin_4, (BitAction)BitValue);
}

void MySPI_W_SCK(uint8_t BitValue)   //时钟高低电平配置函数
{
	GPIO_WriteBit(GPIOA, GPIO_Pin_5, (BitAction)BitValue);
}

void MySPI_W_MOSI(uint8_t BitValue)  //主机输出引脚高低电平配置函数
{
	GPIO_WriteBit(GPIOA, GPIO_Pin_7, (BitAction)BitValue);
}

uint8_t MySPI_R_MISO(void)   主机输入引脚读取高低电平
{
	return GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6);
}

 2.起始和终止信号

按照起始和终止时序图写出模拟的高低电平

void MySPI_Start(void)
{
	MySPI_W_SS(0);
}

void MySPI_Stop(void)
{
	MySPI_W_SS(1);
}

3.交换一个字节

主机发送一个字节,并且从从机得到一个字节

uint8_t MySPI_SwapByte(uint8_t ByteSend)
{
	uint8_t i, ByteReceive = 0x00;
	
	for (i = 0; i < 8; i ++)
	{
		MySPI_W_MOSI(ByteSend & (0x80 >> i));
		MySPI_W_SCK(1);
		if (MySPI_R_MISO() == 1){ByteReceive |= (0x80 >> i);}
		MySPI_W_SCK(0);
	}
	
	return ByteReceive;
}

       上面就是用GPIO口模拟一个SPI通信的时序用于主机发送或接收一个字节,具体的某款芯片对应的SPI通信要根据芯片手册来看给芯片发送什么字节或者我们需要接收什么字节,但是上面是SPI通信的基础有了这个就可以进行我们想要的接收和发送数据了,这样才能进行接下来的通信,文章来源地址https://www.toymoban.com/news/detail-632235.html

到了这里,关于软件模拟SPI的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 嵌入式和单片机

    凡是从事信息技术相关工作的,一定都听说过嵌入式和单片机。 大家都知道,这两个名词,和硬件系统有着非常密切的关系。 但是,如果要问具体什么是嵌入式,什么是单片机,它们之间究竟有什么区别,我相信大部分人并不能解释清楚。 今天,小编就给大家做一个入门科

    2024年02月07日
    浏览(58)
  • 7. 嵌入式与单片机

    常见面试题 请说说你对嵌入式的理解。⭐⭐⭐⭐ 嵌入式系统是指以应用为中心,以计算机技术为基础,软件硬件可剪裁,适应应用系统对功能、成本、体积、功耗严格要求的专用计算机系统。 嵌入式系统 主要由 嵌入式微处理器 、 外围硬件设备 、 嵌入式操作系统以及用户

    2024年02月02日
    浏览(89)
  • 嵌入式开发:单片机嵌入式Linux学习路径

    SOC(System on a Chip)的本质区别在于架构和功能。低端SOC如基于Cortex-M架构的芯片,如STM32和NXP LPC1xxx系列,不具备MMU(Memory Management Unit),适用于轻量级实时操作系统如uCOS和FreeRTOS。高端SOC如基于Cortex-A架构的芯片,如三星、高通、飞卡、全志和瑞芯微等,具备MMU,支持虚拟内

    2024年02月15日
    浏览(57)
  • 嵌入式(二)单片机基础 | 单片机特点 内部结构 最小系统 电源 晶振 复位

    上一篇文章我们介绍了嵌入式系统 嵌入式系统(Embedded System)是一种特定用途的计算机系统,它通常嵌入在更大的产品或系统中,用于控制、监测或执行特定的任务。这些系统通常由硬件和软件组成,旨在满足特定的需求,如嵌入在家电、汽车、医疗设备、工业自动化、消费

    2024年02月02日
    浏览(108)
  • 单片机(嵌入式)程序分层架构

    目录 前言 嵌入式3层软件架构 嵌入式4层软件架构-1 驱动层 操作系统层 中间件层 应用层 嵌入式4层软件架构-2 硬件层 嵌入式微处理芯片 嵌入式存储器系统 嵌入式I/O接口 中间层 系统软件层 RTOS 文件系统 GUI 应用层 嵌入式5层软件架构1 嵌入式5层软件架构2 嵌入式6层软件架构

    2023年04月19日
    浏览(80)
  • 单片机和Linux嵌入式区别

    单片机是一种集成电路,它能够在一个芯片上完成各种计算、控制和管理任务。单片机没有明确的分层,这是因为它通常被用来设计嵌入式系统,其程序结构和功能要根据具体的应用需求来设计。 在单片机的程序设计中,可以通过一些方法将程序分为不同的层次,比如可以将

    2024年01月17日
    浏览(64)
  • 【单片机/嵌入式】最完整学习路线

            关于这个问题我在网上寻找到 了 相关文章解释得很详细,不了解的同学可以参考一下这篇文章: 到底什么是嵌入式?什么是单片机? - 知乎         一个人学习是孤独的,如果你是一名学生,建议加入学校的电子社团或者实验室,有老师的帮助和同学的互助

    2024年02月03日
    浏览(54)
  • 嵌入式51单片机04-矩阵按键系列

    一、矩阵按键基础知识 矩阵按键工作原理 : 逐行扫描 :通过高四位轮流输出低电平来对矩阵键盘进行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过判断低四位数据中哪一位为零来判断哪一个按键被按下。 逐列扫描 :通过低四位轮流输出低电平来

    2024年02月07日
    浏览(65)
  • 【唠唠嵌入式】__如何学习单片机?

    目录 前言 个人定位,从事软件还是硬件? 学习内容 (* ̄︶ ̄)创作不易!期待你们的 点赞、收藏和评论喔。 作为一个老司机,多年来跟 单片机 、 Keil 、 C语言 、 AD 、 烙铁 、 风枪 、 示波器 、 电子元器件 纠缠不清。期间经历了不少磨练,熬过了很多夜晚,也掉了大把头

    2024年02月06日
    浏览(71)
  • 【单片机毕设选题】stm32实现车牌识别系统 -物联网 嵌入式 单片机

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月20日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包