SPI(一)

简介

高速、全双工、同步数据总线
四根线,其中包括单独的数据线和单独的时钟信号
时钟是振荡信号,告诉接收端在确切的时机对数据线上的信号采样
产生时钟的一侧为主机,另一侧为从机
主从模式,只有一个主机,可以有多个从机

4条逻辑线

MISO 从机->主机
MOSI 主机 ->从机
SCLK 串行时钟信号,主机->从机
SS 片选信号,低电平有效,控制与哪个从机通讯,主机发送

传输过程:

NSS信号拉低保证从机开始接受数据
接收端检测到时钟的边沿信号时,读数据线上的信号
主机产生时钟信号
主机MOSI发送数据到从机
从机MISO发送数据到主机
在这里插入图片描述

时钟配置

时钟频率
主机在通信开始时配置并生成相应时钟信号,在每个SPI时钟周期内都会发生全双工数据传输

时钟极性 CKP或CPOL
极性和相位共同决定读取数据的方式
极性为0/1表示时钟空闲时为低电平/高电平

时钟相位 CKE或CPHA
采集数据时具体边沿
CKE=0在时钟信号的第一个跳变沿采样,在第二个边沿发送数据
CKE=1在时钟信号的第二个跳变沿采样,在第一个边沿发送数据
实际采样数据的时刻

SPI 模式:时钟极性+相位
主从必须使用相同的工作模式
在这里插入图片描述
在这里插入图片描述

多从机模式

多NSS
菊花链
SPI协议详解(图文并茂+超详细)
SPI读写FLASH
基本原理
软件模拟SPI C

STM32的Serial Peripheral Interface (SPI)模块支持主多从模式,即个主设备连接多个从设备通信。在使用标准库代码时,你需要包含`stm32f1xx_hal Spi.c`和`stm32f1xx_hal Spi.h`头文件,并初始化SPI HAL资源。 下面是个简单的示例,展示如何配置个STM32F103C8T6的SPI为主设备,连接两个从设备: ```c #include "stm32f1xx_hal.h" // 初始化SPI void SPI_MasterInit(SPI_HandleTypeDef* hspi) { hspi->Instance = SPIx; // 替换为实际的SPI外设编号,如SPI1、SPI2等 SPI_InitTypeDef spiConfig; // 配置SPI参数 spiConfig.Mode = SPI_MODE_MASTER; spiConfig.Direction = SPI_DIRECTION_2LINES; spiConfig.DataSize = SPI_DATASIZE_8BIT; spiConfig.CLKPolarity = SPI_POLARITY_LOW; spiConfig.CLKPhase = SPI_PHASE_1EDGE; spiConfig.CRCPolynomial = 7; spiConfig.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; spiConfig.FirstBit = SPI_FIRSTBIT_MSB; if (HAL Spi_Init(hspi) != HAL_OK) { // 初始化失败处理... } // 设置时钟分频因子(如有需要) HAL_RCCEx_EnablePeriphClkForSpi(hspi); } // 主设备发送数据到多个从设备 void SendDataToSlaves(uint8_t data[], uint8_t slaveNum, uint16_t len) { for (uint16_t i = 0; i < len; ++i) { // 发送数据到第个从设备 HAL Spi_TransmitReceive(hspi, &data[i], NULL, 1, SLAVE_TIMEOUT); // 依次发送给其他从设备 for (uint8_t j = 1; j < slaveNum; ++j) { HAL_Delay(1); // 等待间隔时间,避免同时传输冲突 HAL Spi_TransmitReceive(hspi, &data[i], NULL, 1, SLAVE_TIMEOUT); } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值