IIC的疑惑

      要用到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();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值