📄 iic.c
字号:
/*********************************************/
// File Name: IIC.c
// Author: henny
// Date: 2006/3/1
// Note: Crystal=11.0592MHz
/*********************************************/
#include <SST89x5xxRD2.h>
#include <intrins.h>
#include "Public.h"
#define HIGH 1
#define LOW 0
#define SCL P1_0
#define SDA P1_1
#define Nop() _nop_()
BOOL Ack;
VOID IIC_Start()
{
SDA=HIGH;
Nop();
SCL=HIGH;
Nop();/*>4.7us*/
Nop();
Nop();
Nop();
Nop();
Nop();
SDA=LOW;
Nop();/*>4us*/
Nop();
Nop();
Nop();
Nop();
SCL=LOW;
Nop();/*>4.7us*/
Nop();
Nop();
Nop();
Nop();
Nop();
}
VOID IIC_Stop()
{
SDA=LOW;
Nop();
SCL=HIGH;
Nop();/*>4us*/
Nop();
Nop();
Nop();
Nop();
SDA=HIGH;
Nop();
Nop();
Nop();
Nop();
}
BYTE IIC_Read()
{
BYTE IIC_data=0;
BYTE i;
SDA=HIGH;
for(i=0;i<8;i++)
{
Nop();
SCL=LOW;
Nop();/*>4.7us*/
Nop();
Nop();
Nop();
Nop();
Nop();
SCL=HIGH;
Nop();/*>4us*/
Nop();
IIC_data=IIC_data<<1;
if(SDA==HIGH)
IIC_data=IIC_data+1;
Nop();
Nop();
Nop();
}
SCL=LOW;
Nop();
Nop();
return(IIC_data);
}
VOID IIC_Write(BYTE IIC_data)
{
BYTE i;
for(i=0;i<8;i++)
{
if((IIC_data<<i)&0x80)
SDA=HIGH;
else
SDA=LOW;
Nop();
SCL=HIGH;
Nop();/*>4us*/
Nop();
Nop();
Nop();
Nop();
SCL=LOW;
Nop();/*>4.7us*/
Nop();
Nop();
Nop();
Nop();
Nop();
}
Nop();
Nop();
SDA=HIGH;
Nop();
Nop();
SCL=HIGH;
Nop();/*>4us*/
Nop();
Nop();
Nop();
Nop();
if(SDA==HIGH)
Ack=FALSE;
else
Ack=TRUE;
SCL=LOW;
Nop();/*>4.7us*/
Nop();
Nop();
Nop();
Nop();
Nop();
}
VOID IIC_Ack(BOOL ack)
{
if(ack==FALSE)
SDA=LOW;
else
SDA=HIGH;
Nop();
SCL=HIGH;
Nop();/*>4us*/
Nop();
Nop();
Nop();
Nop();
SCL=LOW;
Nop();/*>4.7us*/
Nop();
Nop();
Nop();
Nop();
Nop();
}
/*
BOOL IRcvByte(BYTE sla,BYTE *c)
{
IIC_Start();
IIC_Write(sla+1);
if(ack==FALSE)return FALSE;
*c=IIC_Read();
IIC_Ack(TRUE);
IIC_Stop();
return TRUE;
}
BOOL IRcvStr(BYTE sla,BYTE suba,BYTE *s,BYTE no)
{
BYTE i;
IIC_Start();
IIC_Write(sla);
if(ack==FALSE)return FALSE;
IIC_Write(suba);
if(ack==FALSE)return FALSE;
IIC_Start();
IIC_Write(sla+1);
if(ack==FALSE)return FALSE;
for(i=0;i<no-1;i++)
{
*s=IIC_Read();
IIC_Ack(FALSE);
s++;
}
*s=IIC_Read();
IIC_Ack(TRUE);
IIC_Stop();
return TRUE;
}
*/
BOOL ISendByte(BYTE sla,BYTE c)
{
IIC_Start();
IIC_Write(sla);
if(Ack==FALSE)return FALSE;
IIC_Write(c);
if(Ack==FALSE)return FALSE;
IIC_Stop();
return TRUE;
}
BOOL ISendStr(BYTE sla,BYTE suba,BYTE *s,BYTE no)
{
BYTE data i;
IIC_Start();
IIC_Write(sla);
if(Ack==FALSE)return FALSE;
IIC_Write(suba);
if(Ack==FALSE)return FALSE;
for(i=0;i<no;i++)
{
IIC_Write(*s);
if(Ack==FALSE)return FALSE;
s++;
}
IIC_Stop();
return TRUE;
}
BOOL Read_eeprom(BYTE sla,WORD adr,BYTE *s,BYTE no)
{
BYTE i;
IIC_Start();
IIC_Write(sla);
if(Ack==FALSE)return FALSE;
IIC_Write((adr&0xff00)>>8);
if(Ack==FALSE)return FALSE;
IIC_Write(adr&0x00ff);
if(Ack==FALSE)return FALSE;
IIC_Start();
IIC_Write(sla+1);
if(Ack==FALSE)return FALSE;
for(i=0;i<no-1;i++)
{
*s=IIC_Read();
IIC_Ack(FALSE);
s++;
}
*s=IIC_Read();
IIC_Ack(TRUE);
IIC_Stop();
return TRUE;
}
BOOL Write_eeprom(BYTE sla,WORD adr,BYTE *s,BYTE no)
{
BYTE i;
IIC_Start();
IIC_Write(sla);
if(Ack==FALSE)return FALSE;
IIC_Write((adr&0xff00)>>8);
if(Ack==FALSE)return FALSE;
IIC_Write(adr&0x00ff);
if(Ack==FALSE)return FALSE;
for(i=0;i<no;i++)
{
IIC_Write(*s);
if(Ack==FALSE)return FALSE;
s++;
}
IIC_Stop();
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -