PIC单片机访问铁电存储器的程序模块
时间:11-13
来源:互联网
点击:
//此子程序用于PIC系列单片机和铁电存储器FM24C04交换数据
#define bitset(var,bitno) ((var)|=(1<(bitno)))
#define bitclr(var,bitno) ((var)&=((1
//定义铁电的写地址和读地址
//用高256字节,则为A2 A3
//用低256字节,则为A0 A1
#define WriteDeviceAdd 0xa2 //用高256字节
#define ReadDeviceAdd 0xa3 //用高256字节
#define SDA RC3
#define SCL RC2
/********************************************************************/
void I2C_Start()
{
SDA=1;
SCL=1;
SDA=0;
SCL=0;
}
/********************************************************************/
void I2C_Stop()
{
SCL=0;
SDA=0;
SCL=1;
SDA=1;
}
/********************************************************************/
bit I2C_WaitAck()
{
uchar ErrorTime=255;
SDA=1;
SCL=1;
bitset(TRISC,3);
while(SDA)
{
ErrorTime--;
if(ErrorTime==0)
{
bitclr(TRISC,3);
I2C_Stop();
return(0);
}
}
bitclr(TRISC,3);
SCL=0;
return(1);
}
/********************************************************************/
void I2C_SendNotAck()
{
SDA=1;
SCL=1;
SCL=0;
}
/*******************************************************************/
void I2C_SendAck()
{
SDA=0;
SCL=1;
SCL=0;
}
/********************************************************************/
void I2C_WriteByte(uchar input)
{
uchar i=8;
while(i--)
{
SCL=0;
if(input&0x80) SDA=1;
else SDA=0;
input=input<1;
SCL=1;
}
SCL=0;
}
/********************************************************************/
uchar I2C_ReceiveByte()
{
uchar i=8,rbyte=0;
SDA=1;
bitset(TRISC,3);
while(i--)
{
rbyte=rbyte<1;
SCL=1;
if(SDA) rbyte++;
SCL=0;
}
bitclr(TRISC,3);
return(rbyte);
}
/********************************************************************/
void I2C_Wr24c04(uchar *Wdata,uchar FmAdd,uchar bytes)
{
I2C_Start();
I2C_WriteByte(WriteDeviceAdd);
I2C_WaitAck();
I2C_WriteByte(FmAdd);
I2C_WaitAck();
for(;bytes!=0;bytes--)
{
I2C_WriteByte(*Wdata);
I2C_WaitAck();
Wdata++;
}
I2C_Stop();
}
/********************************************************************/
void I2C_Rd24c04(uchar *RamAdd,uchar FmAdd,uchar bytes)
{
I2C_Start();
I2C_WriteByte(WriteDeviceAdd);
I2C_WaitAck();
I2C_WriteByte(FmAdd);
I2C_WaitAck();
I2C_Start();
I2C_WriteByte(ReadDeviceAdd);
I2C_WaitAck();
while(bytes!=1)
{
*RamAdd=I2C_ReceiveByte();
I2C_SendAck();
RamAdd++;
bytes--;
}
*RamAdd=I2C_ReceiveByte();
I2C_SendNotAck();
I2C_Stop();
}
#define bitset(var,bitno) ((var)|=(1<(bitno)))
#define bitclr(var,bitno) ((var)&=((1
//定义铁电的写地址和读地址
//用高256字节,则为A2 A3
//用低256字节,则为A0 A1
#define WriteDeviceAdd 0xa2 //用高256字节
#define ReadDeviceAdd 0xa3 //用高256字节
#define SDA RC3
#define SCL RC2
/********************************************************************/
void I2C_Start()
{
SDA=1;
SCL=1;
SDA=0;
SCL=0;
}
/********************************************************************/
void I2C_Stop()
{
SCL=0;
SDA=0;
SCL=1;
SDA=1;
}
/********************************************************************/
bit I2C_WaitAck()
{
uchar ErrorTime=255;
SDA=1;
SCL=1;
bitset(TRISC,3);
while(SDA)
{
ErrorTime--;
if(ErrorTime==0)
{
bitclr(TRISC,3);
I2C_Stop();
return(0);
}
}
bitclr(TRISC,3);
SCL=0;
return(1);
}
/********************************************************************/
void I2C_SendNotAck()
{
SDA=1;
SCL=1;
SCL=0;
}
/*******************************************************************/
void I2C_SendAck()
{
SDA=0;
SCL=1;
SCL=0;
}
/********************************************************************/
void I2C_WriteByte(uchar input)
{
uchar i=8;
while(i--)
{
SCL=0;
if(input&0x80) SDA=1;
else SDA=0;
input=input<1;
SCL=1;
}
SCL=0;
}
/********************************************************************/
uchar I2C_ReceiveByte()
{
uchar i=8,rbyte=0;
SDA=1;
bitset(TRISC,3);
while(i--)
{
rbyte=rbyte<1;
SCL=1;
if(SDA) rbyte++;
SCL=0;
}
bitclr(TRISC,3);
return(rbyte);
}
/********************************************************************/
void I2C_Wr24c04(uchar *Wdata,uchar FmAdd,uchar bytes)
{
I2C_Start();
I2C_WriteByte(WriteDeviceAdd);
I2C_WaitAck();
I2C_WriteByte(FmAdd);
I2C_WaitAck();
for(;bytes!=0;bytes--)
{
I2C_WriteByte(*Wdata);
I2C_WaitAck();
Wdata++;
}
I2C_Stop();
}
/********************************************************************/
void I2C_Rd24c04(uchar *RamAdd,uchar FmAdd,uchar bytes)
{
I2C_Start();
I2C_WriteByte(WriteDeviceAdd);
I2C_WaitAck();
I2C_WriteByte(FmAdd);
I2C_WaitAck();
I2C_Start();
I2C_WriteByte(ReadDeviceAdd);
I2C_WaitAck();
while(bytes!=1)
{
*RamAdd=I2C_ReceiveByte();
I2C_SendAck();
RamAdd++;
bytes--;
}
*RamAdd=I2C_ReceiveByte();
I2C_SendNotAck();
I2C_Stop();
}
PIC单片机铁电存储 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)