📄 iic.c
字号:
#include "..\includes\includes.h"
#define ERRORCOUNT 2
#define _nop_() asm("nop")
void IICStart(void);
void IICStop(void);
INT8U IICRecAck(void);
void IICACK(void);
void IICNoAck(void);
void IICSendByte(unsigned char sendbyte);
unsigned char IICReceiveByte(void);
void IICDelay(unsigned char DelayCount);
void Nop(void);
/***********************************************************************************/
unsigned char RW24XX(unsigned char *DataBuff,unsigned char ByteQuantity,unsigned char Address,unsigned char ControlByte,char dtk)
{
unsigned char errorflag;
char jjj,iii;
iii=ERRORCOUNT;
errorflag=1;
while(iii--){
IICStart();
IICSendByte(ControlByte&0xfe);
if(IICRecAck()){
continue;
}
IICSendByte(Address%256);
if(IICRecAck()){
continue;
}
if(!(ControlByte&0x01)){//写EE
jjj=ByteQuantity;
errorflag=0; //********clr errorflag
while(jjj--){
IICSendByte(*DataBuff++);
if(!IICRecAck()){
continue;
}
errorflag=1;
break;
}
if(errorflag==1){
continue;
}
break;
}else{//读EE
IICStart();
IICSendByte(ControlByte);
if(IICRecAck()){
continue;
}
while(--ByteQuantity){
*DataBuff++=IICReceiveByte();
IICACK();
}
*DataBuff=IICReceiveByte(); //read last byte data
IICNoAck();
errorflag=0;
break;
}
}
IICStop();
if(!(ControlByte&0x01)){
IICDelay(255);
IICDelay(255);
IICDelay(255);
IICDelay(255);
IICDelay(255);
IICDelay(255);
IICDelay(255);
IICDelay(255);
IICDelay(255);
}
return(errorflag);
}
/*****************启动总线**********************/
void IICStart(void)
{
IISCLC=0; //设置为输出
IISDAC=0;
IISDA=1;
IISCL=1;
Nop();
Nop();
IISDA=0;
Nop();
IISCL=0;
}
/*****************停止IIC总线****************/
void IICStop(void)
{
IISCLC=0;
IISDAC=0;
IISCL=0;
Nop();
IISDA=0;
Nop();
IISCL=1;
Nop();
IISDA=1;
Nop();
IISDAC=1;
IISCLC=1;
}
/**************检查应答位*******************/
INT8U IICRecAck(void)
{
INT8U cy;
IISCLC = 0;
IISCL = 0;
IISDAC = 1;
Nop();
IISCL = 1;
Nop();
if(IISDA){ //因为返回值总是放在CY中的
cy=1;//失败
}else{
cy=0;//成功
}
IISCL=0;
return(cy);
}
/***************对IIC总线产生应答*******************/
void IICACK(void)
{
IISCLC=0;
IISDAC=0;
IISCL=0;
Nop();
IISDA=0;
Nop();
IISCL=1;
Nop();
IISCL=0;
IISDAC=1;
IISDA=1;
}
/*****************不对IIC总线产生应答***************/
void IICNoAck(void)
{
IISCLC=0;
IISDAC=0;
IISCL=0;
Nop();
IISDA=1;
Nop();
IISCL=1;
Nop();
IISCL=0;
IISDAC=1;
}
/*******************向IIC总线写数据*********************/
void IICSendByte(unsigned char sendbyte)
{
unsigned char j;
j=0;
IISCLC=0;
IISDAC=0;
for(j=0;j<8;j++){
Nop();
IISCL=0;
Nop();
if(sendbyte&0x80){
IISDA=1;
}else{
IISDA=0;
}
Nop();
sendbyte=sendbyte<<1;
IISCL=1;
}
Nop();
IISCL=0;
Nop();
}
/**********************从IIC总线上读数据子程序**********/
unsigned char IICReceiveByte(void)
{
unsigned char receivebyte,i;
i=8;
receivebyte=0;
IISCLC=0;
IISDAC=1;
Nop();
IISCL=0;
while(i--){
Nop();
receivebyte=receivebyte<<1;
IISCL=1;
Nop();
if(IISDA){
receivebyte=receivebyte+1;
}
IISCL=0;
}
Nop();
return(receivebyte);
}
/***************一个简单延时程序************************/
void IICDelay(unsigned char DelayCount)
{
while(DelayCount--);
}
void Nop(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -