| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> 你想知道的IIC通讯! -> 正文阅读 |
|
[嵌入式]你想知道的IIC通讯! |
目录 简述集成电路互连总线I2C用于连接嵌入式处理器及外围器件,是广泛采用的一种串行半双工传输总线标准。主动发起数据传输操作的I2C器件为主控器件。由飞利浦公司在上世纪八十年代发展,用于嵌入式处理器连接外围低速设备的一种通信总线。 (IIC(Inter-Integrated Circuit(集成电路总线))_百度百科 (baidu.com)) I2C总线接口少,控制方式简单,器件封装紧凑,通信速率一般100kb/s、400kb\s,高速I2C速率可达3.4Mb/s以上。另外,I2C通信设备都有自己的地址,以确保数据传输的稳定性。 I2C总线仅两条信号线:数据线SDA,数据必须在时钟高电平期间保持稳定;时钟线SCL,为I2C通信提供时序服务,按位传输数据,正常的数据位转换必须是在时钟周期的低电平内发生。。一般嵌入式处理器供I2C总线接口四种模式:主发送模式、主接收模式、从发送模式和从接受模式。SCL和SDA与其他I1C总线处理器或设备同名端相连,在SCL和SDA线上要上拉电阻,大小由速度和容性负载决定一般在3.3K-10K之间。 软件IIC:软件IIC通信是指处理器采用两个I/O端口模拟出来的IIC,用软件控制管脚状态以模拟I2C通信波形,软件模拟寄存器的工作方式。 ? 硬件IIC:硬件I2C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的,硬件(固件)I2C是直接调用内部寄存器进行配置。效率相比,硬件IIC高于软件IIC。 关于I2C操作时序,以下通过STM32驱动展示: (1)启动和停止条件SCL和SDA两信号线同时拉高后,SDA在SCL信号保持高电平期间由高电平转换为低电平,表示启动总线操作,起始信号。 void IIC_Start(void)//起始信号 { SDA_OUT(); ? ? //sda信号线输出模式, IIC_SDA=1; ? //时钟线、信号线拉高 ? IIC_SCL=1; delay_us(4); IIC_SDA=0; ? //START:when CLK is high,DATA change form high to low delay_us(4); IIC_SCL=0;//钳住I2C总线,准备发送或接收数据 } 类似,A在SCL信号保持高电平期间由低电平转换为高电平,表示停止总线操作,停止信号。SDA和SCL信号线,由低电平转换为高电平,总线工作停止,恢复为空闲状态。 void IIC_Stop(void)//停止信号 { SDA_OUT(); //sda线输出 IIC_SCL=0; IIC_SDA=0; //STOP:when CLK is high DATA change form low to high delay_us(4); IIC_SCL=1; IIC_SDA=1; //发送I2C总线结束信号 delay_us(4); ? } (2)数据传输格式对于从设备,I2C通信设备一般在出厂时设定了器件的七位从地址(address) 其写地址为 ( address<<1 ),读地址为 ( address<<1 ) + 1 。 而若为八位地址,则一般器件地址就表示写地址。 数据位传送时,保持高位在前,低位在后。I2C总线通信时可分为单字节传输和多字节传输,单字节和多字节其实本质上没有什么区别,无非就是停止位后移,在每个数据字节传输完毕时,给予应答信号作为双方通讯确定标志。 通信起始信号发出,主发送设备发出从地址设备七位地址,选中从设备,接着发出一位读/写位,表示操作类型。 I2C通信数据量:Trans_data = Start (起始)+ n * Bytes(数据)+ n * ack(应答) + Stop(停止) (3)应答(ACK)信号传达主设备每对一字节发送,会停下来发送等待应答信号,就好比聊天时,等待对方回应,确定对方的在线状态。 //等待应答信号到来 //返回值:1,接收应答失败 ; 0,接收应答成功 u8 IIC_Wait_Ack(void) { u8 ucErrTime=0; SDA_IN(); ? ? //SDA设置为输入,接收从设备信号 ? IIC_SDA=1;delay_us(1); ? IIC_SCL=1;delay_us(1); while(READ_SDA) { ucErrTime++; if(ucErrTime>250) { IIC_Stop(); ? //接收失败,判定设备离线,结束通信 return 1; } } IIC_SCL=0;//时钟输出0 ? return 0; ? } ACK信号出现在SCL信号的第九个时钟脉冲上,有效应答ACK在SDA上呈现低电平。 //产生ACK应答 void IIC_Ack(void) { IIC_SCL=0; SDA_OUT(); IIC_SDA=0; delay_us(2); IIC_SCL=1; delay_us(2); IIC_SCL=0; } //不产生ACK应答 ? ? void IIC_NAck(void) { IIC_SCL=0; SDA_OUT(); IIC_SDA=1; delay_us(2); IIC_SCL=1; delay_us(2); IIC_SCL=0; } (4)读/写操作以写入数据为例示图: ? ?发送模式下,数据发送后,I2C接口将处于等待状态,SCL线保持为低电平,直到有新数据写入发送寄存器,SCL线才被释放,继续发送数据。 //IIC发送一个字节 //返回从机有无应答 //1,有应答 ;0,无应答 ? void IIC_Send_Byte(u8 txd) { ? ? ? ? ? ? ? ? ? ? ? ? ? u8 t; ? SDA_OUT(); ? ? ? IIC_SCL=0;//拉低时钟开始数据传输 ? for(t=0;t<8;t++) ? { ? ? ? ? ? ? ? ? ? ? IIC_SDA=(txd&0x80)>>7; ? ? ? txd<<=1; ? delay_us(2); ? IIC_SCL=1; delay_us(2); IIC_SCL=0; delay_us(2); ? } } ? ? 接收模式下,I2C接口接收到数据后,将处于等待状态,直到接收寄存器内容读取后,才释放SCL信号。 (5)I2C总线仲裁I2C总线属于支持可多主多从的总线,允许拥有一个或多个主发送设备和若干从设备,因此,在多主多从情况下,对于总线的仲裁是不可或缺的。 总线在被启动后,没发送一个数据位时都要对自己的输出电平进行检测,若检测到电平和自己发出的电平相同,就会继续占用总线。仲裁发生在SCL为高电平期间。 另外,总线仲裁遵循低电平优先原则,I2C总线仲裁机制是靠自身接口的特殊结构实现。 (6)异常中断条件处理没有从设备对主机发出的地址进行确认时,SDA线将被拉高,主控器件将发出停止信号终止传送。 根据IIC协议,IIC从机可以在通讯过程中通过拉低SCL线迫使主机进入等待状态,当从机准备好之后再释放SCL线继续数据传输,SCL被拉低进入中断,需外部操作释放。 |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/28 16:57:04- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |