STM32初识I2C

发布者:黑白之间最新更新时间:2017-11-11 来源: eefocus关键字:STM32  I2C 手机看文章 扫描二维码
随时随地手机看文章

1、通讯协议。

  I2C是PHILIPS公司开发的两线式串行总线,属于同步半双工。

数据有效

在传输数据的时候,SDA线必须在时钟的高电平周期保持稳定,SDA的高或低电平状态只有在SCL 线的时钟信号是低电平时才能改变 。

起始停止

SCL 线是高电平时,SDA 线从高电平向低电平切换,这个情况表示起始条件;

SCL 线是高电平时,SDA 线由低电平向高电平切换,这个情况表示停止条件。

起始和停止条件一般由主机产生,总线在起始条件后被认为处于忙的状态 
,在停止条件的某段时间后总线被认为再次处于空闲状态。

如果产生重复起始条件而不产生停止条件,总线会一直处于忙的状态,此时的起始条件(S)和重复起始条件(Sr) 在功能上是一样的。

数据传输

发送到SDA 线上的每个字节必须为8 位,每次传输可以发送的字节数量不受限制。每个字节后必须跟一个响应位。首先传输的是数据的最高位(MSB),如果从机要完成一些其他功能后(例如一个内部中断服务程序)才能接收或发送下一个完整的数据字节,可以使时钟线SCL 保持低电平,迫使主机进入等待状态,当从机准备好接收下一个数据字节并释放时钟线SCL 后数据传输继续。

2、硬件配置。(单片机:Stm32f100c8t6b。EEPROM:AT24C256B。)

  首先,STM32自带I2C口,直接将IO口配置成I2C口,但STM32的I2C口不够稳定,发送数据容易出错。所以可以通过IO口模拟I2C,通过拉高拉低IO口模拟SCL和SDA。

  其次,采用的是Atmel的EEPROM器件,其大小为256K bits既32K个字节。24C256B分为512页,每页64个字节。

3、程序流程。(以写一字节为例)

        每发送一个字节I2C都需要验证应答位。

① 开启I2C(包括出去E2Prom的写保护功能和发送起始信号)

② 器件寻址 AT24C256的芯片地址位1010,其控制字节格式为1010A2A1A0R/W,其中A2、A1、A0为AT24C256的三个引脚表示位,接地位0否则为1,最后R/W位 若为0表示写为1表示读。这样就能通过发送次字节找到器件进行读写操作。

③验证应答位。每发送一个字节的数据I2C总线会在第9个时钟脉冲时释放SDA将SDA拉成低电平表示对数据认可。大多数I2C是应答低电平既SDA被拉低。但也有应答高电平的。例如沁恒的CH422芯片。检验第九位应答位的时候要讲SDA口设置成浮空输入。

④发送地址。(AT24c256地址为16位的要发两次每次一个字节,此步骤也要验证应答位)

⑤发送数据(可以发任意字节个数据,同样需要应答)

⑥停止I2C。(若器件有写保护引脚则尽量进行写保护操作)


STM32初识I2C

上图是一个完整的网I2C器件中写n个数据的程序。STM32初识I2C这是256C的电路图部分。可以看到其中有WP写保护引脚,通常WP和SDA,SCL不用的情况下都要拉高。其A0,A1,A2都接地所以器件寻址这三位为0.


STM32初识I2C
图片2是发送一个字节的函数被发送n的字节的函数所调用。

STM32初识I2C
图片3是写保护操作,无非就是拉低拉高IO口。

STM32初识I2C
 图片4是I2C起始信号,无非就是通过IO口的高低模拟电平的高低。

图2图3图4所示函数均为第一张图片里调用的一些基本函数,正是这些子函数组成了写n个字节的函数。


关键字:STM32  I2C 引用地址:STM32初识I2C

上一篇:48.OV7670摄像头实验
下一篇:STM32(IAR编译) 堆栈溢出 程序跑飞

推荐阅读最新更新时间:2024-03-16 15:44

STM32 FreeModbus RTU从机移植以及UART配置
FreeModbus的具体介绍就不提了。至于为什么要移植,大概就是因为移植比较快,而且比较稳定,可以减少因为自己编写出现的漏洞。 但是FreeModbus 1.5版本是没有主机的,因此移植的时候只可以做从机。网上有几个关于Modbus主机的源代码,回头等我弄好了再更新。 ================================== 理论上来说,此处我移植了全部,但是只调试了RTU部分,因此其他部分不做赘述。 移植过程: 1.将modbus目录下所有文件拷贝加入工程。 2.对modbus中的include下的mbconfig.h进行编辑,裁剪其中需要的模块。(此处我没有进行裁剪,因此选项都是默认) 3.将
[单片机]
<font color='red'>STM32</font> FreeModbus RTU从机移植以及UART配置
stm32之TFT触摸屏:通过LCD_ShowChar显示的过程分析
使用TFT触摸屏时,想要对字符串,图形或者数字进行显示时,发现他们的库函数中都有一个最重要的函数LCD_ShowChar,貌似目前很少有人分析这个函数,虽然简单但是还是有点绕的。 先贴一下这个函数的代码,由于函数显示分为叠加显示和非叠加显示,原理类似,所以只分析非叠加方式的部分应该就都懂了。 void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode) { u8 temp,t1,t; u16 y0=y; u16 colortemp=POINT_COLOR; num=num-' ';//得到偏移后的值 if(!mode) //非叠加方式 {
[单片机]
<font color='red'>stm32</font>之TFT触摸屏:通过LCD_ShowChar显示的过程分析
STM32的高级定时器里面死区的概念
“死区”的概念 PWM 脉宽调制 在电力电子中,最常用的就是整流和逆变。这就需要用到整流桥和逆变桥。以两电平为例,每个桥臂上有两个电力电子器件,比如IGBT。这两个IGBT不能同时导通,否则就会出现短路的情况。因此,设计带死区的PWM波可以防止上下两个器件同时导通。也就是说,当一个器件导通后关闭,再经过一段死区,这时才能让另一个导通。 死区,简单解释 通常,大功率电机、变频器等,末端都是由大功率管、IGBT等元件组成的H桥或3相桥。每个桥的上半桥和下半桥是是绝对不能同时导通的,但高速的PWM驱动信号在达到功率元件的控制极时,往往会由于各种各样的原因产生延迟的效果,造成某个半桥元件在应该关断时没有关断,造成功率元件烧毁。 死区就是在
[单片机]
详解STM32堆栈
学习STM32单片机的时候,总是能遇到“堆栈”这个概念。分享本文,希望对你理解堆栈有帮助。 对于了解一点汇编编程的人,就可以知道,堆栈是内存中一段连续的存储区域,用来保存一些临时数据。堆栈操作由PUSH、POP两条指令来完成。而程序内存可以分为几个区: 栈区(stack) 堆区(Heap) 全局区(static) 文字常亮区程序代码区 程序编译之后,全局变量,静态变量已经分配好内存空间,在函数运行时,程序需要为局部变量分配栈空间,当中断来时,也需要将函数指针入栈,保护现场,以便于中断处理完之后再回到之前执行的函数。 栈是从高到低分配,堆是从低到高分配。 普通单片机与STM32单片机中堆栈的区别 普通单片机启动时,不需要用b
[单片机]
详解<font color='red'>STM32</font>堆栈
stm32之nRF24L01无线模块(1):SPI2到SPI1的移植
本来要接着写滴答定时器的,但是趁热打铁写下SPI2到SPI1的移植。 为什么SPI2到SPI1的移植要放在nRF24L01模块里写呢,因为无线模块最重要的数据传输就是通过SPI实现的。为什么需要移植呢,因为即使是一个厂家的板子,不同型号之间它的无线模块引脚也有可能是不同的,顺便稿下移植,加深下理解。SPI2移植到SPI1呢,自己做的时候遇到了一些问题,就从遇到的问题顺便讲下初始化。 1.引脚问题 看stm32的手册,不知道为什么,无论在GPIO还是在SPI里都没有看到这个引脚的问题(初学者有可能移植的时候可能纳闷为什么是这些引脚),只有在引脚复用AFIO那里才提了一下,如下图 这样才知道SPI1的引脚,但是
[单片机]
<font color='red'>stm32</font>之nRF24L01无线模块(1):SPI2到SPI1的移植
stm32单片机进入休眠(STOP)模式后无法下载程序等问题解决
利用stm32单片机的休眠模式,使单片机间歇的休眠从而实现低功耗的目的。往往会出现进入休眠后无法唤醒,导致下一次程序烧不进去。通常的解决办法是:一般的开发板或单片机最小系统都会有复位键,按住复位键,点下载,然后松开复位键即可。 我遇到的问题是:误入了stm32(STM32L051C6T6)的STOP模式,又没有写入相应的唤醒方法,导致后续的程序不能下载。使用MDK5 点击load时总会出现No target connected。自己设计的最小系统又没有加入复位键。。。 有以下几种解决办法: 1、可以将单片机的NRST引脚引出来,外接复位键。(关于引脚查看可用ST官方软件STM32cubeMX,很方便) 2、通过IS
[单片机]
<font color='red'>stm32</font>单片机进入休眠(STOP)模式后无法下载程序等问题解决
STM32之NVIC中断优先级的介绍
STM32 1.说在前面 1.中断:中断就是CPU在处理一件事的时候,遇到紧急情况,所以就去响应而处理另外一件事(粗略介绍) 2.对于51而言,只有5个中断源,所以难度不算太大,但是,对于CM3内核支持256个中断(16个内核中断加240个内部中断) stm32F103而言,有着60会让可屏蔽中断,所以相对来说比较复杂 2.对于中断的部分寄存器的简单介绍 typedef struct { __IO uint32_t ISER ; /*! Offset: 0x000 Interrupt Set Enable Register */ uint32_t RESERVED0
[单片机]
<font color='red'>STM32</font>之NVIC中断优先级的介绍
STMCU应用过程中与电源相关的案例分享
我们在从事STM32单片机的应用开发及调试过程中,往往会碰到各类异常。其中有不少比例的问题跟电源有关。对于一个电子产品而言,电源部分很关键、很重要,但在实际开发调试中,我们偶尔会有意无意的忽视它。这里分享几个实际案例,以加强刺激,加深印象。 毕竟因为电源问题可能导致的异常很多很多,这里分享几个案例算是抛砖引玉,希望大家在调试中对电源方面加以重视。个人认为,往往电源出问题时导致的异常时并不太好分析。多数时候异常表现得更为诡异或没章法。 注:下面提到的案例中异常原因都与电源有关,但并不是说出现类似异常时一定是电源的原因。 下面主要分享五个基于STM32应用的案例。 案例1:STM32芯片的PLL无法正常工作。 有人使用STM3
[单片机]
STMCU应用过程中与电源相关的案例分享
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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