STC8/32 软硬件I2C通讯方式扫描I2C设备地址

STC8/32 软硬件I2C通讯方式扫描I2C设备地址


📄主要用于检测挂载在I2C总线上的设备。在驱动I2C设备之前,如果能扫描到该设备,说明通讯设备可以连接的上,在提前未知I2C地址的情况下,可以方便后面的驱动代码的完善。

  • 🔬扫描测试效果:(测试mpu6050以及ssd1306 i2c oled )
    在这里插入图片描述
    在这里插入图片描述
⚡需要同时支持C51和C251 Keil环境编译,需要安装两个对应的支持包才行。STC8属于C51编译环境,STC32属于C251编译环境。

🛠STC32/STC8工程配置选择说明

  • 🔖STC32和STC8共用一个工程,但是选择配置不同
    在这里插入图片描述
  • 🌿另外,需要修改对应型号的宏
    在这里插入图片描述

📗软硬件I2C通讯方式选择配置

  • 🌿启用对应的相关宏
    在这里插入图片描述

⏰主频时钟频率选择和配置

  • 🌿软件代码配置:
    在这里插入图片描述
  • 🔨STC-ISP烧录时,参数配置:
    在这里插入图片描述
  • 🌟软件代码配置的时钟频率一定要和stc-isp烧录时配置的时钟频率一致,才能正常串口打印。

📙其他操作说明

  • 🌿针对选择STC其他型号,相关配置一定要选择正确才行。例如stc32配置如下:
    在这里插入图片描述
  • ✨推荐存储模式选择XSmall模式,不要选择Tiny模式,否则串口输出的信息是乱码。

📚工程源码

链接:https://pan.baidu.com/s/11VXO4Ib3t8tCZ3maHTSEHw?pwd=j09s 
提取码:j09s
### 使用STC8H8K64U单片机进行I2C协议的软件模拟 对于不具备专用硬件I2C模块的情况,可以通过编程来实现I2C总线协议的位操作方法。这种方法被称为“bit-banging”,即通过GPIO引脚手动控制SCL(串行时钟)和SDA(串行数据)信号线的状态变化。 #### 初始化设置 为了确保能够正确地启动I2C通信,在初始化阶段需定义好参与I2C传输过程中的两个主要IO端口——SCL与SDA,并将其配置成推挽输出模式以便于后续的操作: ```c #define SDA_PIN P1_0 // 定义SDA对应的物理引脚 #define SCL_PIN P1_1 // 定义SCL对应的物理引脚 void IIC_Init(void){ SDA_PIN = 1; // 设置SDA为高电平 SCL_PIN = 1; // 设置SCL为高电平 /* 配置SDA, SCL为推挽输出 */ P1M1 &= ~((unsigned char)(BIT(0)|BIT(1))); P1M0 |= (unsigned char)(BIT(0)|BIT(1)); } ``` #### 启动条件函数 当要发起一次新的读写请求之前,先发出起始信号通知从设备准备接受命令;这通常意味着将SDA由高变低而此时保持SCL处于高电平状态: ```c void IIC_Start(void){ delay_us(5); // 延迟一段时间以稳定电压 SDA_PIN = 1; SCL_PIN = 1; delay_us(5); SDA_PIN = 0; // 发送START condition delay_us(5); SCL_PIN = 0; } ``` #### 结束条件函数 结束当前事务时,则需要发送停止信号给对方表明本次交流已经完成;具体做法是在维持住SCL为高的前提下让SDA恢复到高电平位置: ```c void IIC_Stop(void){ SDA_PIN = 0; SCL_PIN = 1; delay_us(5); SDA_PIN = 1; // 发送STOP condition delay_us(5); } ``` #### 数据收发功能 针对每一个字节的数据交换都遵循着特定的时间序列来进行同步化处理,包括但不限于ACK/NACK应答机制等细节部分。这里给出一个简单的例子展示如何逐位传送一位信息并等待确认回应的过程: ```c // 发送一字节数据 Bit IIC_WriteByte(unsigned char dat){ unsigned char i=0; Bit ack; for(i=0;i<8;i++){ SCL_PIN = 0; if(dat & 0x80){ SDA_PIN = 1; }else{ SDA_PIN = 0; } dat <<= 1; delay_us(5); SCL_PIN = 1; delay_us(5); } // 获取ACK信号 SDA_PIN = 1; SCL_PIN = 0; delay_us(5); SCL_PIN = 1; delay_us(5); ack = !SDA_PIN; SCL_PIN = 0; return ack; } // 接受一字节数据 unsigned char IIC_ReadByte(Bit ack){ unsigned char i=0,receive_data=0; SDA_PIN = 1; for(i=0;i<8;i++) { receive_data <<= 1; SCL_PIN = 0; delay_us(5); SCL_PIN = 1; delay_us(5); if(SDA_PIN)receive_data++; } if(!ack){ SDA_PIN = 0; // 返回NACK }else{ SDA_PIN = 1; // 返回ACK } SCL_PIN = 0; delay_us(5); SCL_PIN = 1; delay_us(5); SCL_PIN = 0; return receive_data; } ``` 上述代码片段展示了基于STM8系列微控制器平台上的通用I2C软模拟流程[^1]。值得注意的是,实际应用中可能还需要考虑更多因素如噪声抑制、错误检测以及提高效率等方面优化措施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值