STM32 模拟IIC主设备 非IIC静默模式

这篇博客介绍如何使用STM32软件模拟IIC主设备,而非使用硬件IIC,以解决移植不便的问题。文章包含IIC起始和停止逻辑、数据发送与接收的函数实现,以及具体的操作步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//为啥用软件模拟IIC而不用硬件IIC? 除了ST的IIC模块本身问题,还因为硬件IIC移植不方便,在不同的MCU中无法通用。

/****************************Copyright(c)*********************************************                                    

**--------------文件信息--------------------------------------------------------------

** 文 件 名:

** 创 建 人: 温世坚(wenshijian4@163.com)

** 创建日期: 2015年9月18日

** 描    述:

**---------- 版本信息------------------------------------------------------------------

** 版    本: V2.92

** 说    明:

**-------------------------------------------------------------------------------------

**************************************************************************************/

#include"IIC_Recv.h"

/****************************************************************************************

** 函数名称: IIC_ReadSilent

** 功能描述: 读取IIC数据,并返回数据长度及数据内容

** 参    数: *IIC_Recv :用于接收IIC数据的数组

 

** 返 回 值: 接收到的数据长度(以字节为单位)      

** 日   期: 2015年4月17日

**---------------------------------------------------------------------------------------

** 修 改 人: 温世坚

** 日   期:

**--------------------------------------------------------------------------------------

****************************************************************************************/

 

unsigned char IICx_Lens;

unsigned char ibit,Sda;

unsigned intSCL_H_Len,SCL_L_Len;  

//简单延时函数1

void IIC_Delay(void)

{

    u8 time=40;//60;//减少延时时间,20160707,待测试,WEN

    while(time--);

}

//简单延时函数2

void IIC_DelayUS(u8 us)

{

    while(us--);

}

//IIC 起始逻辑

u8 IIC_Start(void)

{

    SCL_H;

    SDA_H;

### I2C协议一主多从实现方式 I2C(Inter-Integrated Circuit)是一种广泛应用于嵌入式系统的同步串行通信协议,支持一主多从的通信架构。在这种模式下,主机负责控制整个通信过程,而多个从机可以通过唯一的地址被识别并参与通信。 #### 主设备与从设备的角色定义 在I2C通信中,主设备发起所有的数据传输,并提供时钟信号[SCL]来协调从设备的操作[^1]。从设备则是被动响应主设备请求的一方,在接收到匹配其地址的信息帧后才进入工作状态[^3]。 #### 地址分配机制 为了区分不同的从设备,I2C标准规定了7位或10位寻址方案,其中每台连接到同一总线上的从器件都拥有独一无二的硬件设定地址。当主节点发送启动条件之后紧接着发出目标外设的特定地址字节时,只有那个具有相应ID号的目标会做出回应ACKnowledge确认脉冲;其他未选中的单元保持静默不干扰正常操作流程继续下去直到停止标志出现为止[^2]. #### 软件层面处理方法 对于像STM32这样的微控制器来说,可以利用内部集成好的I2C接口模块完成基本功能配置比如波特率设置、中断使能等等准备工作之外还需要编写额外的应用层逻辑代码去管理复杂的场景需求例如轮询检测当前是否有可用资源可供访问以及如何正确解析收发缓冲区内的始二进制流等内容. 下面给出一段简单的伪代码展示了一个典型的写入单个寄存器的例子: ```c void I2C_WriteRegister(uint8_t slaveAddress,uint8_t regAddr,uint8_t data){ // 发送开始信号 I2C_Start(); // 发送从机地址(写方向) while(!I2C_SendAddress(slaveAddress << 1 | 0)); // 发送要写的寄存器地址 while(!I2C_SendByte(regAddr)); // 发送实际的数据值 while(!I2C_SendByte(data)); // 结束本次通讯 I2C_Stop(); } ``` 同样地读取远程存储位置的过程也会遵循类似的步骤只是最后阶段改成了接收来自对方返回过来的新鲜采样数值而已. #### 硬件连线注意事项 由于存在多个潜在竞争者试图同时抢占公共媒介使用权的情况发生概率增加因此建议适当调整拉高电阻阻值大小从而减少不必要的电气冲突现象影响整体稳定性表现效果最佳范围通常介于4kΩ至10kΩ之间视具体情况灵活选用即可满足大多数常规应用场景的要求. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值