IAR For AVR 两线串行接口 TWI 应用
废话说完,开始正题。这次是关于在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
//########################################################### UBRRH=0x00; //设置波特率寄存器低位字节 DDRD_Bit1=1; //配置TX为输出(很重要) @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #include void Uart_Init(void); //变量声明 #define IIC_Start() TWCR =(1 #define IIC_Wait() while(!(TWCR&(1 //##################
/*串口初始化函数*/
voidUart_Init(void)
{
UCSRB = (1
UBRRL=47; //9600 //设置波特率寄存器高位字节
}
//###########################################################
/*发送一个字符数据,查询方式*/
voidUart_Transmit(uchar data)
{
while(!(UCSRA&(1
UDR = data; /* 发送数据*/
}
#include "IAR_DELAY.H"
#define uchar unsigned char
#define uint unsigned int
void Uart_Transmit(uchar data);
#define EEPROM_BUS_ADDRESS 0xA0 //器件地址
/*#####################################################################*/
/*从器件地址位定义:______________________________________-------------*/
/* AT24C02 | 1 | 0 | 1 | 0 | A2 | A1 | A0 | R/~W |------------*/
/* ---------------------------------------------------*/
/*#####################################################################*/
//主机发送模式时各状态字的后续动作
#define TW_START 0x08 //开始信号已发出
#define TW_REP_START 0x10 //重复开始信号已发出
#define TW_MT_SLA_ACK 0x18 //写字节已发出并受到ACK信号
#define TW_MT_SLA_NACK 0x20 //写字节已发出并受到NACK信号
#define TW_MT_DATA_ACK 0x28 //数据已发出并受到ACK 信号
#define TW_MT_DATA_NACK 0x30 //数据已发出并受到NACK 信号
#define TW_MT_ARB_LOST 0x38 //丢失总线控制权
//主机接收模式时各状态字的后续动作
#define TW_MR_ARB_LOST 0x38 //丢失总线控制权,未收到应答信号
#define TW_MR_SLA_ACK 0x40 //读命令已发出并受到ACK
#define TW_MR_SLA_NACK 0x48 //读命令已发出并受到NACK
#define TW_MR_DATA_ACK 0x50 //数据已收到,ACK已发出
#define TW_MR_DATA_NACK 0x58 //数据已收到,NACK已发出
// TWEN 位 使能TWI功能,将 PC0 和 PC1 管脚切换到第二功能上来, 如果清零则为中断 TWI的传输
#define IIC_Stop() TWCR =(1
IARrAVR两线串行接口TW 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)