通讯协议USART , I2C , SPI对比总结

目录

一.各协议应用场景

二.STM32F10x系列提供协议的端口数量

三.协议下的引脚配置

四.协议下使用标准库编程的不同点

五.实现信息交流的共同点和差异

六.代码书写习惯和C语言语法


一.各协议应用场景

  • USART支持大部分电子设备之间的通讯。比如电脑与单片机,单片机与单片机之间的通讯。USART因为有TX和RX两条线,可以实现同时收发(全双工),也可以半双工(只用一条线,TX和RX在内部连接)。
  • I2C使各个集成电路之间实现信息交流,是通用的双向两线制总线协议,有SCK和SDA两条线,实现半双工(数据可以双向传输,但不能同时收发)管脚少,结构较为简单。I2C协议下,数据传输的有效性依赖于SCK电平是否为高。
  • SPI是高速的全双工通信总线。广泛应用在ADC,LCD,MCU等通讯速度要求较高的场合。数据传输的有效性主要是看SCK是否处于采样(CPOL,CPHA)状态。

二.STM32F10x系列提供协议的端口数量

在STM32F10x系列中,USART有5套,I2C有2套,SPI有3套端口分配。只有USART1和SPI1挂载在APB2上,传输速度较快。       

三.协议下的引脚配置

USART有TX和RX两个通讯端口,I2C有SCL和SDA两条总线,SPI有CS,SCK,MISO,MOSI四个条线。在配置GPIO端口时,输出设置为复用推挽输出或者推挽输出(由STM32内部电路控制)或者开漏输出,输入设置为浮空输入(由外部电平控制)。

复用推挽输出和普通推挽输出的区别?复用推挽输出是由内部外设控制,推挽输出由数据寄存器ODR控制。SCK,MOSI,TX使用复用推挽输出,高低电平由内部外设控制;CS使用推挽输出,通过软件控制ODR来实现高低电平。

I2C通讯中SCL,SDA被设置成开漏输出。开漏输出无高电平,只能实现低电平和高阻态。这是由于I2C需要实现线与功能,防止数据冲突。

四.协议下使用标准库编程的不同点

  • USART初始化波特率,字长,停止位,校验,发送/接收模式,软/硬件控制(常选用硬件)。在使能USART,NVIC中断,接收/发送中断之后,在it.c文件里编写对应的中断服务函数。STM32在发送或者接收数据之后,都要查看STM32内部标志位是否置一。
  • I2C初始化时钟速度,模式,占空比,从机设备地址,应答使能,指定地址长度(7位还是10位)。在使能I2C之后,需要编写STM32和EEPROM的读写函数,还有等待EEPROM内部时序完成函数。I2C的读写函数要严格按照主从设备通讯图来进行,检测对应的EVn事件。
  • SPI初始化数据传输方向,模式,数据帧长度,CPOL和CPHA,软/硬件模式,波特率分频因子,高低位先行,校验表达式。FLASH和STM32的通讯主要依靠命令代码。FLASH在写入前需要写使能,擦除一块扇区,写完后需要等待内部时序完成。

五.实现信息交流的共同点和差异

共同点:

  • 在USART,I2C,SPI协议下,STM32与其他设备通讯时,都需要读取自身TXE,RXNE标志位来判断是否发送或者接收到信号,是否可以继续发送或者接收信号。
  • 在USART,I2C,SPI协议下,都需要对相应的标志位(使用GetFlag库函数)检测,等待SET才能进行下一步。

差异:

  • USART协议下,通过TXE和RXNE查询或者中断触发方式实现信息交流。I2C协议下,通过发送读写地址(EEPROM)实现信息交流。SPI协议下,通过命令代码(FLASH)实现信息交流。

六.代码书写习惯和C语言语法

        为了增强代码可读性和可移植性,在写代码时,经常使用宏定义,把实现某一种功能的代码段封装成函数。把一整个通讯过程拆成一个个函数,一个函数实现某一种功能。在写函数时,需要考虑函数是否需要返回值,返回值的类型是什么;函数的参数有几个,有哪些;函数所对应的通讯过程是如何的。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值