STM32总结之I2C协议

发布者:SerendipityRose最新更新时间:2019-07-13 来源: eefocus关键字:STM32  I2C协议  物理层 手机看文章 扫描二维码
随时随地手机看文章

一、I2C物理层



   I2C总线有如下特点:


   1.在一个I2C总线中,可以连接多个I2C通讯设备,支持多个通讯主机及多个通讯从机。


   2.一个I2C总线只使用2条总线线路,一条为双向串行数据线SDA,一条串行时钟线SCL。


数据线用来传输数据,时钟线用于数据同步。


   3.每个连接到总线上的设备都有一个独立的地址,通讯主机可以用这个地址进行不同


设备之间的访问。


   4.总线通过上拉电阻连接到电源。当I2C设备空闲时,会输出高阻态(意思是既不输出


电平,也不输出低电平),而当所有设备都空闲时,都输出高阻态,由上拉电阻把总线


拉成高电平。   


   5.多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定哪个设备占用总线。


   6.具有三种传输模式:标准模式,传输速率为100Kbit/s


                                      快速模式,传输速率为400Kbit/s


                                      高速模式,传输速率为3.4Mbit/s(目前大多数I2C设备尚不支持)


   7.连接到相同总线的IC数量受到总线的最大电容400pF限制。


二、I2C协议层


   I2C总线协议如下:


   1.只有在总线空闲时,才允许启动数据传送。


   2.在数据传送过程中,当时钟线为高电平时,数据线须保持稳定状态,不允许随意跳变。


时钟线为高电平时,数据线任何电平的跳变都被看做总线的起始或停止信号。


   起始信号:时钟线保持高电平,数据线电平由高到低的跳变作为I2C总线的起始信号。


   停止信号:时钟线保持高电平,数据线电平由低到高的跳变作为I2C总线的停止信号。   


   应答信号ACK和非应答信号NACK:传输时主机产生时钟,在传输完一个字节的数据后,


数据发送端将SDA的电平置高后释放SDA的控制权,在第9个时钟时,由数据接收端控制SDA。


若此时接收端将SDA电平置高,表示非应答信号NACK,若此时接收端将SDA电平置低,


则表示应答信号ACK。


   数据有效性:I2C使用SDA信号线来传输数据,使用SCL信号线进行数据同步。SDA信号线


在SCL的每个时钟周期传输一位数据。传输时,SCL为高电平时SDA数据有效,即:此时SDA


为高电平表示数据“1”,SDA为低电平,表示数据“0”’。当SCL为低电平时,数据接收方不对SDA


上的电平进行采集,在这个时候,发送方可以进行SDA电平的切换,为下一比特数据的传输做好


准备。



   地址及数据方向:I2C协议规定, 设备地址可以是7位或10位(一般7位就够了)。紧跟


设备地址的一个数据位用来表示数据传输方向,它是数据方向位,第8位或第11位。数据


方向位为1时表示主机由从机读数据,为0时表示主机向从机写数据。



响应:响应包括应答信号ACK和非应答信号NACK。作为数据接收端,无论主机从机,接收


到一个字节的数据后,若希望对方继续发送数据,则需要向对方发送ACK信号。发送方在


收到接收方发送的ACK信号后,才继续发送下一个字节的数据。若接收方希望结束数据传输,


则向发送方发送NACK信号,发送方接收到该信号后,先发送一个停止信号,然后结束这次数据传输。


停止数据传输时,主机必须向从机发送一个停止信号,不论是主机收到ACK后还是收到NACK后,


只要是结束数据传输,主机必须向从机发送一个停止信号。



    如果我们直接控制STM32的2个GPIO引脚,分别用作SCL和SDA,按照上述信号


的时序要求,输出时像控制LED灯那样,输入时则读取SDA电平,就可以实现I2C


的通讯。由于直接控制GPIO引脚电平产生I2C通信时序,需要由CPU控制每个时刻


的引脚状态,所这种软件模拟协议的方式,也称为“模拟I2C”。


   相对的,还有硬件控制的方式。STM32的I2C片上外设专门负责实现I2C通信协议。



关键字:STM32  I2C协议  物理层 引用地址:STM32总结之I2C协议

上一篇:浅谈 STM32 硬件I2C的使用 (中断方式 无DMA 无最高优先级)
下一篇:stm32中的i2c协议编程

推荐阅读最新更新时间:2024-11-18 22:15

STM32入门笔记1
STM32入门笔记:STM32+ST-Link ST-link仿真器跟一块最小系统的STM32开发板都买回来好久了,到最近终于有空开始动手学习。 --|||在ST-Link配的光盘里有个J-Link的介绍文档跟驱动程序,结果我就看完把驱动一装,连上开发板按着教程开始想烧录个程序进去试试。结果一直无法识别到J-Link设备…我居然还上旺旺找买仿真器的那个卖家问为什么我发现不了设备,我的仿真器上面的灯不亮?卖家问了下情况后很纳闷:你买的是ST-Link当然用J-Link的驱动程序连接不到设备啦…当时自己也被自己这个乌龙给雷到了。 好吧,又接着问了一下,原来ST-Link不用装驱动,但是用ST-Link无法像使用J-Link
[单片机]
关于 STM32 时钟配置的那些坑
今天分享以下两点内容: 1.为什么我们要先开启STM32外设模块时钟; 2.关于STM32的 I/O 复用功能及什么时候开启AFIO时钟; 1为什么我们要先开启STM32外设时钟 讲述本节内容之前先说一个案例: 前段时间,有一个朋友为配置EXTI的代码折腾了一天,最终没有结果。于是问了我这样一个问题:“你用过STM32F051C8T6的外部中断吗,就是GPIO管脚做中断,我这边就是进不了中断”。 然后他把基于标准外设库、寄存器写的代码都给我发过来了。我仔细看了又看,没发现有什么毛病啊。(但是,代码是截图分来给我发过来的)。 于是,我将之前配置IO外部中断的代码,按照他(PB2)的要求,写成一个“EXTI配置”函数发给他,他直接
[单片机]
关于 <font color='red'>STM32</font> 时钟配置的那些坑
stm32串口1和RS485通信的串口2的配置
stm32串口1的配置 #if EN_USART1_RX //如果使能了接收 //串口1中断服务程序 //注意,读取USARTx- SR能避免莫名其妙的错误 u8 USART_RX_BUF ; //接收缓冲,最大USART_REC_LEN个字节. //接收状态 //bit15, 接收完成标志 //bit14, 接收到0x0d //bit13~0, 接收到的有效字节数目 u16 USART_RX_STA=0; //接收状态标记 void uart_init(u32 bound){ //GPIO端口设置 GPIO_InitTypeDef GPIO_InitStructure; USART_In
[单片机]
STM32单片机GPIO端口使用
简介: 最近一段时间在学STM32,感觉都是在和寄存器打交道,首先先说下什么是寄存器。寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。 STM32的每个IO口有7个寄存器控制(1个IO口应该就是一组),分别是两个32位的端口配置寄存器,CRL和CRH。两个32位的数据寄存器IDR和ODR(这上面四个是重点),一个32位置位复位寄存器,一个16位复位寄存器,一个锁存寄存器LCKR. ____________________________________________________________________________________________________
[单片机]
最精简的stm32编码器程序
#define ROTATE_A PAin(2) #define ROTATE_B PAin(3) s16 DATA=0; void EXTI2_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line2) != RESET) { if(ROTATE_A!=ROTATE_B) { DATA++; } else DATA--; EXTI_ClearITPendingBit(EXTI_Line2); } } void main(void) { SystemInit(); delay
[单片机]
最精简的<font color='red'>stm32</font>编码器程序
详解stm32定时器的编码器模式
前言: 增量式编码器在实际应用中还是很常见。stm32的定时器带的也有编码器模式。所用的编码器是有ABZ三相,其中ab相是用来计数,z相输出零点信号。AB相根据旋转的方向不同,输出的波形如下图所示: 第一步:具体配置如下图: 重点说明: 一、如果编码模式设置为 Encoder Mode TI1 and TI2 则会默认检测AB相的上升沿与下降沿; 每一个上升沿和下降沿都触发计数,所以每转一格计数器就会+4;那么上图计数周期设置为400;也就是编码器转100格,计数器就会置零,重新开始计数! 二、关于Polarity参数:这个参数的意思是在检测到上升沿的时候就触发encoder捕获AB相的值,而并不是这里设置的是上升沿就只检
[单片机]
详解<font color='red'>stm32</font>定时器的编码器模式
STM32开发中的五大嵌入式系统
技术往往更新得非常快,并且总是让我们觉得学起来有难度而且有些迷茫。不过没有关系我们发烧友专注于在快乐中学习,要学习STM32,我们首先了解下五大嵌入式操作系统:μClinux、μC/OS-II、eCos、FreeRTOS和RT-thread。 μClinux μClinux是一种优秀的嵌入式Linux版本,从字面意思看是指微控制Linux。同标准的Linux相比,μClinux的内核非常小,但是它仍然继承了Linux操作系统的主要特性,包括良好的稳定性和移植性、强大的网络功能、出色的文件系统支持、标准丰富的API,以及TCP/IP网络协议等。 μClinux操作系统的中断管理是将中断处理分为两部分:顶半处理和底半处理。在顶半处
[单片机]
<font color='red'>STM32</font>开发中的五大嵌入式系统
GD32单片机STM32远程下载手机程序升级固件下载局域网网页升级工具
GD32、STM32单片机,是我们最常见的一种MCU。通常我们在使用STM32单片机都会遇到程序在线升级下载的问题。 GD32/STM32单片机的在线下载通常需要以下几种方式完成: 1、使用ST/GD提供的串口下载工具,本地完成固件的升级下载。 2、自行完成系统BootLoader的编写,将系统程序分为BootLoader和APP两个部分,BootLoader完成固件升级。 3、使用STM32/GD固件服务器,完成固件的升级,固件服务器https://simplewifi.taobao.com/ 几种方式各有优缺点: 使用ST提供的方法进行固件升级,方法简单,不需要额外的开发。但是,只能本地完成STM32单片机的升级。
[单片机]
GD32单片机<font color='red'>STM32</font>远程下载手机程序升级固件下载局域网网页升级工具
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved