stm32---iic通信

发布者:数字冒险最新更新时间:2018-06-03 来源: eefocus关键字:stm32  iic通信 手机看文章 扫描二维码
随时随地手机看文章

一. 技术性能:
工作速率有100K和400K两种;
支持多机通讯;
支持多主控模块,但同一时刻只允许有一个主控;      
由数据线SDA和时钟SCL构成的串行总线;
每个电路和模块都有唯一的地址;                    
每个器件可以使用独立电源

clip_image004


二. 基本工作原理:
以启动信号START来掌管总线,以停止信号STOP来释放总线;
每次通讯以START开始,以STOP结束;
启动信号START后紧接着发送一个地址字节,其中7位为被控器件的地址码,一位为读/写控制位R/W,R/W位为0表示由主控向被控器件写数据,R/W为1表示由主控向被控器件读数据;
当被控器件检测到收到的地址与自己的地址相同时,在第9个时钟期间反馈应答信号;
每个数据字节在传送时都是高位(MSB)在前;

三.通信过程:
写通讯过程:
1. 主控在检测到总线空闲的状况下,首先发送一个START信号掌管总线;
2. 发送一个地址字节(包括7位地址码和一位R/W);
3. 当被控器件检测到主控发送的地址与自己的地址相同时发送一个应答信号(ACK);
4. 主控收到ACK后开始发送第一个数据字节;
5. 被控器收到数据字节后发送一个ACK表示继续传送数据,发送NACK表示传送数据结束;
6. 主控发送完全部数据后,发送一个停止位STOP,结束整个通讯并且释放总线;


读通讯过程:
1. 主控在检测到总线空闲的状况下,首先发送一个START信号掌管总线;
2. 发送一个地址字节(包括7位地址码和一位R/W);
3. 当被控器件检测到主控发送的地址与自己的地址相同时发送一个应答信号(ACK);
4. 主控收到ACK后释放数据总线,开始接收第一个数据字节;
5. 主控收到数据后发送ACK表示继续传送数据,发送NACK表示传送数据结束;
6. 主控发送完全部数据后,发送一个停止位STOP,结束整个通讯并且释放总线;



四. 总线信号时序分析
1. 总线空闲状态
SDA和SCL两条信号线都处于高电平,即总线上所有的器件都释放总线,两条信号线各自的上拉电阻把电平拉高;
2. 启动信号START
时钟信号SCL保持高电平,数据信号SDA的电平被拉低(即负跳变)。启动信号必须是跳变信号,而且在建立该信号前必修保证总线处于空闲状态;
3. 停止信号STOP
时钟信号SCL保持高电平,数据线被释放,使得SDA返回高电平(即正跳变),停止信号也必须是跳变信号。
4. 数据传送
SCL线呈现高电平期间,SDA线上的电平必须保持稳定,低电平表示0(此时的线电压为低电压),高电平表示1(此时的电压由元器件的VDD决定)。只有在SCL线为低电平期间,SDA上的电平允许变化。
5. 应答信号ACK
I2C总线的数据都是以字节(8位)的方式传送的,发送器件每发送一个字节之后,在时钟的第9个脉冲期间释放数据总线,由接收器发送一个ACK(把数据总线的电平拉低)来表示数据成功接收。
6. 无应答信号NACK
在时钟的第9个脉冲期间发送器释放数据总线,接收器不拉低数据总线表示一个NACK,NACK有两种用途:
a. 一般表示接收器未成功接收数据字节;
b. 当接收器是主控器时,它收到最后一个字节后,应发送一个NACK信号,以通知被控发送器结束数据发送,并释放总线,以便主控接收器发送一个停止信号STOP。

五. 寻址约定
地址的分配方法有两种:
1. 含CPU的智能器件,地址由软件初始化时定义,但不能与其它的器件有冲突;
2. 不含CPU的非智能器件,由厂家在器件内部固化,不可改变。

高7位为地址码,其分为两部分:
1. 高4位属于固定地址不可改变,由厂家固化的统一地址;
2. 低三位为引脚设定地址,可以由外部引脚来设定(并非所有器件都可以设定);


另,按照一哥们的告诉我的理解:

通信过程如下:

(1)通信过程的开始,首先时钟线SCL在一个时钟周期的高电平期间内,如果此时数据线SDA有从高电平跳到低电平的负条边沿,则标志着通信过程的开始。


(2)地址数据的发送,通信过程开始后,即在这个开始的时钟周期后,随后的8个时钟周期内,开始正常采样数据线SDA上的数据。即时钟周期高电平时,数据线上的高低电平均有效,并被正确译为八位二进制数。通信开始的时钟周期后的这八个时钟周期采样的数据,各个从设备都会收到,然后与自己的地址比较。这就相当于一个握手信号。

(3)真正数据的发送,在上述某个从设备发现自己的地址匹配时,便在下个时钟的高电平来之前将数据线SDA的电平拉低置成低电平,即保证在下个时钟的高电平阶段,SDA的电平始终为低。这样,以后的数据再发送,其他设备都不会接受了,只有该从设备会采样接受。

(4)通信过程的结束。与通信的开始一样,在SCL为高电平的情况下,是数据线SDA由低电平跳至高电平,即有一个正条边沿。此时,标志通信结束。

例程:

/************************************
函数名:IIC_Wait_Ack
描述  :主机等待从机的应答
输入  :无
输出  :u8   0/1(0:应答成功,1:应答失败)
备注  :
***********************************/
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0; //应答计数器  
SDA_IN();               //SDA设置为输入  
IIC_SDA=1;            //SDA置高
delay_us(1);                          //可靠延时
IIC_SCL=1;  //拉低SCL
delay_us(1);          //可靠延时
while(READ_SDA)//当:检测到SDA为高电平1时,循环计数
{
ucErrTime++;
if(ucErrTime>250)

//SDA高电平时间大于250时,应答失败,主机主动发送通信停止信号,停止此次通信,并且返回从机应答失败标志1
{
IIC_Stop();
return 1;
}
}
IIC_SCL=0;  //SDA高电平时间不大于250时,从机完成应答后,拉低SCL,并且返回从机应答成功标志位0   
return 0;  

