打印
[资料下载]

软件模拟IIC通信

[复制链接]
1247|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kkzz|  楼主 | 2023-11-12 23:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1、IIC协议简易概述
IIC全称Inter-Integrated Circuit (集成电路总线),是由PHILIPS公司在80年代开发的两线式串行总线,用于连接微控制器及其外围设备。IIC属于半双工同步通信方式。
特点

简单性和有效性。
由于接口直接在组件之上,因此IIC总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降
低了互联成本。总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件。
多主控(multimastering)
其中任何能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当
然,在任何时间点上只能有一个主控。
构成
IIC串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL,其时钟信号是由主控
器件产生。所有接到IIC总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线
的SCL上。对于并联在一条总线上的每个IC都有唯一的地址。

为了保证数据稳定性和减少干扰,SCL和SDA都需接上拉电阻(大小由速度和容性负载决定,一般3.3-10K之间)。

2、IIC协议
IIC总线在传输数据的过程中一共有三种类型信号,分别为:开始信号、结束信号和应答信号,这些信号中,起始信号是必需的。

*** IIC总线通信过程**
1.主机发送起始信号启用总线
2.主机发送一个字节数据指明从机地址和后续字节的传送方向,0000 0110,最后一位为0表示主机给从机发,为1表示从机给主机发
3.被寻址的从机发送应答信号回应主机
4.发送器发送一个字节数据
5.接收器发送应答信号回应发送器
....循环步骤4,5
n.通信完成后主机发送停止信号释放总线

起始信号
SCL为高电平时,SDA由高变低表示起始信号

/*定义IIC信号引脚*/
sbit scl = P0^1;
sbit sda = P0^3;

/***IIC起始信号***/
void IIC_Start()
{
    sda = 1;
    scl = 1;
    _nop_();//11.0592MHZ晶振下,_nop_()函数耗时约5us
    sda = 0;
    _nop_();
}
终止信号
SCL为高电平时,SDA由低变高表示停止信号

/***IIC终止信号***/
void IIC_Stop()
{
    sda = 0;
    scl = 1;
    _nop_();
    sda = 1;
    _nop_();
}
应答信号
发送器每发送一个字节(8个bit),就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。
应答信号为低电平时,规定为有效应答位(ACK,简称应答位),表示接收器已经成功地接收了该字
节;应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。


/***IIC应答信号***/
char IIC_ACK()
{
    char flag;
    sda = 1;//在时钟脉冲9期间释放数据线
    _nop_();
    scl = 1;
    _nop_();
    flag = sda;
    _nop_();
    scl = 0;
    _nop_();
    return flag;
}
数据发送的时序
IIC总线在进行数据传送时,时钟线SCL为低电平期间发送器向数据线上发送一位数据,在此期间数据线上的信号允许发生变化,时钟线SCL为高电平期间接收器从数据线上读取一位数据,在此期间数据线上的信号不允许发生变化,必须保持稳定。

/***IIC协议发送一个字节数据***/
void IIC_Send_Byte(char Send_data)
{
    int i;
    for(i = 0;i<8;i++)
  {
    scl = 0;//scl拉低,让sda做好数据准备
    sda = Send_data & 0x80;//1000 0000获得Send_data的最高位,给sda
    _nop_();//发送数据建立时间
    scl = 1;//scl拉高开始发送
    _nop_();//数据发送时间
    scl = 0;//发送完毕拉低
    _nop_();//等待一段时间
    Send_data = Send_data << 1;
  }
}

使用特权

评论回复
沙发
RDS小定| | 2023-11-16 21:22 | 只看该作者
知识点可以复习复习

使用特权

评论回复
板凳
rosemoore| | 2023-12-8 21:08 | 只看该作者
传输速度过快,可能会影响通信的稳定性

使用特权

评论回复
地板
robincotton| | 2023-12-8 21:14 | 只看该作者
在软件模拟时,需要根据实际的硬件电路选择合适的位宽和位速率。

使用特权

评论回复
5
janewood| | 2023-12-8 22:10 | 只看该作者
IIC 是同步通信协议,需要严格的时钟同步。

使用特权

评论回复
6
1988020566| | 2023-12-9 10:04 | 只看该作者
尽量使用硬件IIC,而不是通过GPIO口进行软件模拟。

使用特权

评论回复
7
mnynt121| | 2023-12-9 10:45 | 只看该作者
硬件I2C的效率远高于软件模拟的

使用特权

评论回复
8
vivilyly| | 2023-12-9 14:24 | 只看该作者
软件模拟I2C转到硬件I2C可能需要一些调整。

使用特权

评论回复
9
10299823| | 2023-12-9 14:42 | 只看该作者
IIC 的位宽通常是 8 位,位速率范围较广,可以从 10 kHz 到 400 kHz。

使用特权

评论回复
10
olivem55arlowe| | 2023-12-9 15:51 | 只看该作者
IIC 通信中,可能会出现各种错误,如仲裁丢失、应答超时等。

使用特权

评论回复
11
phoenixwhite| | 2023-12-9 16:18 | 只看该作者
模拟IIC传送的数据很慢,远远比硬件IIC慢很多

使用特权

评论回复
12
abotomson| | 2023-12-9 20:11 | 只看该作者
软件模拟可能会产生较长的延时,这在某些要求较高的场合可能不适合。

使用特权

评论回复
13
weifeng90| | 2023-12-12 07:39 | 只看该作者
软件模拟IIC很常用

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

317

主题

10940

帖子

13

粉丝