您的位置 首页 主动

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

ATMEL的TWI和PHILIPS的IIC基本上应该是算一个东西,但是他们在名义上是不同的,这样谁都不用支付给对方使用费。他们的协议是一样的,所有

ATMEL的TWI和 PHILIPS的IIC根本上应该是算一个东西,可是他们在名义上是不同的,这样谁都不必支交给对方运用费。他们的协议是相同的,一切咱们作为运用者根本能够简略的当作 TWI便是IIC

废话说完,开端正题。这次是关于在ATMega16 平台下的硬件IIC(还不太习气说TWI)的运用。在ATMega16的Datasheet里咱们能够看到很强壮的功用,主从设置许多。本文只说一种最常用的方法,那便是“ATMega16 硬件TWI 的 扫描发送 和 扫描读取”。

首先要清晰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则表明作业完结能够向下进行

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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/zhudong/256815.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部