【转】PIC单片机之I2C通信-主-从模式

本文详细介绍了PIC单片机如何实现I2C通信的主模式和从模式。主模式中,讲解了起始位、数据发送、应答和停止位的过程,并给出了通过RSM2257控制音量的实例。从模式部分,通过模拟AT24C02 EEPROM协议展示了数据读写的中断处理流程,包括初始化设置和中断服务函数的实现。
摘要由CSDN通过智能技术生成

主模式:

我们今天来讲I2C通信。那I2C通信的特点是什么能。我们一般使用的串口 (半双工异步串行通信)与I2C 有什么区别呢。

    串口(半双工异步串行通信):就是好像朋友在对话。我可以主动和你讲话,你也可以主动和我讲话。

    I2C:就好像上下级对话。一个领导面对一个或者多个员工。只有领导主动说话的份儿,下面的员工不能主动说话。只有领导问了,员工才能答。

    I2C通信

    I2C通信只需要两个引脚 一个数据线,一个时钟线。 数据线顾名思义就是用来传递数据的。时钟线是来决定数据传输的速度。当时钟线为高电平时,数据线上的数据才会被认为是有效的。

   数据线的 数据有四种状态 : 高电平,低电平,下降沿(高电平变低电平),上升沿(低电平变高电平)。

   当时钟线为高电平时候这四种状态分别代表:1,0,起始位,停止位。

   如果我们发送的数据为十六进制的0x88即是二进制为10001000的数据是怎么发送的呢?我们就以此为例一步步讲解。

     

    1,常态

       在不发送任何数据的时候数据线和时钟线都为高电平。所以I2C通信在硬件设计,需要在数据线和时钟线上分别加上两个上拉电阻。

     2,起始

     当开始发送数据的时候 时钟线为高同时数据线从 高电平变低电平,代表开始发送数据。

     3,发送数据

     发送完起始位后 时钟线变为低电平,在发送每一位的数据之前时钟线有一段低电平,主要的作用是给数据线做电平变化用的。 

     我们现在要发送的第一个位是 1。

    1、时钟线为低,同时数据线从低电平变成高电平。

    2、接着时钟线变为高电平,此时接收方得知时钟线为高,便查看数据线为高电平 说明数据为 “1”。

    3、我们要发送的下一个位为0。时钟线再变为低,同时数据线从高电平变成低电平。

    4、接着时钟线再变为高电平,此时接收方得知时钟线为高,便查看数据线为低电平 说明数据为"0"。

    5、再下一个为还为0。时钟线再变为低,同时数据线一直保持低电平不变。

    6、接着时钟线再变为高电平,此时接收方得知时钟线为高,便查看数据线为低电平 说明数据为”0“。

    以此类推 直到发送完所有的位。

   4,应答(ACK)

    当接收方接收完一个字节的数据就要告诉对方我收到了。接收方如果接收到数据则控制数据线输出低电平。否则为高电平。

   5,停止

     没有下一个字节要发送,最后时钟线变为高电平后,数据线从低电平变为高电平。代表数据发送停止。

实例讲解: 使用单片机使用 RSM2257 电子音量控制芯片来控制音量。一个按键按下,声音变大,一个按键按下,声音变小。在加上一个按键,控制一个LED亮灭的程序。而且音量掉电保存。

 介绍RSM2257.

    子地址

      在I2C通信中每一个从设备都有个子地址,因为I2C支持一主多从,也就是说有一个主机可以连接多个从机。每个从机,都有个地址。就好像每个人的名字一样来区分不同的设备。下面是RSM2257接口协议,首先先发送RSM2257 设备地址 10001000.然后再发送数据。

    

     数据

         RSM2257的数据是用来表示音量大小的。我们控制两个音频通道,以10dB为单位降低或增加音量。从功能设置位表格中可知数据为 11100B2B1B0.

        B2B1B0的数值决定了音量。请详见 衰减设置位。

   

 单片机I2C通信初始化设置

   1、设置端口为输入

              TRISC0 = input;
              TRISC1 = input;

    2、设置模式 

           我们设置ssp1控制寄存器的 SSP1M<3:0>.我们需要的是I2C主模式。设置如下

           SSP1CON1bits.SSPM0 = 0;
           SSP1CON1bits.SSPM1 = 0;
           SSP1CON1bits.SSPM2 = 0;
           SSP1CON1bits.SSPM3 = 1;// I2C Master mode ,clock=Fosc/(4*(SSPxADD+1))

    3、设置时钟线频率RSM2257最大为100KHZ,我选择设置为50KHZ.

            使用计算公式clock=Fosc/(4*(SSPxADD+1)) 计算出SSP1ADD的值为0x9F;

             SSP1ADD=0x9F;

    4、开启I2C通信

           SSP1CON1bits.SSPEN = 1;

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值