avr--TWI(I2C)

TWI: 是一种全双工的串行通讯协议,与I2C工作方式相同,由一条数据传输线SDL,一条时钟线SCL组成,对应单片机的外部引脚PC1,PC0。

             由于只有两条总线,简化了系统设计。

特点:   • 简单,但是强大而灵活的通讯接口,只需要两根线
              • 支持主机和从机操作
              • 器件可以工作于发送器模式或接收器模式
              • 7 位地址空间允许有128 个从机
              • 支持多主机仲裁
              • 高达400 kHz 的数据传输率
              • 斜率受控的输出驱动器
              • 可以抑制总线尖峰的噪声抑制器
              • 完全可编程的从机地址以及公共地址
              • 睡眠时地址匹配可以唤醒AVR

主机:      控制启动和停止传输的设备。主机同时要产生SCL 时钟
从机:     被主机寻址的设备
发送器: 将数据放到总线上的设备
接收器: 从总线读取数据的设备

TWI工作模式:  主机发送模式(MT)

                        主机接收模式(MR)

                        从机发送模式(ST)

                        从机接收器模式(SR)

例如, TWI 可用MT 模式给TWIEEPROM 写入数据,用MR 模式从EEPROM 读取数据。如果系统中有其它主机存在 ,它们可能给TWI 发送数据,此时就可以用SR 模式。应用程序决定采用何种模式。

模式状态缩写:

S: START 状态
Rs:REPEATED START 状态
R:读一个比特(SDA 为高电平)
W:写一个比特(SDA 为低电平)
A:应答位(SDA 为低电平)
A: 无应答位(SDA 为高电平)
Data:8 位数据
P: STOP 状态
SLA:从机地址

 


一、主机模式:可以向从机发送数据,进入主机模式,首先发送一个START信号,接着的从机地址决定了进入MT还是MR模式

                        主机发送(MT):  S+SLA+W,        主机接收(MR):  S+SLA+R

       1、波特率设置:TWBR=100;

        2、分频设置:   TWSR|=(1<<TWPS1)|(1<<TWPS0);

      写过程:

              1)、发送启动信号:  TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTA);

              2)、   等待应答信号:    while ((TWCR&(1<<TWINT))==0);

             3)、 进入主机写模式:   TWDR=0Xa0;// TWDR=SLA+W; //通过在TWDR中写入SLA+W进入主机写模式,SLA+R进入主机读模式

                                                    TWCR=(1<<TWINT)|(1<<TWEN);

                                                 while ((TWCR&(1<<TWINT))==0);  //如果TWINT为0就原地等待

    4)、发送要写入的地址:   TWDR=adress;

                                                        TWCR=(1<<TWINT)|(1<<TWEN);    //启动发送

                                                          while(!(TWCR&(1<<TWINT)));

              5)、 发送要写入的数据: TWDR=data;

                                                        TWCR=(1<<TWINT)|(1<<TWEN);   //启动发送

                                                       while(!(TWCR&(1<<TWINT)));

             6)、发送停止信号:  TWC(1<<TWINT)|(1<<TWEN)|(1<<TWST0);        //写过程结束

  读过程:

              1)、启动信号:         TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTA)

                                                  while(!(TWCR&(1<<TWINT)));

              2)、 进入主机写模式:TWDR=0Xa0; //TWDR=SLA+W;

                                                   TWCR=(1<<TWINT)|(1<<TWEN);

                                                     while(!(TWCR&(1<<TWINT)));

               3)、写入要读的地址: TWDR=address;

                                                    TWCR=(1<<TWINT)|(1<<TWEN);

                                                      while(!(TWCR&(1<<TWINT)));

                4)、发送启动信号:  TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTA)

                                                  while(!(TWCR&(1<<TWINT)));

                5)、进入主机读模式: TWDR=0Xa1 ;//TWDR=SLA+R;

                                                       TWCR=(1<<TWINT)|(1<<TWEN);

                                                        while(!(TWCR&(1<<TWINT)));

                6)、 开始读数据:     TWCR=(1<<TWINT)|(1<<TWEN);

                                                   while(!(TWCR&(1<<TWINT)));

                                                    temp=TWDR; //读取的数据送到变量temp中。

                7)、发送停止信号: TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWST0);    //读过程结束

 

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值