STM32--IIC

目录

1:IIC简介

2:IIC协议 

3:STM32_IIC

4:STM32_IIC代码实现


1:IIC简介

IIC:(Inter_integrated circuit),两线式串行总线,它是由数据线SDA和时钟SCL构成的串行总线,可发送和接受数据,在CPU与被控IC之间,IC与IC之间进行双向传送,高速IIC总线一般可达400kbps.

一般在51中,没有硬件的IIC,只能用软件加引脚去模拟IIC的通信时序,STM32则一般都有硬件IIC

IIC是半双工 通信方式

2:IIC协议 

  1. 空闲状态
  2. 开始信号
  3. 停止信号
  4. 应答信号
  5. 数据的有效性
  6. 数据传输
  7. 通信过程简述

空闲状态

  IIC总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。此时各个器件的输出级场效应管均处在截至状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高

开始信号

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

停止信号

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

 应答信号ACK

   发送器每发送一个字节,就在第九个时钟脉冲期间释放数据线,由接收器反馈一个应答信号,应答信号为低电平时,规定为有效应答位ACK,表示接收器已经成功地接受了该字节,应答信号为高电平时,规定为非应答位NACK,一般表示接收器接受该字节没有成功。

   对于反馈有效应答位ACK的要求是,接收器在第9个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在该时钟的高电平期间为稳定的低电平

 数据有效性

   IIC总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化

   数据在SCL的上升沿到来之前就需准备好,并在下降沿到来之前必须稳定

数据的传输 

   在IIC总线上传送的每一个数据都用一个时钟脉冲相对应(或同步控制),即在SCL串行时钟的配合下,在SDA上逐位地串行传送每一个数据。数据位地传输是边沿触发

通信过程简介

数据传输遵循下面格式,在起始条件(S)后,发送了一个从机地址,这个地址共有7位,(也有10位的),紧接着的第8位是数据方向位(R/W)——'0'表示发送(写),‘1’表示请求数据(读)。数据传输一般由主机产生的停止位(P)终止。但是,如果主机仍希望在总线上通讯,它可以产生重复起始条件和寻址另一个从机,而不是首先产生一个停止条件。

3:STM32_IIC

eg:STM32F407ZGT6

有3个硬件IIC,在每个IIC的可选配置选项中有

有这样三个玩意,I2C不用说,就是前面介绍的,SMBus 简单说下

SMBus:System Management Bus(系统管理总线),它是以IIC的工作原理为基础,细的不说,直接来康康有什么异同

SMBus与IIC相似之处

  • 双线制总线协议(1个时钟总线,一个数据总线)+可选SMBus报警线
  • 主从通信,主器件提供时钟
  • 多主器件功能
  • SMbus数据格式与IIC 7位地址格式相似

SMBus与IIC之间的差异

SMBus可针对系统和电源管理相关的任务提供控制总线,系统可使用SMBus 与设备进行消息传递,而无需切换各个控制线。

4:STM32_IIC代码实现

主要来看看相关结构体吧

typedef struct
{
  uint32_t I2C_ClockSpeed;          /*!< Specifies the clock frequency.
                                         This parameter must be set to a value lower than 400kHz */

  uint16_t I2C_Mode;                /*!< Specifies the I2C mode.
                                         This parameter can be a value of @ref I2C_mode */

  uint16_t I2C_DutyCycle;           /*!< Specifies the I2C fast mode duty cycle.
                                         This parameter can be a value of @ref I2C_duty_cycle_in_fast_mode */

  uint16_t I2C_OwnAddress1;         /*!< Specifies the first device own address.
                                         This parameter can be a 7-bit or 10-bit address. */

  uint16_t I2C_Ack;                 /*!< Enables or disables the acknowledgement.
                                         This parameter can be a value of @ref I2C_acknowledgement */

  uint16_t I2C_AcknowledgedAddress; /*!< Specifies if 7-bit or 10-bit address is acknowledged.
                                         This parameter can be a value of @ref I2C_acknowledged_address */
}I2C_InitTypeDef;
  1. 设置通信的频率,最高到400KHZ,操作的是CCR寄存器
  2. 设置模式,可以是I2C_Mode_I2C、I2C_Mode_SMBusDevice、I2C_Mode_SMBusHost,操作CRx寄存器
  3. 设置IIC快速模式的占空比,可以是I2C_DutyCycle_16_9、I2C_DutyCycle_2,操作的是CCR寄存器
  4. 设置从设备地址,操作OARx寄存器
  5. 设置是否启动应答,操作CRx寄存器
  6. 设置7位或10位的地址,操作OARx寄存器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值