IIC总线介绍及硬件设计

 IIC总线为两线制,SCL和SDA,SCL为时钟线,SDA为数据线,很明显,因为数据线只有1条,收发共用,所以IIC为半双工工作方式。

IIC总线上可以挂载很多设备,每个设备都会有自己独一无二的地址,其中一个为主设备,其余为从设备。设备地址有8位,一位为广播地址,所以有效设备地址共7位,可表示2e7=128个,但0X00不用,所以只表示127个设备,即一条IIC总线上最大可以存在1个主设备和126个从设备。

主设备要与某个从设备通信时,会在数据线上发送从设备地址,从设备检测总线上的设备地址是否与自身一致,若是,则给主设备返回应答信号,通信开始。

IIC硬件设计相当简单,只需要注意以下两点:

1、IIC总线上的SCL和SDA线在设计时往往需要加上拉电阻,其原因后文详细解释。

2、要保证通信双方的IIC总线电平一致,不一致的话要加电平转换电路,后文详解。

为什么要加上拉电阻,要回答这个问题,首先得了解什么是开漏输出

开漏输出,甭管各种花里胡哨的解释,就记住一句话:开漏输出只能输出低电平,无法直接输出高电平,要想输出高电平,就得依靠外部的上拉电阻才能实现。开漏输出具体的电路有兴趣的可以自行学习研究。

通信就是发送0和1的过程,也就是要有高低电平的输出,IIC设备或芯片的SCL和SDA引脚大多都为开漏输出,为了实现总线上逻辑1的发送,外部就得加上拉电阻。

研究完上一个问题,产生了新问题,上拉电阻用多大&#x

### IIC协议硬件实现原理 IIC(Inter-Integrated Circuit)是一种由飞利浦公司开发的串行通信总线,主要用于短距离、低速率的数据传输。它采用两根双向信号线进行通信:SDA(Serial Data Line,数据线)和SCL(Serial Clock Line,时钟线)。以下是关于IIC协议硬件实现的相关细节: #### 1. 硬件IIC的工作机制 硬件IIC是由芯片内置的外设模块支持的一种通信方式。该模块通常具有专门的寄存器组,用于配置和管理IIC通信过程[^1]。这些寄存器可以设置波特率、从机地址以及启动/停止条件等参数。 在实际应用中,开发者只需调用特定的API函数来初始化和操作IIC接口,而无需手动模拟时序逻辑或控制电平状态。这种方式显著提高了编程效率并减少了错误发生的可能性[^4]。 #### 2. 物理层特性 从物理连接角度来看,IIC仅需两条线路即可完成多设备之间的通讯——即上述提到过的SDA与SCL[^2]。为了确保可靠性和兼容性,在设计过程中需要注意以下几点: - **开漏输出结构**:由于IIC使用的是开漏驱动模式,因此需要在外围电路中加入上拉电阻以维持正常电压水平。 - **速度等级划分**:标准模式下最大频率可达100kHz;快速模式则提升至400kHz;高速模式更是达到了3.4MHz。不同应用场景可根据需求选择合适的速度级别。 #### 3. 底层驱动架构概述 对于基于微控制器的应用而言,构建有效的IIC底层驱动程序至关重要。这不仅涉及到如何正确配置相关寄存器,还包括处理中断请求及异常状况等方面的内容[^3]。 具体来说,当主机想要向某个从属器件发起一次完整的读写事务时,整个流程大致遵循以下几个阶段展开(假设为典型的主控端行为): - 发送Start Condition; - 输出目标Slave Address加上方向位指示(Read or Write); - 如果是Write,则连续传送若干字节直至全部发送完毕为止; - 若涉及后续Read动作,则再次发出Restart Command切换角色后再执行相应步骤直到最后一步Stop Signal的到来标志着当前会话正式结束。 下面给出一段简单的伪代码表示这一序列的操作方法: ```c void iic_transfer(uint8_t slave_addr, uint8_t *data_out, size_t out_len, uint8_t *data_in, size_t in_len){ // Start condition IIC_Start(); // Send address and direction bit (write) while(!IIC_WriteByte(slave_addr << 1)); // Transmit data bytes if any for(size_t i=0;i<out_len;i++) { while(!IIC_WriteByte(data_out[i])); } if(in_len > 0){ // Restart with read mode enabled IIC_Restart(); // Resend the same addr but set LSB to indicate reading now. while(!IIC_WriteByte((slave_addr<<1)|1)); for(size_t j=0; j<in_len;j++){ *(data_in+j)=IIC_ReadByte(j==(in_len-1)?ACK:NACK); } } // End communication session by issuing stop cmd finally. IIC_Stop(); } ``` 以上仅为示意性质的功能框架描述,并未考虑诸多细枝末节点如延时调整等问题的实际影响因素。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值