2022年第七章TWIIC总线技术单片机

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//通过I2C向器件写入一个字节 void iic_putchar(byte device,byte address,byte dat) {
iic_start(); iic_write_8bits(0xa0|(device<<1)); iic_wait_ack(); iic_write_8bits(address); iic_wait_ack(); iic_write_8bits(dat); iic_wait_ack(); iic_stop(); DelayuS(100); } //通过I2C从器件读取一个字节 byte iic_getchar(byte device,byte address) { byte temp; iic_start(); iic_write_8bits(0xa0|(device<<1)); iic_wait_ack(); iic_write_8bits(address); iic_wait_ack(); iic_start(); iic_write_8bits(0xa1|(device<<1)); iic_wait_ack(); temp=iic_read_8bits(); iic_no_ack(); iic_stop(); return(temp); }
后放弃对SDA的控制权。
3)所有从机都会接收到地址字节,并与自己的地址对 比,看看是否匹配。对应的从机在第九个SCL脉冲期间
拉低SDA,给出应答(ACK)。表示可以建立通信
4)主机检测到ACK后,用8个SCL脉冲周期,发 送8个位的数据信号,然后放弃对SDA的控制权,等待
ACK应答。
5)从机在此上8个周期接收数据,然后控制SDA, 给出ACK应答。
3)数据包格式
图7-5 TWI总线数据包格式
如果器件A要发送一个数据包到器件B,传递数据包的过程是: 1)主机控制SCL(A或者B),产生9个时钟脉冲,前8个用于要传输的数据,第9 个 用于发送应答信号。 2)在前8个SCL脉冲期间,A是发送器,控制SDA输出8位数据到B上,而B为接收 器,检测SDA的电平状态,完成8位数据的接收。 3)在第九个SCL脉冲期间,A释放SDA,此时B变为发送器,控制SDA,输出 ACK信号,如果此时B保持SDA为高电平,则被视为无法响应(NACK),如果此时 B输出低电平,拉低SDA电平,则被视为响应(ACK)。 4)最后,双方都根据应答信号的状态,决定下一步动作。 这里就没有用到主机和从机来介绍,因为数据的发送方既可能是主机,也可能是从 机
TWI 总线的连接如图所示,各个器件用两根信号线连接到总线上, SDA为串行数据线,SCL为串行时钟。外部硬件只需要两个上拉电阻R1、 R2(必须),每根线上一个。所有连接到总线上的设备都有自己的地址。
SDA用于传递数据信号,SCL是总线的时钟,发生通信时,接收和 发送方都是使用这个公共的时钟信号,来实现数据传输的同步,所以说 TWI是一种同步串行通信技术,这个与USART的异步串行传输是不同的。
volatile byte *IIC_DIR=&DDRC;
volatile byte *IIC_DAT=&PORTC;
volatile byte *IIC_PIN=&PINC;
//模拟I2C端口无关操作宏定义
#define set_iic_scl() (*IIC_DAT|=(1<<IIC_SCL))
• AVR系列的单片机内部集成了TWI(Two-wire SerialInterface)总线该总线具有I2C总线的特点,即接线 简单,外部硬件只需两个上拉电阻,使用时钟线SCL和数 据线SDA就可以将128个不同的设备互连到一起;而且支 持主机和从机操作,器件可以工作于发送器模式或接收器 模式,数据传输率高达400 kHz正因为TWI总线具有这么 多的优点。
#define set_iic_output() (*IIC_DIR|=(1<<IIC_SDA))
#define set_iic_input() (*IIC_DIR&=~(1<<IIC_SDA))
#define get_iic_sda() (*IIC_PIN&(1<<IIC_SDA))
//启动I2C
//ACK响应
void iic_ack(void)
{
clr_iic_sda();
DelayuS(30);
set_iic_scl();
DelayuS(30);
else return(1); clr_iic_scl();
set_iic_sda(); DelayuS(30);
/*********************************************/
第7章 TWI/I2C总线技术
• 在上面一章,已经介绍了USART异步串行通信接口, USART接口主要用于系统之间的通信,而这章给大家介 绍的TWI总线则是用于系统板级芯片之间的短距离通信。
• 由PHILIPS 公司开发的两线式串行总线I2C( InterIntegratedCircuit) 总线以其接口线少、控制方式简单、通 信速率较高等优点在嵌入式系统领域得到广泛的应用。
图7-1 TWI 总线的连接 在TWI总线上的芯片都是平等的,但是这样平等关系是相对的,为 了保证通信的可靠,在任意的时刻上,总线上只能有一个主机,而其他 的器件都为从机,主机发生时钟信号、发出启动信号、控制传输结束时 发出停止信号等,由主机来控制总线的通信行为。所有连接到总线上的 设备都有自己的地址,以便于主机的寻址。主机可以是数据的发送方, 也可以是数据接收方,同样,从机既可以是数据的发送方,也可以是数 据接收方。这样,TWI就一共有四种工作模式:主机发送模式、主机接收
引例代码如下:
#include <iom16v.h>
#define unsigned char byte
#define unsigned int word
//模拟I2C 请根据硬件的具体连接修改端口定义 由原理图可知
#define IIC_SCL
0
// PC0
#define IIC_SDA
1
// PC1
4)将地址包和数据包组合为一个完整的传输过程 一个完整的数据传输过程,该过程是主机向从机发送一 个字节的数据(主机发送模式):
1)主机在SCL控制SDA,产生一个下降沿,发出 一个起始信号(当然前提是:当前总线是空闲的,即SD A和SCL均为高电平)。同时控制SCL,产生时钟信
号。 2)主机发送地址数据和读写控制位(7+1=8位), 如果为向从机发送数据,则读写控制位置位为“0”。然
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //工作模式设定
}
/*********************************************/
/*
UAER串口字节发送程序
*/
/*********************************************/
clr_iic_sda(); if(writedata&0x80) set_iic_sda(); set_iic_scl(); DelayuS(30); clr_iic_scl(); DelayuS(30); writedata=writedata<<1; } }
//从I2C读取一个字节 byte iic_read_8bits(void) {
//串口“积木”块代码
#define baud
19200
//工作波特率
void uart_init(void)
{
UCSRB=(1<<RXEN)|(1<<TXEN);
UBRRL=(fosc/16/uartbaud-1)%256;
UBRRH=(fosc/16/uartbaud-1)/256; //波特率设定
#define clr_iic_scl() (*IIC_DAT&=~(1<<IIC_SCL))
#define set_iic_sda() (*IIC_DAT|=(1<<IIC_SDA))
#define clr_iic_sda() (*IIC_DAT&=~(1<<IIC_SDA))
#define set_iic_en() (*IIC_DIR|=(1<<IIC_SCL))
(1)数据信号和控制信号的传输
图7-2 TWI总线的数据有效性示意图 图7-3 起始信号与停止信号
(2)地址数据包格式
图7-4 TWI总线的地址包格式
传递地址数据包的过程是: 1)主机控制SCL,产生9个时钟脉冲,前7个用于传输要寻址的从机地址, 第8个用于传递READ/WRITE 控制位(这一位数据为“1”时,表示要从从机 接收数据,否则为要向从机发送数据)。第9个用于从机向主机发送应答 信 号,确定是否能接收主机的呼叫,建立通信。 2)在前8个SCL脉冲期间,主机作为发送器,控制SDA输出8位数据到从 机上,而从机作为接收器,检测SDA的电平状态,完成8位数据的接收。 3)在第九个SCL脉冲期间,主机释放SDA,此时从机作为发送器,控制 SDA,输出ACK信号,如果此时从机保持SDA为高电平,则被视为无法响应 主机(NACK),如果此时从机输出低电平,拉低SDA电平,则被视为响应 (ACK)。在这个周期内,主机是作为接收方的。 4)最后,双方都根据应答信号的状态,决定下一步动作。 5)主机可以是数据的发送方也可以是数据的接收方,从机亦然
/* mode x: 未接s收e到t_数i据ic返_回sd0xa0(0)0;0 */
u/v*oalrat_tipleu}/成/btsNyt功tre(O“启写*IA动I器CC返_件DK回错IR响误1=&,!否应DD则R返C回; 0
*/
byte i,rveaodiddatai;ic_no_ack(void)
void uart_putchar(byte c)
{
while(!(UCSRA&(1<<UDRE))) ;
//等待发送制剂空闲
UDR=c;
}
/*********************************************/
/*
UAER串口字节接收程序
*/
/* 返回数据为:0xffxx(xx为接收数据) */
7.2 快速上手引例,让TWI/I2C跑起来……
24C02是经常用到的SERIAL 2K (256 x 8) EEPROM,…… TWI/I2C总线挂接EEPROM的电路原理图如图7-6所示。
电路用到了RS232串口“积木块”和PC机通信,在PC机平台上使用串口调试工具来
作为调试数据的观测终端。
DelayuS(30);
内容为(下一行):se”t,_1)iic_scl();
clr_iic_scl();
DelayuS(30);
clr_iic_scl();
}
8000000
//停止I2C void iic_stop(void) {
clr_iic_scl(); DelayuS(30); clr_iic_sda(); DelayuS(30); set_iic_scl(); DelayuS(30); set_iic_sda(); } //向I2C发送一个字节 void iic_write_8bits(byte writedata) { byte i; for(i=8;i!=0;i--) {
set_iic_scl();
//向I2C{发送一个字节
/********************s***e**t*_**i*i*c***_**s**d**a**(**)*;*/
{TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWIE);}#define fosc
If(n_line)
byte i,readdata; readdata=0; set_iic_input(); for(i=8;i!=0;i--) {
set_iic_scl(); DelayuS(30); readdata=readdata<<1; if(get_iic_sda()) readdata=readdata+1; DelayuS(30); clr_iic_scl(); DelayuS(30); } set_iic_output(); return(readdata); }
相关文档
最新文档