STM32——I2C通讯(软件模拟)

I2C概念

I2C:Inter-Integrated Circuit(内部集成电路)

Philps公司80年代初期开发的,引脚少,硬件实现简单,可扩展性广泛地使用在系统内多个集成电路(IC)间的低速通讯

简单的双向两线制总线协议标准,支持同步串行半双工通讯。

标准模式传输速率为100kbit/s,快速模式为400kbit/s,高速模式下可达3.4Mbit/s,目前大多I2C设备尚不支持高速模式。

物理层

SCL:串行时钟总线,用于数据收发同步

SDA:串行数据总线,用高低电平表示数据

可连接多个IC通讯设备,支持一主多从也支持多主多从

每个设备都有唯一的地址,主机通过这个地址与从机通信

总线通过上拉电阻接到电源。设备空闲时,输出高阻态,当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平

协议层

位传输 作为串行通信,是按照位进行传输,一般是高位先行
起始信号 当SCL是高电平时,SDA线从高电平向低电平切换。
停止信号 当SCL是高电平时,SDA线从低电平向高电平切换

复制代码
//起始信号
void iic_start(void)
{
/* SCL为高电平期间,SDA从高电平往低电平跳变*/
IIC_SDA(1);
IIC_SCL(1);
iic_delay();
IIC_SDA(0);
iic_delay();
IIC_SCL(0);
iic_delay();/*钳住总线,准备发送/接收数据
}

//结束信号
void iic_stop (void)
/* SCL为高电平期间,SDA从低电平往高电平跳变*/
IIC_SDA(0);
iic_delay();
IIC_SCL(1);
iic_delay();
IIC_SDA(1);/*发送总线停止信号*/
iic_delay();
}

传输地址 主机通过SDA信号线发送设备地址(SLAVE_ADDRESS)来查找从机

PC协议规定设备地址可以是7位或10位,实际中7位的地址应用比较广泛。

紧跟设备地址的一个数据位用来表示数据传输方向,它是数据方向位(R/W),第 8位或第11位。

数据方向位为"1"时表示主机由从机读数据,该位为"0"时表示主机向从机写数据。

数据的有效性

SDA高或低电平状态只有在SCL时钟信号是低电平时才能改变

SDA线上的数据必须在时钟的高电平周期保持稳定

复制代码
//发送一个字节
void iic_send_byte (uint8_t data)
{
    for(uint8_t t = 0; t < 8; t++)
    {
        /*高位先发*\
        IIC_SDA((data &0x80)>> 7);
        iic_delay();
        IIC_SCL(1);
        iic_delay();
        IIC_SCL(0);
        data<<=1;/* 左移1位用于下一次发送
    }
    IIC_SDA(1);/*发送完成,主机释放SDA线*
}



//读取一个字节数据
uint8_t iic_read_byte(uint8_t ack) /* 1:ack 0:nack*/
{
    uint8_t receive = 0;
    for(uint8_t t = 0; t < 8; t++)
        {
            /*高位先输出,先收到的数据位要左移*
            receive <<= 1;
            IIC_SCL(1);
            iic_delay();
            if(IIC_READ_SDA) receive++;
            IIC_SCL(0);
            iic_delay();
        }
    if(!ack) iic_nack();
    else iic_ack() ;
    return receive;
}

响应

接收方接收到数据后,有两种响应

1.应答响应。给发送方一个低电平

2.非应答响应。给发送方一个高电平

复制代码
//等待应答
uint8_t iic_wait_ack<(void))/* return 1:fail 0:succeed*/
{
    IIC_SDA(1);/*主机释放SDA线*
    iic_delay();
    IIC_SCL(1);/*从机返回ACK*/
    iic_delay();
    if(IIC_READ_SDA)/* SCL高电平读取SDA状态*/
        {
            iic_stop();/*SDA高电平表示从机nack*/
            return 1;
        }
    IIC_SCL(0);/*SCL低电平表示结束ACK检查*/
    iic_delay();
    return 0;
}


//发送应答
void iic_ack(void)
{
    IIC_SCL(0)
    iic_delay();
    IIC_SDA(0);/*数据线为低电平,表示应答
    iic_delay();
    IIC_SCL(1);
    iic_delay();
}

//发送非应答
void iic_ack(void)
{
    IIC_SCL(0)
    iic_delay();
    IIC_SDA(1);/*数据线为高电平,表示非应答
    iic_delay();
    IIC_SCL(1);
    iic_delay();
}
相关推荐
xiangw@GZ8 小时前
纽扣电池型号
嵌入式硬件
优信电子8 小时前
Raspberry Pi Pico 硬件开发 —— 第二课:MicroPython 从入门到项目实践(LED篇)
单片机·嵌入式硬件·树莓派·micropython·pico·入门教学
黑妹天下第一乖8 小时前
第 12 讲:阿加犀 AidLux 部署与量产——把端侧 AI 应用做成 7×24 产品
人工智能·嵌入式硬件·数码相机·接口隔离原则·iot
xiangw@GZ9 小时前
Type‑C USB DRD 电路
单片机·嵌入式硬件
常州晟凯电子科技10 小时前
sigmaStar SSC305DE/SSC308开发笔记之开发环境搭建和SDK编译
人工智能·笔记·嵌入式硬件·物联网·性能优化·视频编解码
沐欣工作室_lvyiyi10 小时前
基于单片机的跑步机控制系统设计(论文+源码)
c语言·单片机·嵌入式硬件·课程设计·keil·跑步机设计
黑妹天下第一乖11 小时前
第 11 讲:阿加犀 AidLux 多组件综合实战——端侧“智能摄像头解说“全链路
人工智能·嵌入式硬件·语言模型·自然语言处理·iot
py有趣11 小时前
硬件SPI和软件模拟SPI在配置方面的一点区别
c语言·stm32·单片机
AUTO_1507567596511 小时前
【KT70022】昆腾微 单片音频编解码器
单片机·音频
LCG元11 小时前
STM32F103 GPIO 翻转方式耗时实测:CRL/CRH 逐位拆解、BSRR 原子写与 ODR 读改写竞态陷阱
stm32·单片机·嵌入式硬件