本驱动能产生20-40KHz左右的IIC时钟。(11.0592MHz晶振)
若不加延时,可能出现问题。
接收部分未进行测试,发送已经测试完毕。
my_iic.h
#include "regx52.h"
#define uint16_t unsigned short int
#define uint8_t unsigned char
sbit SCL=P1^4;
sbit SDA=P1^5;
#define SCL_0 (SCL=0)
#define SCL_1 (SCL=1)
#define SDA_0 (SDA=0)
#define SDA_1 (SDA=1)
//void myiic_init();
void IIC_Master_Transmit_Mem_1Byte(uint8_t Slave_Address,uint8_t MemAddress,uint8_t Data);
void IIC_Master_Transmit_1Byte(uint8_t Slave_Address,uint8_t Data);
void IIC_Master_Transmit(uint8_t Slave_Address,uint8_t MemAddress,uint8_t *Data,uint8_t length);
uint8_t IIC_Master_Receive_1Byte(uint8_t Slave_Address);
void IIC_Master_Receive(uint8_t Slave_Address,uint8_t MemAddress,uint8_t *Data,uint8_t length);
uint8_t IIC_Master_Receive_Mem_1Byte(uint8_t Slave_Address,uint8_t MemAddress);
my_iic.c
#include "regx52.h"
#include "my_iic.h"
static void IIC_Delay()
{
int i=0;
for (;i<1;i++);
}
static void IIC_Start()
{
SCL_1;
SDA_1;
//IIC_Delay();
SDA_0;
}
static void IIC_Sr()
{
SCL_0;
SDA_1;
IIC_Delay();
SCL_1;
IIC_Delay();
SDA_0;
}
static void IIC_Stop()
{
SCL_0;
SDA_0;
SCL_1;
SDA_0;
SDA_1;
}
static void IIC_Send(uint8_t Data)
{
int i=0;
for (i;i<8;i++)
{
SCL_0;
IIC_Delay();
if (Data&0x80)
SDA_1;
else
SDA_0;
SCL_1;
Data=Data<<1;
}
}
static uint8_t IIC_Receive(void)
{
int i,Receive_Data=0;
for(i=0;i<8;i++)
{
SCL_0;
IIC_Delay();
SCL_1;
if (SDA==1)
Receive_Data|=1;
else
Receive_Data|=0;
Receive_Data<<1;
}
return Receive_Data;
}
static void IIC_Wait_Ack(void)
{
#ifdef IIC_DEBUG
SCL_0;
IIC_Delay();
SDA_0;
SCL_1;
IIC_Delay();
#else
uint8_t i=0;
SCL_0;
IIC_Delay();
SCL_1;
while (SDA!=0)
{
i++;
if (i==255)
{
break;
}
}
#endif
}
static void IIC_Ack(uint8_t Status)
{
SCL_0;
if (Status!=0)
SDA_0;
else
SDA_1;
SCL_1;
IIC_Delay();
SCL_0;
}
void IIC_Master_Transmit_Mem_1Byte(uint8_t Slave_Address,uint8_t MemAddress,uint8_t Data)
{
IIC_Start();
IIC_Send(Slave_Address);
IIC_Wait_Ack();
IIC_Send(MemAddress);
IIC_Wait_Ack();
IIC_Send(Data);
IIC_Wait_Ack();
IIC_Stop();
}
void IIC_Master_Transmit_1Byte(uint8_t Slave_Address,uint8_t Data)
{
IIC_Start();
IIC_Send(Slave_Address);
IIC_Wait_Ack();
IIC_Send(Data);
IIC_Wait_Ack();
IIC_Stop();
}
void IIC_Master_Transmit(uint8_t Slave_Address,uint8_t MemAddress,uint8_t *Data,uint8_t length)
{
IIC_Start();
IIC_Send(Slave_Address);
IIC_Wait_Ack();
IIC_Send(MemAddress);
IIC_Wait_Ack();
while(length--)
{
IIC_Send(*Data++);
IIC_Wait_Ack();
}
IIC_Stop();
}
uint8_t IIC_Master_Receive_1Byte(uint8_t Slave_Address_r)
{
uint8_t Data_Temp=0;
IIC_Start();
IIC_Send(Slave_Address_r|0x01);
IIC_Wait_Ack();
Data_Temp=IIC_Receive();
IIC_Ack(0);
IIC_Stop();
return Data_Temp;
}
void IIC_Master_Receive(uint8_t Slave_Address,uint8_t MemAddress,uint8_t *Data,uint8_t length)
{
IIC_Start();
IIC_Send(Slave_Address);
IIC_Wait_Ack();
IIC_Send(MemAddress);
IIC_Wait_Ack();
IIC_Sr();
IIC_Send(Slave_Address|0x01);
IIC_Wait_Ack();
while (length--)
{
*Data++=IIC_Receive();
if (length!=0)
IIC_Ack(1);
else
IIC_Ack(0);
}
IIC_Stop();
}
uint8_t IIC_Master_Receive_Mem_1Byte(uint8_t Slave_Address,uint8_t MemAddress)
{
uint8_t Data_Temp=0;
IIC_Start();
IIC_Send(Slave_Address);
IIC_Wait_Ack();
IIC_Send(MemAddress);
IIC_Wait_Ack();
IIC_Sr();
IIC_Send(Slave_Address|0x01);
IIC_Wait_Ack();
Data_Temp=IIC_Receive();
IIC_Ack(0);
IIC_Stop();
return Data_Temp;
}