stm32之协议篇(IIC、SPI)

目录

同步与异步:

发送模式:

IIC时序:

SPI工作原理:

SPI通信过程:

IIC和SPI的异同:


同步与异步:

同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。
  
异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。

USART:通用同步和异步收发器
UART:通用异步收发器

当进行异步通信时,这两者是没有区别的。区别在于USART比UART多了同步通信功能(或者说多了一根时钟线)

发送模式:

UART:先发低位后发高位
IIC:先发高位后发低位
SPI:先发高位后发低位

IIC时序:

IIC时序:
开始信号:当SCL为高期间,SDA由高到低的跳变;启动信号是一种电平跳变时序信号,而不是一个电平。


停止信号:当SCL为高期间,SDA由低到高的跳变;停止信号也是一种电平跳变时序信号,而不是一个电平信号。


应答信号:每当主机向从机发送完一个字节的数据,主机总是需要等待从机给出一个应答信号,以确认从机是否成功接收到了数据,从机应答主机所需要的时钟仍是主机提供的,应答出现在每一次主机完成8个数据位传输后紧跟着的时钟周期,低电平0表示应答,1表示非应答:

产生ACK应答:SCL在SDA一直为低电平期间完成低高电平转换

不产生应答:SCL在SDA一直为高电平期间完成低高电平转换

硬件IIC与软件IIC的区别
1. 硬件IIC用法比较复杂,模拟IIC的流程更清楚一些。

2. 硬件IIC速度比模拟快,并且可以用DMA

3. 模拟IIC可以在任何管脚上,而硬件只能在固定管脚上。

IIC的配置模式开漏与推挽的优缺点

主机如果使用了推挽,当主机释放SDA时(令SDA=1时),相当于SDA被接通到VCC,这时从机无法控制SDA为0;

主机如果使用了开漏,当主机释放SDA时(令SDA=1时),相当于SDA被悬空上拉到VCC,这时从机可以拉低SDA,使SDA=0,也可以释放SDA使SDA=1,这样从机才能发数据。


开漏输出:IIC就是利用引脚高阻态的特性,IIC总线上挂载多个从机,当从机不工作时输出高阻态,总线默认是高电平

SPI工作原理:


1、硬件为四根线
2、主机和从机都有一个人串行移位寄存器,主机通过SPI的串行移位寄存器写入一个字节发送一次传输
3、串行移位寄存器通过MOSI信号线将字节发送给从机,从机将自己的串行移位寄存器的内容通过MISO返回给主机,这样两个串行移位寄存器的内容被交换
4、外设的读写操作同步完成,只进行写操作,则忽略读操作;主机只进行从机的读操作,则主机须发送一个空字节给从机引发传输

SPI通信过程:

一个字节传送完成后无需应答即可开始下一个字节的传送;SPI总线采用同步方式工作,时钟线在上升沿或下降沿时发送器向数据线上发送数据,在紧接着的下降沿或上升沿时接收器从数据线上读取数据,(一个周期两个沿,第一个沿发送数据,第二个沿接收数据)完成一位数据传送,八个时钟周期即可完成一个字节数据的传送

CPOL=0,CPHA=0上升沿接数据,下降沿发数据空闲时,时钟线为低电平
CPOL=0,CPHA=1上升沿发数据,下降沿接数据空闲时,时钟线为低电平
CPOL=1,CPHA=0上升沿接数据,下降沿发数据空闲时,时钟线为高电平
CPOL=1,CPHA=1上升沿发数据,下降沿接数据空闲时,时钟线为高电平

CPHA = 0:表示从第一个跳变沿开始采样;

CPHA = 1:表示从第二个跳变沿开始采样。

跳变沿究竟是上升沿还是下降沿,这取决于 CPOL。

记住, CPHA 只决定是哪个跳变沿采样。

例如:
CPOL=0,CPHA=0:此时空闲态时,SCLK处于低电平,数据采样是在第1个边沿,也就是SCLK由低电平到高电平的跳变,所以数据采样是在上升沿,数据发送是在下降沿。

CPOL=0,CPHA=1:此时空闲态时,SCLK处于低电平,数据发送是在第1个边沿,也就是SCLK由低电平到高电平的跳变,所以数据采样是在下降沿,数据发送是在上升沿。

CPOL=1,CPHA=0:此时空闲态时,SCLK处于高电平,数据采集是在第1个边沿,也就是SCLK由高电平到低电平的跳变,所以数据采集是在下降沿,数据发送是在上升沿。

CPOL=1,CPHA=1:此时空闲态时,SCLK处于高电平,数据发送是在第1个边沿,也就是SCLK由高电平到低电平的跳变,所以数据采集是在上升沿,数据发送是在下降沿。

IIC和SPI的异同:

相同点:
1、均采用串行、同步的方式
2、均采用TTL电平,传输距离和应用场景类似(不适合长距离通信)
3、均采用主从方式工作

不同点:
1、IIC为半双工,SPI为全双工
2、IIC有应答机制,SPI无应答机制
3、IIC通过向总线广播从机地址来寻址,SPI通过向对应从机发送使能信号寻址
4、IIC的时钟极性和时钟相位固定(空闲时SDA,SCL为高电平),SPI时钟极性和时钟相位可调

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
硬件IICSPISTM32F103C8T6最常用的通信接口之一,可以用于与其他芯片或设备进行数据交换。以下是STM32F103C8T6的硬件IICSPI驱动的基本介绍: 硬件IIC驱动: STM32F103C8T6的硬件IIC驱动需要使用I2C库函数,包括GPIO初始化、I2C初始化、I2C读写操作等。代码示例: 1. GPIO初始化: /* Configure I2C1 pins: PB6->SCL and PB7->SDA */ GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); 2. I2C初始化: /* I2C1 clock enable */ __HAL_RCC_I2C1_CLK_ENABLE(); hi2c1.Instance = I2C1; hi2c1.Init.ClockSpeed = 100000; hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; hi2c1.Init.OwnAddress1 = 0; hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; hi2c1.Init.OwnAddress2 = 0; hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; if (HAL_I2C_Init(&hi2c1) != HAL_OK) { Error_Handler(); } 3. I2C读写操作: /* Write data to the device */ HAL_I2C_Mem_Write(&hi2c1, DevAddr, MemAddr, MemAddrSize, pData, Size, Timeout); /* Read data from the device */ HAL_I2C_Mem_Read(&hi2c1, DevAddr, MemAddr, MemAddrSize, pData, Size, Timeout); 硬件SPI驱动: STM32F103C8T6的硬件SPI驱动需要使用SPI库函数,包括GPIO初始化、SPI初始化、SPI读写操作等。代码示例: 1. GPIO初始化: /* SPI1 GPIO Configuration PB3 ------> SPI1_SCK PB4 ------> SPI1_MISO PB5 ------> SPI1_MOSI */ GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); 2. SPI初始化: /* SPI1 parameter configuration */ hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; hspi1.Init.Direction = SPI_DIRECTION_2LINES; hspi1.Init.DataSize = SPI_DATASIZE_8BIT; hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; hspi1.Init.NSS = SPI_NSS_SOFT; hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256; hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi1.Init.TIMode = SPI_TIMODE_DISABLE; hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; hspi1.Init.CRCPolynomial = 0; if (HAL_SPI_Init(&hspi1) != HAL_OK) { Error_Handler(); } 3. SPI读写操作: /* Write data to the device */ HAL_SPI_Transmit(&hspi1, pData, Size, Timeout); /* Read data from the device */ HAL_SPI_Receive(&hspi1, pData, Size, Timeout); 以上是STM32F103C8T6的硬件IICSPI驱动的基本介绍,只是简单的示例,实际应用可能需要根据具体情况进行修改和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值