/************************************
函数名:IIC_Ack
描述  :Ack应答
输入  :无
输出  :无
备注  :主机拉低SDA来应答从机 或 从机拉低SDA来应答主机
***********************************/
void IIC_Ack(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=0;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
/************************************
函数名:IIC_NAck
描述  :non ack应答
输入  :无
输出  :无
备注  :主机置高SDA来应答从机 或 从机置高SDA来应答主机
***********************************/    
void IIC_NAck(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=1;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}


关键字:stm32  iic通信 引用地址:stm32---iic通信

上一篇:STM32 串口初始化时的BUG
下一篇:STM32 串口中的硬件BUG,请注意!

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

stm32开发常用的软件和语言介绍
STM32 开发环境(工具)介绍 一、Keil 软件介绍 Keil C51 是美国 Keil software 公司出品的 51 系列兼容单片机 C 语言软件开发系统。 KeilC51 软件提供了丰富的库数据和功能强大的集成开发调试工具 μVision2 全是 windows 界面。 只要看一下编译后生成的汇编代码, 就能体会到 keil C51 生成的目标代码的效率之高, 多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。 Keil的版本目前是 V7 版本,他是很优秀的 8051C 编译器。 安装 Keil C51 对系统的要求比较低, 一般的 windows 系统就可以了。 安装过程也很
[单片机]
STM32的FCLK , HCLK, PCLK
FCLK、HCLK、PCLK FCLK: 为CPU核供给时钟信号,我们所说的cpu主频为200MHz,就是指的这个时钟信号,相应的,1/Fclk即为cpu时钟周期 HCLK: 为AHB bus peripherals供给时钟信号,AHB为advanced high-performance bus PCLK: 为APB bus peripherals供给时钟信号,APB为advanced peripherals bus
[单片机]
玩转STM32CubeMX | STM32内部FLASH
1.内部FLASH简介 之前的文章中介绍过STM32F1利用SPI与外部FLASH(W25QXX芯片)通讯的例程,本例程将介绍STM32F1的内部FLASH,通过内部FLASH实现数据读写操作。 不同型号的STM32,其FLASH容量也有所不同,最小的只有16K字节,最大的则达到了1024K字节。此处我们使用的是STM32F103ZET6,其FLASH容量为512K字节,属于大容量产品,大容量产品的闪存模块组织图如下图示 STM32F1的闪存模块由:主存储器、信息块和闪存存储器接口寄存器3部分组成 *主存储器:用来存放代码和数据常量,起始地址是0x08000000,BOOT0和BOOT1都接GND时,就是从该起始地址运行
[单片机]
玩转STM32CubeMX | <font color='red'>STM32</font>内部FLASH
stm32中断无电平触发的解决办法
  这几天在用stm32读取FPGA中FIFO里的数据,遇到了不少的问题。这里就其中的一个问题写写,比较简单,就当做是打发一下时间。   问题就是,stm32的中断没有电平触发方式。stm32读取FIFO中的数据,当FIFO数据非空时给stm32中断信号——将对应的中断线拉高/低,这时stm32取FIFO中数据直至读完,FIFO将中断线电平拉低/高。然后当FIFO中又有数据时,在次发出中断信号,如此循环。   结合图说。这里简单看看FIFO的结构,如图一所示。当FIFO数据非空,给stm32信号,比如将wr_full这个引脚拉高/低。然后就让这个信号触发stm32进入中断函数中去读数据,直到stm32将数据读出后拉低/高。
[单片机]
<font color='red'>stm32</font>中断无电平触发的解决办法
STM32启动文件分析
想要读懂启动文件,需要一些基本的汇编基础。 1 在汇编语言中,注释是 ; 2 汇编ARM指令DCD DCD ( DCDU ) 用于分配一片连续的字存储单元并用指定的数据初始化。 语法格式: 标号 DCD (或 DCDU ) 表达式 DCD (或 DCDU )伪指令用于分配一片连续的字存储单元并用伪指令中指定的表达式初始化。其中,表达式可以 为程序标号或数字表达式。 DCD 也可用 “ & ” 代替。 用 DCD 分配的字存储单元是字对齐的,而用 DCDU 分配的字存储单元并不严格字对齐。 使用示例: DataTest DCD 4 , 5 , 6 ;分配一片连续的字存储单元并初始化。 3
[单片机]
STM32总结一 STM32三种点亮LED灯方式的不同之处
STM32点亮LED灯有很多种方法。第一种是操作寄存器来点亮LED灯,(以GPIOC的第一个LED为例)操作的方法是首先在中文手册,首先要声明的是,手册里面看到的地址,都是字节,表示第多少多少个字节,然后这个数字对应一个字节位,所以每一个32位的寄存器占四个字节,找到block2(这个是外设区,所有的外设地址都在这个区)的基地址,然后加上第一段偏移地址,就越过APB1总线的内存区,到达了APB2总线这个区的基地址。然后再加上相对于APB2的偏移地址就可以定位出某个特定外设的基地址,这里所指的是GPIOC端口的基地址,然后再在这个端口外设基地址的基础上,加上相应的偏移地址,就可以定义出这个端口的寄存器地址,这些寄存器是紧紧的挨着的,
[单片机]
<font color='red'>STM32</font>总结一 <font color='red'>STM32</font>三种点亮LED灯方式的不同之处
如何利用STM32单片机发送字符串
一、STM32有自己的字符发送函数。 void PC_SendChar(uint8_t DataToSend) { USART_SendData (USART1 ,DataToSend); while(USART_GetFlagStatus (USART1 ,USART_FLAG_TC )!=SET ); } 二、发送字符串函数是在字符发送函数的基础上编写的 void PC_SendString(uint8_t *str) { while(*str) { PC_SendChar (*str); str++; } } 三、发送字符串示例 PC_SendString((u8*) Welcome to the NDIR wo
[单片机]
STM32开发者社区:从这里开启你的STM32之旅!小白和PRO都友好
当面对STM32Cube生态系统这样一个庞大而丰富的开发世界时,工程师难免会产生疑问,从哪里开始才好? ST的许多合作伙伴和客户都希望有更多的产品能够利用STM32Cube开发环境。开发人员很享受开发环境的图形用户界面和工具的易用性,如STM32CubeMX、免费的STM32CubeIDE以及许多软件包、驱动程序和中间件,这些都有助于更快地将产品推向市场。随着越来越多的企业选择ST的产品,越来越多的工程师在ST的生态系统中迈出了第一步。为了降低开发人员的进入门槛,ST推出了STM32开发者社区。开发者社区如何为开发团队提供帮助,ST如何将STM32生态系统整合在一起?让我们详细聊聊。 STM32开发者社区 为开
[单片机]
<font color='red'>STM32</font>开发者社区:从这里开启你的<font color='red'>STM32</font>之旅!小白和PRO都友好
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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