软件模拟I2C和硬件直接驱动I2C读取TCA95系列I2C转IO芯片分析

问题描述:

软件读取I2C转IO信号跳变,低电平时能读到高电平信号,高电平时能读到低电平信号,正确信号和错误信号的比值约10:1。

原因分析:

I2C芯片的驱动底层采用了软件模拟实现,没有防错机制,读取结果不确定。

解决方法:

修改I2C芯片驱动,改软件模拟I2C为硬件外设驱动。同时对读取的信号进行连续判读,消除读取的抖动。

详细分析:

软件模拟I2C的逻辑分析仪采样如下,可见时钟信号分布不均匀,对SDA信号的采样实际是依赖GPIO单次采样判断输入信号,无滤波处理时容易抖动。

c 复制代码
//初始化IIC
void IIC_Init(void)
{					     
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOB, ENABLE );	//使能GPIOB时钟
	   
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7); 	//PB6,PB7 输出高
}
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
u8 IIC_Read_Byte(unsigned char ack)
{
	unsigned char i,receive=0;
	SDA_IN();//SDA设置为输入
    for(i=0;i<8;i++ )
	{
        IIC_SCL=0; 
        delay_us(2);
		IIC_SCL=1;
        receive<<=1;
        if(READ_SDA)receive++;   
		delay_us(1); 
    }					 
    if (!ack)
        IIC_NAck();//发送nACK
    else
        IIC_Ack(); //发送ACK   
    return receive;
}

硬件I2C的逻辑分析仪采样如下,可见时钟信号分布均匀,对SDA信号的采样实际是依赖I2C外设判断输入信号,外设自带滤波处理能消除抖动。

而且软件模拟I2C需要占用CPU时间,一次通信约有数百微秒延时,硬件I2C则可以采用中断、DMA等方式做到无延时,释放CPU性能。

相关推荐
极客 - L U1 小时前
卡尔曼滤波从零到精通
c语言·数据结构·单片机·嵌入式硬件·mcu
AMASENSYS艾马斯2 小时前
变频器滤波器选型与EMC合规建议
驱动开发·单片机·其他·硬件工程·精益工程
码小文3 小时前
CAM350使用笔记(6)---Gerber文件铺铜间距检查
嵌入式硬件·cam350软件·cam350使用笔记
Yiran_G4 小时前
双频 Wi-Fi 6 + 蓝牙 5.4:无声讯通 WS8712 模组的开发与集成要点
网络·嵌入式硬件·物联网·智能家居
光子物联单片机5 小时前
ESP32传感器模块编程实践(一)DIY智能WIFI视频控制小车
嵌入式硬件·esp32·智能硬件·硬件
2501_922639585 小时前
率能半导体 SS6628E直流双向马达驱动芯片:20V/7A,覆盖电子锁、玩具、无线充电、机器人四大应用场景
单片机·嵌入式硬件·硬件工程
硅基造物主5 小时前
STM32 从 0 到 1 做智能家居(五):工程结构与代码骨架
stm32·单片机·嵌入式硬件·智能家居
深圳老胡5 小时前
STM32F103 硬件 SPI 与软件 IO 模拟 SPI 最高速度差异详解
笔记·stm32·单片机·代码规范·1024程序员节
smartpi_ai6 小时前
机芯智能离线语音模块实战问答:SU-03T、CI-03T、SU-63T 与 JX-A7T 高频问题排查
人工智能·单片机·嵌入式硬件·ci/cd·语音识别
2501_922639586 小时前
率能半导体 SS6635E直流双向马达驱动芯片:30V/4.5A,覆盖电子锁、玩具、无线充电、机器人四大应用场景
单片机·嵌入式硬件·硬件工程