新闻中心

EEPW首页>嵌入式系统>设计应用> avr单片机的TWI两线串行接口

avr单片机的TWI两线串行接口

作者: 时间:2016-11-27 来源:网络 收藏
ATMEL的TWI和 PHILIPS的IIC基本上应该是算一个东西,但是他们在名义上是不同的,这样谁都不用支付给对方使用费。他们的协议是一样的,所有我们作为使用者基本可以简单的看成 TWI就是IIC 。

废话说完,开始正题。这次是关于在ATMega16 平台下的硬件IIC(还不太习惯说TWI)的使用。在ATMega16的Datasheet里我们可以看到很强大的功能,主从设置很多。本文只说一种最常用的方式,那就是“ATMega16 硬件TWI 的 扫描发送 和 扫描读取”。

本文引用地址://m.amcfsurvey.com/article/201611/322111.htm

首先要明确TWI 发送和接受的流程:

发送:

1,设定数据传输波特率

2,发送START信号,等待应答==》《== 应答信号

3,发送芯片地址,等待应答==》《==应答信号

4,发送数据的绝对地址,等待应答 ==》《==应答信号

5,发送要写入的数据,等待应答==》《==应答信号

6,发送STOP信号,释放总线==》数据写入成功

接收:

1,设定数据传输波特率

2,发送START信号,等待应答==》《== 应答信号

3,发送芯片地址,等待应答==》《==应答信号

4,发送数据的绝对地址,等待应答 ==》《==应答信号

5,发送RESTART信号,等待应答==》《==应答信号

6,发送芯片地址并注明读操作,等待应答 ==》《==应答信号

7,读取数据,等待应答==》《==应答信号

8,发送STOP信号,释放总线==》数据读操作成功

应用芯片 :ATMega 16晶振 : 7.3728

代码文件:Project

|___TWI.C

||_____ IAR_DELAY.H

|___UART.C

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

IAR_DELAY.H

#ifndef __IAR_DELAY_H
#define __IAR_DELAY_H

#include

#define XTAL 7.3728//可定义为你所用的晶振频率(单位Mhz)


#define delay_us(x) __delay_cycles ( (unsigned long)(x * XTAL) )
#define delay_ms(x) __delay_cycles ( (unsigned long)(x * XTAL*1000) )
#define delay_s(x) __delay_cycles ( (unsigned long)(x * XTAL*1000000) )

#endif

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

UART.C

#include
#define uchar unsigned char
#define uint unsigned int

//###########################################################

voidUart_Init(void)
{
UCSRB = (1< //允许发送和接收
UCSRC = (1<

UBRRH=0x00;//设置波特率寄存器低位字节
UBRRL=47;//9600//设置波特率寄存器高位字节

DDRD_Bit1=1;//配置TX为输出(很重要)
}
//###########################################################

voidUart_Transmit(uchar data)
{
while(!(UCSRA&(1<
//while(UCSRA_UDRE==0);
UDR = data;
}

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

#include
#include "IAR_DELAY.H"
#define uchar unsigned char
#define uint unsigned int

void Uart_Init(void);
void Uart_Transmit(uchar data);


//变量声明
#define EEPROM_BUS_ADDRESS 0xA0//器件地址





//主机发送模式时各状态字的后续动作
#define TW_START0x08//开始信号已发出
#define TW_REP_START0x10//重复开始信号已发出
#define TW_MT_SLA_ACK0x18//写字节已发出并受到ACK信号
#define TW_MT_SLA_NACK0x20//写字节已发出并受到NACK信号
#define TW_MT_DATA_ACK0x28//数据已发出并受到ACK 信号
#define TW_MT_DATA_NACK0x30//数据已发出并受到NACK 信号
#define TW_MT_ARB_LOST0x38//丢失总线控制权
//主机接收模式时各状态字的后续动作
#define TW_MR_ARB_LOST0x38//丢失总线控制权,未收到应答信号
#define TW_MR_SLA_ACK0x40//读命令已发出并受到ACK
#define TW_MR_SLA_NACK0x48//读命令已发出并受到NACK
#define TW_MR_DATA_ACK0x50//数据已收到,ACK已发出
#define TW_MR_DATA_NACK0x58//数据已收到,NACK已发出

#define IIC_Start()TWCR =(1< // TWINT位 通过写1进行清零,一旦清零则TWI开始工作,当相应硬件工作完成后 TWINT位会重新置位为1
// TWSTA位 会让硬件在总线上产生一个START的信号 , 声明自己希望成为主机
// TWEN 位 使能TWI功能,将 PC0 和 PC1 管脚切换到第二功能上来, 如果清零则为中断 TWI的传输
#define IIC_Stop()TWCR =(1< // TWSTO位 在主机模式下,会让硬件在总线上产生一个STOP得信号,并且SCL 和 SDA 两个引脚位高阻态

#define IIC_Wait()while(!(TWCR&(1< // TWINT位 经过一次置位使硬件TWI开始工作 ,然后在检测 TWCR 寄存器的 TWINT 位是不是被置位,如果置位为1则表示工作完成可以向下进行

//##############################################################################


上一页 1 2 下一页

评论


技术专区

关闭