avr单片机的TWI两线串行接口
发送:
1,设定数据传输波特率
2,发送START信号,等待应答
3,发送芯片地址,等待应答
4,发送数据的绝对地址,等待应答 ==》
5,发送要写入的数据,等待应答
6,发送STOP信号,释放总线
接收:
1,设定数据传输波特率
2,发送START信号,等待应答
3,发送芯片地址,等待应答
4,发送数据的绝对地址,等待应答 ==》
5,发送RESTART信号,等待应答
6,发送芯片地址并注明读操作,等待应答 ==》
7,读取数据,等待应答
8,发送STOP信号,释放总线
应用芯片 :ATMega 16
代码文件:Project
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IAR_DELAY.H
#ifndef __IAR_DELAY_H
#define __IAR_DELAY_H
#include
#define XTAL 7.3728
#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; @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #include void Uart_Init(void); //变量声明 #define IIC_Start() #define IIC_Wait() //##############################################################################
voidUart_Init(void)
{
UCSRC = (1
UBRRL=47;
}
//###########################################################
voidUart_Transmit(uchar data)
{
UDR = data;
}
#include "IAR_DELAY.H"
#define uchar unsigned char
#define uint unsigned int
void Uart_Transmit(uchar data);
#define EEPROM_BUS_ADDRESS 0xA0
//主机发送模式时各状态字的后续动作
#define TW_START
#define TW_REP_START
#define TW_MT_SLA_ACK
#define TW_MT_SLA_NACK
#define TW_MT_DATA_ACK
#define TW_MT_DATA_NACK
#define TW_MT_ARB_LOST
//主机接收模式时各状态字的后续动作
#define TW_MR_ARB_LOST
#define TW_MR_SLA_ACK
#define TW_MR_SLA_NACK
#define TW_MR_DATA_ACK
#define TW_MR_DATA_NACK
#define IIC_Stop()
unsigned char twi_write(unsigned char addr, unsigned char dd)
{
IIC_Start();
IIC_Wait();
if ((TWSR & 0xF8) != 0x08) return 0;//检测到TWINT位置位,比对TWSR寄存器内的状态量,如果正确则向下进行数据传输,错误返回 0
TWDR = EEPROM_BUS_ADDRESS ;
TWCR = (1 < TWINT) | (1 < TWEN);
IIC_Wait();
if ((TWSR & 0xF8) != 0x18) return 0;//检测到TWINT位置位,比对TWSR寄存器内的状态量 , 如果正确则向下进行数据传输,错误返回 0
TWDR = addr;
TWCR = (1 < TWINT) | (1 < TWEN);
IIC_Wait();
if ((TWSR & 0xF8) != 0x28) return 0;//检测到TWINT位置位,比对TWSR寄存器内的状态量 , 如果正确则向下进行数据传输,错误返回 0
TWDR = dd;
TWCR = (1 < TWINT) | (1 < TWEN);
IIC_Wait();
if ((TWSR & 0xF8) != 0x28) return 0;//检测到TWINT位置位,比对TWSR寄存器内的状态量 , 如果正确则向下进行数据传输,错误返回 0
avr单片机TWI两线串行接 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)