📄 i2ctest.c
字号:
//i1c test//
#include "ADUC812.h"
#include "math.h"
#include "intrins.h"
#include "string.h"
#include "stdio.h"
sbit led=P2^1;
sbit speak=P2^3;
sbit SDA=P3^2;
sbit SCL=P3^3;
#define deviceadd 0xa0
//************* Delay *********//
void delay(int n)
{
int i;
for(i=0;i<=n;i++)
{
_nop_();
}
}
//************* Delay N ms *********//
void delay_ms(int n)
{
int i,j;
for(i=0;i<=n;i++)
{
for(j=0;j<=50;j++) //** Delay 1 ms **//
{
_nop_();
}
}
}
//**************Start**********//
void I2C_start(void)
{
SDA=1;
SCL=1;
delay(3);
SDA=0;
delay(3);
SCL=0;
}
//*************Stop***********//
void I2C_stop(void)
{
SDA=0;
SCL=1;
delay(3);
SDA=1;
delay(3);
SCL=0;
}
//*************Ack**************//
void I2C_ack(void)
{
SDA=0;
SCL=1;
delay(3);
SCL=0;
SDA=1;
}
//*************No Ack*********//
void I2C_nack(void)
{
SDA=1;
SCL=1;
delay(3);
SCL=0;
SDA=0;
}
//*********Check ack signal*******//
bit I2C_Cack(void)
{
bit a;
SDA=1;
SCL=1;
delay(1);
a=SDA;
delay(1);
SCL=0;
delay(3);
if(a==1)
{
return 1;
}
else
{
return 0;
}
}
//**********Send a Bety*********//
void I2C_Send_byte(char da)
{
unsigned char i;
for(i=0;i<8;i++)
{
if((da<<i)&0x80)
{
SDA=1; //send "1"//
SCL=1;
delay(3);
SCL=0;
SDA=0;
delay(3);
}
else
{
SDA=0; //send "0"//
SCL=1;
delay(3);
SCL=0;
delay(3);
}
}
}
//*************receive a byte *********//
unsigned char I2C_Receive_byte(void)
{
unsigned char i,da=0;
bit a;
for(i=0;i<8;i++)
{
SDA=1;
SCL=1;
delay(3);
a=SDA;
delay(3);
SCL=0;
if(a==1)
{
da=da<<1;
da=da|0x01;
}
else
{
da=da<<1;
}
}
return da;
}
//**********Send n bety ,n<16,page[0-7],add[0-255].error return 0********//
bit I2C_Send_Nbyte(unsigned char page,unsigned char add,unsigned char *buffer,unsigned char n)
{
unsigned char i;
I2C_start(); //send start//
I2C_Send_byte(0xa0|(page<<1)); //send device address//
if(I2C_Cack()==1)
{
I2C_stop();
return 0;
}
I2C_Send_byte(add); //send data address//
if(I2C_Cack()==1)
{
I2C_stop();
return 0;
}
for(i=0;i<n;i++) //send data//
{
I2C_Send_byte(buffer[i]);
if(I2C_Cack()==1)
{
I2C_stop();
return 0;
}
}
I2C_stop(); //send stop//
return 1;
}
//***********receive n byte n<16,page[0-7],add[0-255],error return 0*********//
bit I2C_Receive_Nbyte(unsigned char page,unsigned char add,unsigned char *buffer,unsigned char n)
{
unsigned char i;
I2C_start(); //send start//
I2C_Send_byte(0xa0|(page<<1)); //send device address//
if(I2C_Cack()==1)
{
I2C_stop();
return 0;
}
I2C_Send_byte(add); //send data address//
if(I2C_Cack()==1)
{
I2C_stop();
return 0;
}
I2C_stop(); //send stop//
I2C_start(); //send start//
I2C_Send_byte(0xa1|(page<<1)); //send device address read//
if(I2C_Cack()==1)
{
I2C_stop();
return 0;
}
for(i=0;i<n;i++) //send data//
{
buffer[i]=I2C_Receive_byte();
if(i!=n)
{
I2C_ack();
}
else
{
I2C_nack();
}
}
I2C_stop(); //send stop//
return 1;
}
//********main************//
void main(void)
{
unsigned char buffer[8],i;
SCON = 0x52;
TMOD=0x29;
TH1=0xfd;
TL1=0xfd; //** 9600 baud **//
TR1=1; //** start timer 1 **//
TI=1;
EA=1;
/* I2C_start();
I2C_Send_byte(0x64);
if(I2C_Cack()==1)
{
I2C_stop();
}
I2C_Send_byte(0x00);
if(I2C_Cack()==1)
{
I2C_stop();
}
I2C_stop()*/;
while(1)
{
I2C_start();
I2C_Send_byte(0x65);
if(I2C_Cack()==1)
{
I2C_stop();
}
for(i=0;i<8;i++)
{
buffer[i]=I2C_Receive_byte();
if(i!=8)
{
I2C_ack();
}
else
{
I2C_nack();
}
}
I2C_stop();
for(i=0;i<8;i++)
{
printf(",%x,\n",(int)buffer[i]);
}
delay_ms(2000);
}
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -