秋名山码民的主页
oi退役选手,Java、大数据、单片机、IoT均有所涉猎,热爱技术,技术无罪
欢迎关注点赞收藏⭐️留言
获取源码,添加WX
首先明确一个概念,关于MCU中通信总线和通信协议,通信总线是一种用于连接各种外设和模块的物理接口,它可以传输数据和控制信息。通信协议则是指在通信总线上传输数据时所遵循的规则和约定,以确保不同设备之间能够正确地交换信息,我们也可以把他叫做通信总线协议。
系列文章,主要讲解以下几个总线协议,读者可以按需选择:
- UART和USART
- RS232、RS485总线
- IIC总线
- SPI总线
- CAN总线
- USB总线
SPI是一种高速全双工的通信总线。
如上图所示,SPI有三根总线,和一根片选线组成,3条总线分别为SCK、MOSI、MISO,片选线为SS
NSS、SCK、MOSI信号都由主机控制产生,而MISO的信号由从机产生,主机通过该信号线读取从机的数据。MOSI与MISO的信号只在NSS为低电平的时候才有效,在SCK的每个时钟周期,MOSI和MISO传输一位数据。
I2C(Inter-Integrated Circuit)和SPI(Serial Peripheral Interface)都是两种常见的串行通信协议,它们在硬件接口、数据传输方式和应用场景上有一些明显的区别。
硬件接口:
数据传输方式:
应用场景:
初始化结构体及函数定义在库文件stm32f10x_spi.h及stm32f10x_spi.c中,
typedef struct
{
uint16_t SPI_Direction; /*设置SPI的单双向模式 */
uint16_t SPI_Mode; /*设置SPI的主/从机端模式 */
uint16_t SPI_Data Size; /*设置SPI的数据帧长度,可选8位或16位 */
uint16_t SPI_CPOL; /*设置时钟极性CPOL,可选高或低电平*/
uint16_t SPI_CPHA; /*设置时钟相位,可选奇或偶数边沿采样 */
uint16_t SPI_NSS; /*设置NSS引脚由SPI硬件控制还是软件控制*/
uint16_t SPI_Baud Rate Prescaler; /*设置时钟分频因子,fpclk/分频数=f SCK */
uint16_t SPI_First Bit; /*设置MSB/LSB先行 */
uint16_t SPI_CRCPolynomial; /*设置CRC校验的表达式 */
} SPI_Init Type Def;
如果本文对你有所帮助,还请三连支持一下博主!