TWI(I<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />2C)总线接口
a) 只需两根双向传输线,时钟SCL和数据SDA,需加两个上拉电阻(也可以使能I/O口内部的上拉电阻)。线与
b) 所有连接到总线的设备有自己的地址。
c) 面向字节和基于中断的,总线仲裁
d) 在TWI总线协议中,SCL线是高电平时,SDA线的“下降沿”表示一个数据帧的开始,称为START信号,SDA线的“上升沿”表示一个数据帧的结束,称为STOP信号。
使用TWI协议分别实现AT24C02以及双机通信。
其中实现了对AT24C02的读写,双机通信有点问题,主要是从主机串口接收数
据,通过TWI接口和从机通信,再将从机接收到的数据通过SPI口用74HC595在数
码管上显示。现在存在如下问题:由于使用proteus仿真,主机串口接收不行,
所以就直接把数据保存在数组里,数据传输到从机后在数码管上显示,可以显
示,但是还是有点问题。下面继续解决。https://static.assets-stash.eet-china.com/album/old-resources/2008/12/28/c0808c45-c864-47d7-871b-bed7bc0df3cb.rar
TWI接口操作代码如下:
#define Start() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))
#define Stop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))
#define Wait() {while(!(TWCR&(1<<TWINT)));}
#define TestAck() (TWSR&0xF8)
#define Twi() (TWCR=(1<<TWINT)|(1<<TWEN))
#define Write8Bit(x) {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);}
主从的状态码如下:
#define START 0x08
#define RE_START 0x10
#define MT_SLA_ACK 0x18
#define MT_SLA_NACK 0x20
#define MT_DATA_ACK 0x28
#define MT_DATA_NACK 0x30
#define MT_ARB_LOST 0x38
#define MR_ARB_LOST 0x38
#define MR_SLA_ACK 0x40
#define MR_SLA_NACK 0x48
#define MR_DATA_ACK 0x50
#define MR_DATA_NACK 0x58
#define ST_SLA_ACK 0xA8
#define ST_ARB_LOST_SLA_ACK 0xB0
#define ST_DATA_ACK 0xB8
#define ST_DATA_NACK 0xC0
#define ST_LAST_DATA 0xC8
#define SR_SLA_ACK 0x60
#define SR_ARB_LOST_SLA_ACK 0x68
#define SR_GCALL_ACK 0x70
#define SR_ARB_LOST_GCALL_ACK 0x78
#define SR_DATA_ACK 0x80
#define SR_DATA_NACK 0x88
#define SR_GCALL_DATA_ACK 0x90
#define SR_GCALL_DATA_NACK 0x98
#define SR_STOP 0xA0
文章评论(0条评论)
登录后参与讨论