目录
一.各协议应用场景
- 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语言语法
为了增强代码可读性和可移植性,在写代码时,经常使用宏定义,把实现某一种功能的代码段封装成函数。把一整个通讯过程拆成一个个函数,一个函数实现某一种功能。在写函数时,需要考虑函数是否需要返回值,返回值的类型是什么;函数的参数有几个,有哪些;函数所对应的通讯过程是如何的。