📄 a24c32.c
字号:
//i2c.c
//for mp-198
/* 使用全局变量:
* addr
*
*/
void Read24C32(unsigned char eAddr,unsigned char numb,unsigned char *ptr)
{
if (numb==0)
{
Flag.SUCCESS=0;
return;
}
numb--;
eStart(); //开始
eSend(0xa0); //写主控器识别地址(写)
WaitAck() ; //等待应答
eSend(0); //送高位
WaitAck() ; //等待应答
eSend(eAddr); //送低位
WaitAck() ; //等待应答
//
eStart();
eSend(0xa1);
WaitAck() ; //等待应答
while(numb)
{
clrwdt();
*ptr=eReceive();
eAck();
ptr++;
numb--;
}
*ptr=eReceive();
eNack();
eStop();
Flag.SUCCESS=1;
}
//=================================
void Write24C32(unsigned char eAddr,unsigned char numb,unsigned char *ptr)
{
if (numb==0)
{
Flag.SUCCESS=0;
return;
}
eWP_Lo();// write enable
//eSeek()
eStart(); //开始
eSend(0xa0); //写主控器识别地址(写)
WaitAck(); //等待应答
eSend(0); //送高位
WaitAck(); //等待应答
eSend(eAddr); //送低位
WaitAck(); //等待应答
//
while (numb)
{
clrwdt();
eSend(*ptr); //发送数据
WaitAck(); //等待应答
ptr++;
numb--;
}
eStop();//停止
//延时10ms
DelayMS(10);
Flag.SUCCESS=1;
}
//=================================
void DelayUS()//10us
{
unsigned char i;
for(i=5;i--;)
{;}
}
//-----------------------------------
void DelayMS(unsigned char val)
{
unsigned int k;
do{
clrwdt();
for(k=550;k--;)
{
nop();
}
}while(--val);
}
/* ******************** */
void eAck() //发送继续读信号
{
SCL_Lo();
SDA_Lo();
DelayUS();
SCL_Hi();
DelayUS();
SCL_Lo();
}
//-----------------------------------
void eNack() //停止继续读
{
SCL_Lo();
SDA_Hi();
DelayUS();
SCL_Hi();
DelayUS();
SCL_Lo();
}
//-----------------------------------
void WaitAck() //等待应答
{
SCL_Hi();
DelayUS();
if (SDA == 1)
Flag.SUCCESS = 0;
SCL_Lo();
if (Flag.SUCCESS==0)
{
while(1)
{
;
}
}
}
//-----------------------------------
void eStart()
{
Flag.SUCCESS = 1;
SCL_Hi();
DelayUS();
SDA_Lo(); // SDA : Hi --> Lo , when SCL = Hi
DelayUS();
SCL_Lo();
}
// =================================
void eStop()
{
SCL_OUT();
SDA_OUT();
SDA_Lo();
SCL_Hi();
DelayUS();
SDA_Hi();
DelayUS();
SDA_INPUT(); // SDA : Lo --> Hi , when SCL = Hi
SCL_INPUT();
eWP_Hi(); // write protected
clrwdt();
}
//=================================
//(堆栈深度:2)
void eSend(unsigned char ebyte)
{
unsigned char i=8 ; /* byte = 8 bits */
SCL_OUT();
SDA_OUT();
do
{
SCL_Lo();
if((ebyte&0x80)==0)
port_sda=0; //发送 0
else
port_sda=1; //发送 1
SCL_Hi();
nop();
SCL_Hi();
DelayUS();
SCL_Lo();
ebyte <<= 1;
} while(--i);
SDA_INPUT(); //释放总线等待应答
DelayUS();
}
//==================================
unsigned char eReceive()
{
unsigned char ebyte=0,i=8;
SDA_Lo();
SDA_INPUT();
do
{
ebyte = (ebyte <<1);
DelayUS();
SCL_Hi(); //SCL-->HIGHT,read data
DelayUS();
if(port_sda) //读 1
{
ebyte |= 1;
}
SCL_Lo(); //SCL-->LOW, next bit
}while(--i);
return ebyte;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -