首先介绍下自己的学习背景,博主本人是在上周刚入门stm32并且学习gpio口基本用法和中断的介绍。在这样的知识储备下我开始学习I2c通信协议,并尝试编写了师兄布置的一个小任务。
1.1. I2C总线物理结构
首先介绍下i2c通信协议,从物理层上来看这是一种非常简洁明了的通信协议。本身一共就两条总线,一条SCL(时钟总线),一条SDA(数据总线)。通信原理是通过对SCL和SDA线高低电平时序的控制,来 产生I2C总线协议所需要的信号进行数据的传递。在总线空闲状态时,这两根线一般被上面所接的上拉电阻拉高,保持着高电平。硬件图如下:
1.2 I2C总线特征
I2C总线上的每一个设备都可以作为主设备或者从设备,而且每一个设备都会对应一个唯一的地址(可以从I2C器件的数据手册得知),主从设备之间就通过这 个地址来确定与哪个器件进行通信,在通常的应用中,我们把CPU带I2C总线接口的模块作为主设备,把挂接在总线上的其他设备都作为从设备。
I2C总线上可挂接的设备数量受总线的最大电容400pF 限制,如果所挂接的是相同型号的器件,则还受器件地址位的限制。
I2C总线数据传输速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s。一般通过I2C总线接口可编程时钟来实现传输速率的调整,同时也跟所接的上拉电阻的阻值有关。
I2C总线上的主设备与从设备之间以字节(8位)为单位进行双向的数据传输。
1.3 I2C总线协议
I2C协议规定,总线上数据的传输必须以一个起始信号作为开始条件,以一个结束信号作为传输的停止条件。起始和结束信号总是由主设备产生。总线在空闲状态 时,SCL和SDA都保持着高电平,当SCL为高电平而SDA由高到低的跳变,表示产生一个起始条件;当SCL为高而SDA由低到高的跳变,表示产生一个 停止条件。在起始条件产生后,总线处于忙状态,由本次数据传输的主从设备独占,其他I2C器件无法访问总线;而在停止条件产生后,本次数据传输的主从设备 将释放总线,总线再次处于空闲状态。如图所示:
在了解起始条件和停止条件后,我们再来看看在这个过程中数据的传输是如何进行的。前面我们已经提到过,数据传输以字节为单位。主设备在SCL线上产生每个 时钟脉冲的过程中将在SDA线上传输一个数据位,当一个字节按数据位从高位到低位的顺序传输完后,紧接着从设备将拉低SDA线,回传给主设备一个应答位, 此时才认为一个字节真正的被传输完成。当然,并不是所有的字节传输都必须有一个应答位,比如:当从设备不能再接收主设备发送的数据时,从设备将回传一个否 定应答位。数据传输的过程如图所示:
在前面我们还提到过,I2C总线上的每一个设备都对应一个唯一的地址,主从设备之间的数据传输是建立在地址的基础上,也就是说,主设备在传输有效数据之前 要先指定从设备的地址,地址指定的过程和上面数据传输的过程一样,只不过大多数从设备的地址是7位的,然后协议规定再给地址添加一个最低位用来表示接下来 数据传输的方向,0表示主设备向从设备写数据,1表示主设备向从设备读数据。如图所示:
1.4 I2C总线操作
对I2C总线的操作实际就是主从设备之间的读写操作。大致可分为以下三种操作情况:
第一,主设备往从设备中写数据。数据传输格式如下:
第二,主设备从从设备中读数据。数据传输格式如下:
第三,主设备往从设备中写数据,然后重启起始条件,紧接着从从设备中读取数据;或者是主设备从从设备中读数据,然后重启起始条件,紧接着主设备往从设备中写数据。数据传输格式如下:
其实以上关于I2C的详细介绍都大同小异,而且一般介绍都比较详细充分,我建议初学者只要提炼主要的有效信息就可以。初学者想要进一步了解还是要结合具体程序来分析,所以下一篇博客我将详细介绍下I2C应用程序的编写。
关键字:stm32 I2C
引用地址:
stm32中i2c之学习浅谈
推荐阅读最新更新时间:2024-03-16 16:26
基于STM32单片机的ADC与DMA配置的介绍与使用
本文使用ADC转换电位器输出的电压值,并用DMA模式传输转换的结果,每8次采样转换取平均值,做一个简单的数字滤波。 ADC的详细配置与使用 见之前的日记STM32中ADC的使用,只是最后增加一步配置DMA: DMA for ADC channels features configuration To enable the DMA mode for ADC channels group, use the ADC_DMACmd()funcTIon. To configure the DMA transfer request, use ADC_DMAConfig() func TI on. DMA的配置 (摘自STM32F3官
[单片机]
STM32自学笔记——外部中断
stm32的每个IO口都可以作为外部中断的入口。stm32f103的中断控制器支持19个外部中断/事件请求(question1:外部中断和时间请求的区别?),这19个外部中断中0-15对应外部IO口的输入中断16连接到PVD输出(question2:什么是PVD输出?)17连接到RTC闹钟事件(question3:这有什么意义)18连接到USB唤醒事件(question4:USB唤醒事件是什么?)。由上可以看出stm32供IO的中断线只有16个但是stm32的IO口远远不止16个那么怎么一一对应呢?于是 STM32 就这样设计, GPIO 的管教 GPIOx.0~GPIOx.15(x=A,B,C,D,E, F,G)分别对应中断线
[单片机]
STM32 flash读写源程序
/** ****************************************************************************** * File Name : FLASH.c * Description : read and program the stm32's flash from address * Author : Yelsin * Version : V1.0.0 * Date : 11-Jan-2015 * COPYRIGHT(c) 2015. All Right Reserved *********
[单片机]
stm32 usb_istr.c 文件分析
最近做一个项目,在stm32内部一部分用来存储自己的代码,开辟出一段空间来用来存储FPGA代码。每次开机实现stm32往FPGA写入代码的功能。 向stm32某段空间写入代码的方法: (1)ST_LINK Utility软件 通过JTAG,连接后。载入FPGA的bin文件,改写Start address就可以将代码写入固定的区域。 当然可以用ST-LINK写入任意代码。 (2)用STMFlashDemo软件。 这个官方的串口下载软件,通过系统存储器进行下载。在之前的日志中提到过,不详说。 利用MCUISP下载的时候,会擦出整个芯片。 所以如果将一部分内容存到FLASH中比如(0x0807000~0x0807100),再
[单片机]
STM32的SWD下载模式
之前一直用的JTAG下载,最近使用了下SWD模式。SW模式使用了5个引脚,NRST :复位 SWCLK:串行线时钟 SWDIO:串行线调试数据输入/输出,另外的为 GND 和VCC SWD模式的优势:SWD 模式比 JTAG 在高速模式下面更加可靠. 在大数据量的情况下面 JTAG 下载 程序会失败, 但是 SWD 发生的几率会小很多. 基本使用 JTAG 仿真模式的情况下是可以直接使用 SWD 模式的, 比较方便,并且引脚比较少,便于集成。
[单片机]
基于STM32的ADS8339 驱动
环境:STM32F103RC,主频 72MHz(外部晶振)或64MHz(HSI) 普通IO口模拟spi 代码实现: // ADS8339.c /****************************************************** 函数名称:Read16BitsData 函数描述:IO口模拟spi读16位数据 Calls: Called by: GetOnce_ADCData 输入参数:无 返回值:读到的16位数据 ******************************************************/ static uint16_t Read16BitsData(voi
[单片机]
别用keil了,CLion同样可以用于STM32开发
0.前言 最近有用到 STM32 这款MCU,好久没用 Keil 感觉各种不适应,遂尝试能不能把 STM32 的开发环境部署到其他更强大的IDE,结果很圆满,以下是配置 Clion 用于 STM32 开发的过程记录,供大家参考~ 做嵌入式开发的人对 STM32 这个平台应该都是非常熟悉的,在国内尤其流行,很多产品里面都是基于这个平台做的方案。多数人在开发 STM32 的时候用的都是 Keil 这个老牌IDE,很大一部分原因是因为大多数人最初是从51单片机学习过来的,51就是基于 Keil 去开发的,然后迁移到 STM32 的时候也就沿用下来了。 Keil 操作简单,容易上手,而且可以很方便地进行调试。但是对于以前不是做嵌入式开
[单片机]
TI 推出具备 I2C 接口的双向电流、电压与电源监控器
为服务器、电信与工业设备提供高精度电源监控 2007 年 7 月 11 日,北京讯 日前,德州仪器 (TI) 宣布推出一款具备 I2C 接口的高侧测量双向电流∕电源监控 IC —— INA209,借助零漂移与自动调零 (auto-zeroing) 架构,该产品提供了高精度的电流检测解决方案,在 -40℃ 至 +85℃ 温度范围内,最高精度不低于 1%,最大偏移为 100uV。该器件支持多种应用中的电流、电压与电源的监控,例如服务器、电信设备、电池充电器、电源管理、汽车以及测试设备等。(更多详情,敬请访问: http://focus.ti.com.cn/cn/docs/prod/folders/print/ina209.html
[新品]