📄 t103_i2c.c
字号:
//#####################---文件信息-----############################
//文 件 名 : i2c.c
//创 建 人 :
//建 立 时 间 : 2006-9-4
//版 本 描 述 :
//功 能 描 述 : AVR i2c 读写程序,封装I2C接口函数
//备 注 : 调试环境为iccavr,MCU为Mega128 晶振为8mhz
//最后修改时间 : 2006-8-11
//##################################################################
#include "include.h"
//** 需要根据硬件连线改动的几个语句
#define SDA 1
#define SCL 2
#define I2C_DDR DDRF
#define I2C_PORT PORTF
#define Set_SDA PORTF=PORTF|(1<<SDA)
#define Cls_SDA PORTF=PORTF&~(1<<SDA)
#define Set_SCL PORTF=PORTF|(1<<SCL)
#define Cls_SCL PORTF=PORTF&~(1<<SCL)
#define SDA_High PINF&(1<<SDA)
//function declaration
#define I2C_Delay
void I2C_Error(void);
void I2C_Start(void);
void I2C_Stop(void);
void I2C_Write(unsigned char wb);
unsigned char I2C_Read(unsigned char bEnd);
void t103_write(unsigned char address,unsigned char reg_address,unsigned char data);
unsigned char t103_read(unsigned char address,unsigned char reg_address);
void t103_write2(unsigned char address,unsigned char reg_address,unsigned char data1,unsigned char data2);
void t103_write2(unsigned char address,unsigned char reg_address,unsigned char data1,unsigned char data2)
{
I2C_Start();
I2C_Write(address);
I2C_Write(reg_address);
I2C_Write(data1);
I2C_Write(data2);
I2C_Stop();
}
//*****************************************************************
//函 数 名 : t101_write/t101_read
//建 立 时 间 : 2006-8-11
//功 能 描 述 :
//备 注 : 没有返回值
//最后修改时间 : 2006-8-11
//*****************************************************************
void t103_write(unsigned char address,unsigned char reg_address,unsigned char data){
I2C_Start();
I2C_Write(address);
I2C_Write(reg_address);
I2C_Write(data);
I2C_Stop();
}
unsigned char t103_read(unsigned char address,unsigned char reg_address){
unsigned char temp;
I2C_Start();
I2C_Write(address);
I2C_Write(reg_address);
I2C_Stop();
I2C_Start();
I2C_Write(address|1);//
temp=I2C_Read(1);
I2C_Stop();
return temp;
}
//*****************************************************************
//函 数 名 : I2C_Error
//建 立 时 间 : 2006-8-11
//功 能 描 述 :
//备 注 : 没有返回值
//最后修改时间 : 2006-8-11
//*****************************************************************
void I2C_Error(void)
{
LED2_ON;
return;//no instruction
}
//*****************************************************************
//函 数 名 : I2C_Delay
//建 立 时 间 : 2006-8-11
//功 能 描 述 : I2C延时程序,T101的SCL频率可达到1MHZ
//备 注 : 没有返回值
//最后修改时间 : 2006-8-11
//*****************************************************************
/*void I2C_Delay(void)
{
// unsigned int i;
//for( i=0; i<2; i++ );
// asm("nop");
}*/
//*****************************************************************
//函 数 名 : I2C_Start
//建 立 时 间 : 2006-8-11
//功 能 描 述 :
//备 注 : 没有返回值
//最后修改时间 : 2006-8-11
//*****************************************************************
void I2C_Start(void)
{
I2C_DDR|=(1<<SDA);
I2C_DDR|=(1<<SCL);
Set_SDA;
I2C_Delay;
Set_SCL;
I2C_Delay;
Cls_SDA;
I2C_Delay;
Cls_SCL;
I2C_Delay;
}
//*****************************************************************
//函 数 名 : I2C_Stop
//建 立 时 间 : 2006-8-11
//功 能 描 述 :
//备 注 : 没有返回值
//最后修改时间 : 2006-8-11
//*****************************************************************
void I2C_Stop(void)
{
I2C_DDR|=(1<<SDA);
I2C_DDR|=(1<<SCL);
Set_SCL;
I2C_Delay;
Set_SDA;
I2C_Delay;
Set_SCL;
I2C_Delay;
}
//*****************************************************************
//函 数 名 : I2C_Write
//建 立 时 间 : 2006-8-11
//功 能 描 述 :
//备 注 : 没有返回值
//最后修改时间 : 2006-8-11
//*****************************************************************
void I2C_Write(unsigned char dat)
{
unsigned char acktime,i;
unsigned char wb;
wb=dat;
for(i=0;i<8;i++)
{
if( wb&0x80 ) Set_SDA;
else Cls_SDA;
wb=wb<<1;
I2C_Delay;
Set_SCL;
I2C_Delay;
Cls_SCL;
I2C_Delay;
}
//**应答处理**
Set_SDA;
I2C_DDR&=~(1<<SDA);//in
I2C_Delay;
Set_SCL;
//等待应答
for(acktime=0;acktime<100;acktime++){
if( SDA_High )
{
I2C_Delay;
}
else
{
break;
}
if(acktime==100)I2C_Error();
}
Cls_SCL;
I2C_Delay;
//**应答处理退出**
Cls_SDA;
I2C_DDR|=(1<<SDA);//out
}
//*****************************************************************
//函 数 名 : I2C_Read
//建 立 时 间 : 2006-8-11
//功 能 描 述 :
//备 注 : 返回1字节数据。
//最后修改时间 : 2006-8-11
//*****************************************************************
unsigned char I2C_Read(unsigned char bEnd)
{
register unsigned char i,mb;
mb=0;
Set_SDA;
I2C_DDR&=~(1<<SDA);//sda in
I2C_Delay;
for(i=0;i<8;i++)
{
I2C_Delay;
mb=mb<<1;
Set_SCL;
I2C_Delay;
if( SDA_High ) mb|=(1<<0);
else mb&=~(1<<0);
Cls_SCL;
}
I2C_DDR|=(1<<SDA);// sda out
I2C_Delay;
if( bEnd ) Set_SDA;
else Cls_SDA;
I2C_Delay;
Set_SCL;
I2C_Delay;
Cls_SCL;
I2C_Delay;
return mb;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -