要用到IIC的东西了哦,是一个24C128的片子的读写,找了个程序,稍修改后倒是可以用但是还是有一点的疑惑不解!这个文件中的ReceiveAck()都是是何用?可以用它来判断应答信号吗?调试的时候它是正常执行过的,程序没有去判断ACK的应答信号的呀!正在思考中,希望可以悟出来哦!呵呵!
/********************************************************************************
*文件名称:i2c.c
*功能描述:i2c的各项功能函数
*编 制: LZS
*备 注:编译器keil C51 V7.06;时间2008.4.28;版本V1.0
**********************************************************************************/
#include <pl3105.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SDA=P0^0;
sbit SCL=P0^1;
sbit led = P1^7;
/********************************************************************************
*函数名称:void Delay(unsigned int delay)
*函数描述:延时delay个ms
*入口参数:unsigned int delay
*出口参数:无
*********************************************************************************/
void Delay(unsigned int delay)
{
uint i;
for(;delay>0;delay--)
{
for(i=0;i<124;i++)
{
WDT_RST=0xa1; //feed watchdog
}
}
}
/***********************************************************************************
*函数名称:void I2CSystemInit(void)
*功能描述:i2c初始化
*入口参数:无
*出口参数:无
**************************************************************************************/
void I2CSystemInit(void)
{
led=0;
Delay(5000);
led=1;
Delay(5000);
}
/*********************************************************************************
*函数名称:void delay()
*功能描述:时序延时
*入口参数:无
*出口参数:无
**********************************************************************************/
void delay()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/*********************************************************************************
*函数名称:void Start()
*功能描述:启动i2c总线
*入口参数:无
*出口参数:无
**********************************************************************************/
void Start() //SCL为高时,SDA由高到低的变化就是一个起始状态
{
SCL=0;
_nop_();
SDA=1;
_nop_();
SCL=1;
delay();
SDA=0;
delay();
SCL=0;
_nop_();
}
/*********************************************************************************
*函数名称:void Stop()
*功能描述:停止i2c总线
*入口参数:无
*出口参数:无
**********************************************************************************/
void Stop() //SCL为高时,SDA由低到高的变化就是一个起始状态
{
SDA=0;
_nop_();
SCL=1;
_nop_();
SDA=1;
delay();
SCL=0;
_nop_();
}
/*********************************************************************************
*函数名称:void SendByte(uchar SData)
*功能描述:发送一个字节
*入口参数:uchar SData:要发送的字节
*出口参数:无
**********************************************************************************/
void SendByte(uchar SData) //发送数据SCL为低时数据SDA改变,SCL为高时发送
{
uchar j;
for(j=0;j<8;j++)
{
SCL=0;
SData<<=1;
SDA=CY;
SCL=1;
delay();
}
SCL=0;
}
/*********************************************************************************
*函数名称:uchar ReceiveByre()
*功能描述:接收一个字节数据
*入口参数:无
*出口参数:RData:接收到的数据
**********************************************************************************/
uchar ReceiveByte() //接收数据
{
uchar i;
uchar RData;
RData=0;
for(i=0;i<8;i++)
{
SDA=1;
_nop_();
SCL=1;
_nop_();
_nop_();
RData=RData<<1;
RData=RData|SDA;
_nop_();
_nop_();
SCL=0;
}
return(RData);
}
/*********************************************************************************
*函数名称:bit ReceiveAck()
*功能描述:接收到应答信号
*入口参数:无
*出口参数:Ack:应答信号
**********************************************************************************/
bit ReceiveAck() //主机接收应答信号
{
bit Ack;
SDA=1;
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_();
Ack=SDA;
_nop_();
_nop_();
SCL=0;
_nop_();
return(Ack);
}
/*********************************************************************************
*函数名称:void SendAck()
*功能描述:发送应答信号
*入口参数:无
*出口参数:无
**********************************************************************************/
void SendAck()
{
SDA=0;
_nop_();
_nop_();
SCL=1;
delay();
SCL=0;
_nop_();
_nop_();
}
/*********************************************************************************
*函数名称:void SendNoAck()
*功能描述:发送非应答信号
*入口参数:无
*出口参数:无
**********************************************************************************/
void SendNoAck()
{
SDA=1;
_nop_();
_nop_();
SCL=1;
delay();
SCL=0;
_nop_();
_nop_();
}
/*********************************************************************************
*函数名称:void SendToSubAddress(uchar SlaveAddress,uint SubAddress,uchar *pSData,uchar N)
*功能描述:发送多个字节的数据
*入口参数:uchar SlaveAddress:器件地址;
uint SubAddress:内部地址(16bit)
uchar *pSData:要发送数据的首地址
uchar N:要发送数据的个数
*出口参数:无
**********************************************************************************/
void SendToSubAddress(uchar SlaveAddress,uint SubAddress,uchar *pSData,uchar N)
{
uchar i;
Start();
SendByte(SlaveAddress); //选择器件地址
ReceiveAck();
SendByte(SubAddress/256); //发送字地址高位
ReceiveAck();
SendByte(SubAddress%256); //发送字地址低位
ReceiveAck();
for(i=0;i<N;i++)
{
SendByte(pSData[i]);
ReceiveAck();
}
Stop();
}
/************************************************************************************************
*函数名称:void ReceiveFromSubAddress(uchar SlaveAddress,uchar SubAddress,uchar *pRData,uchar N)
*函数描述:从器件中连续读取多个字节的数据
*入口参数:uchar SlaveAddress:器件地址
uint SubAddress:器件内部地址
uchar *pRData: 读出的数据保存地址
uchar N:读的数据长度
*出口参数:无
*************************************************************************************************/
void ReceiveFromSubAddress(uchar SlaveAddress,uint SubAddress,uchar *pRData,uchar N)
{
uchar i;
Start();
SendByte(SlaveAddress); //发送器件地址
ReceiveAck();
SendByte(SubAddress/256); //发送字地址高位
ReceiveAck();
SendByte(SubAddress%256); //发送字地址低位
ReceiveAck();
Start(); //I2C 开始
SendByte(SlaveAddress+1); //读设备
ReceiveAck();
for(i=0;i<N-1;i++)
{
pRData[i]=ReceiveByte();
SendAck();
}
pRData[i]=ReceiveByte();
SendNoAck();
Stop();
}