新闻中心

EEPW首页>嵌入式系统>设计应用> 测试AVR的TWI写24c02芯片的简单函数

测试AVR的TWI写24c02芯片的简单函数

作者: 时间:2016-11-20 来源:网络 收藏
//文件名:"I2C.h"

//描述:声明读写24c02以及初始化TWI的全局函数

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

#define uchar unsigned char
#define uint unsigned int
void I2C_Inti(void);
void Write_24c02(uchar add,uchar data);
uchar Read_24c02(uchar add);

//文件名:"I2C.c"

//描述:定义关于24c02以及TWI的相关函数

#include
#include
#include"I2C.h"

#define TW_START 0X08
#define TW_REP_START 0X10
#define TW_MT_SLA_ACK 0X18
#define TW_MT_SLA_nACK 0X20
#define TW_MT_DATA_ACK 0X28
#define TW_MT_DATA_nACK 0X30
#define TW_MT_LOST 0X38
#define TW_MR_LOST 0X38
#define TW_MR_SLA_ACK 0X40
#define TW_MR_SLA_nACK 0X48
#define TW_MR_DATA_ACK 0X50
#define TW_MR_DATA_nACK 0X58

//函数名;I2C_Inti
//输入:无
//输出:无
//描述:初始化 AVR的TWI端口

void I2C_Inti(void)
{
TWBR=10;
TWSR=0X00;
TWAR=0X00;
DDRC=0X80;
PORTC=0XFF;
}

//函数名;I2C_Start
//输入:无
//输出:成功返回1,失败返回0
//描述:TWI开始(或重复开始)函数


uchar I2C_Start(void)
{
TWCR=BIT(TWINT)|BIT(TWSTA)|BIT(TWEN);
while(!(TWCR&BIT(TWINT)));
if((TWSR&0XF8)==TW_START)//开始TWI成功
{
return 1;
}
if((TWSR&0XF8)==TW_REP_START)//再次开始TWI成功
{
return 1;
}
return 0;
}

//函数名;I2C_Stop
//输入:无
//输出:无
//描述:TWI结束函数


void I2C_Stop(void)
{
TWCR=BIT(TWINT)|BIT(TWEN)|BIT(TWSTO);
}

//函数名;Write_I2C
//输入:待写的地址或数据
//输出:有应答返回1,无应答返回0
//描述:主机写

uchar Write_I2C(uchar data)
{
uchar ack=1;
TWDR=data;
TWCR=BIT(TWINT)|BIT(TWEN);
while(!(TWCR&BIT(TWINT)));
if((TWSR&0XF8)==TW_MT_SLA_ACK)//发送芯片地址(写)成功,有应答
{
return ack;
}
if((TWSR&0XF8)==TW_MT_DATA_ACK)//发送数据成功,有应答
{
return ack;
}
if((TWSR&0XF8)==TW_MR_SLA_ACK)//发送芯片地址(读)成功,有应答
{
return ack;
}
return 0;
}

//函数名;Read_I2C
//输入:是否应答,1--发送应答,0--不发送应答
//输出:读数据成功返回读出的一个字节数据,失败返回0
//描述:主机读

uchar Read_I2C(uchar ack)
{
if(ack)
{
TWCR=BIT(TWINT)|BIT(TWEN)|BIT(TWEA);
while(!(TWCR&BIT(TWINT)));
if((TWSR&0XF8)==TW_MR_DATA_ACK)
{
return(TWDR);
}
}
else
{
TWCR=BIT(TWINT)|BIT(TWEN);
while(!(TWCR&BIT(TWINT)));
if((TWSR&0XF8)==TW_MR_DATA_nACK)
{
return(TWDR);
}
}
return 0;
}

//函数名;Read_24c02
//输入:存储地址add
//输出:返回读出的一个字节数据
//描述:主机读24c02指定地址

uchar Read_24c02(uchar add)
{
uchar data;
I2C_Start();
Write_I2C(0XAE);
Write_I2C(add);
I2C_Start();
Write_I2C(0XAF);
data=Read_I2C(0);
I2C_Stop();
return data;
}


//函数名;Write_24c02
//输入:存储地址add,待写的数据data
//输出:无
//描述:主机写24c02指定地址一个字节的数据

void Write_24c02(uchar add,uchar data)
{
I2C_Start();
Write_I2C(0XAE);
Write_I2C(add);
Write_I2C(data);
I2C_Stop();
}

//文件名:"main.c"

//描述:测试读写24c02的函数,利用数码管显示

#include
#include
#include"I2C.h"

#define ON_138 PORTC|=BIT(PC7) //使能74138
#define OFF_138 PORTC&=~BIT(PC7)

const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //显示的段码值
uchar buffer[]={0,0,0}; //存放待显示的数据的段码

//函数名;Send_Buffer
//输入:待数码管显示的数据
//输出:无
//描述:将显示的数据译码

void Send_Buffer(uchar data)
{
buffer[0]=table[data/100];
data=data0;
buffer[1]=table[data/10];
data=data;
buffer[2]=table[data];
}

//函数名;Display
//输入:待显示的位置和段码值,site--[0,2]
//输出:无
//描述:在指定位置显示指定数据

void Display(uchar site,uchar data)
{
if(site==0)
{
PORTA=0X00;
PORTB=data;
}
if(site==1)
{
PORTA=0X01;
PORTB=data;
}
if(site==2)
{
PORTA=0X02;
PORTB=data;
}
}

//函数名;delay_ms
//输入:无
//输出:无
//描述:延时1ms

void delay_ms(uint ms)
{
uint i,j;
for(i=0;i for(j=0;j<564;j++);
}

void main()
{
uchar temp;
I2C_Inti();
DDRA=0XFF;
PORTA=0X00;
DDRB=0XFF;
PORTB=0X00;
ON_138;
temp=Read_24c02(0x08); //读地址为0x08的存储数据
Send_Buffer(temp);
temp++;
Write_24c02(0x08,temp); // 写temp到存储地址0x08
while(1)
{
Display(0,buffer[0]);
delay_ms(3);
Display(1,buffer[1]);
delay_ms(3);
Display(2,buffer[2]);
delay_ms(3);
}
}

附图:



关键词:AVRTWI写24c02芯

评论


技术专区

关闭