⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iic.c

📁 用51单片机实现的在屏幕上显视文字,外接一颗MT230OSDIC
💻 C
字号:

#include "golbal.h"

sbit SCL2 = P1^6;
sbit SDA2 = P1^7;

union {
   BYTE ByteArray[32];
   WORD WordArray[16];
   LWORD DWordArray[8];
}idata IICBuf;   // IIC data Address

BYTE idata IICWait;

BYTE * data IICBufPtr;

bit error;

void I2cStop(void)
{
   byM230_IIC_CTR=0x00;
   ShortDelay(1);
   byM230_IIC_CTR=byM230_IIC_CTR|0x02;   //P rise
}

void InitialIIC(void)
{    
#ifdef	SOFTIIC2 
		 SCL2=1; 
     SDA2=1;
#else
		 I2cStop();
   //HSCL=1;     //han   4.3
   //HSDA=1;
#endif
     IICBufPtr=IICBuf.ByteArray;
}

#ifdef	SOFTIIC2

void CheckIIC2Bus(void)
{
   error=0;
   if((SDA2!=1)||(SCL2!=1))
   {
      DelayX1ms(2);
      if((SDA2!=1)||(SCL2!=1))
      {
         error=1;
         return;
      }
   }
}

void IIC2_Start(void) {
  SDA2=1; 			
  IIC2Delay();
  SCL2=1;
  IIC2Delay(); //start condition setup time :4.7 us
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  SDA2=0;
  IIC2Delay(); //start condition hold time :4 us
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  SCL2=0;
  IIC2Delay();// bus free time for next transmission :4.7 us
}

void IIC2_Stop(void) {

  SDA2=0;                                    
  IIC2Delay();
  SCL2=1;
  IIC2Delay();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  SDA2=1;
  IIC2Delay();
}

bit IIC2_Data_In(BYTE bytedata) {
  
  BYTE data i;
  bit ack;

  for(i=0; i<8; i++) {
    SDA2=bytedata & 0x80;
    IIC2Delay(); //Clock Low Period : 4.7 us
    SCL2=1;
    IIC2Delay(); //Clock High Period
    _nop_();
    _nop_();
    bytedata<<=1;
    SCL2=0; 
  }
  _nop_();
  _nop_();
  IIC2Delay();
  SDA2=1;
  IIC2Delay();
  SCL2=1;
  IIC2Delay();
  _nop_();
  _nop_();
  ack=SDA2;
  SCL2=0; 
  IIC2Delay();
  //SDA2=0; 

  return ack;
}


//============================================================================== 
BYTE IIC2_Data_Out(void) {
  
  BYTE data i;
  BYTE data bytedata=0;
  
  SDA2=1;  
  for(i=0; i<8; i++) {    
    SCL2=1;          
    bytedata<<=1;
    bytedata|=SDA2;
    IIC2Delay();
    SCL2=0;           
    IIC2Delay();
  }

  return bytedata;  
}

void Send2_Acknowledge(bit ack) {

  SDA2=ack; 
  IIC2Delay();
  SCL2=1;
  IIC2Delay();
  SCL2=0; 
  IIC2Delay();
}

void IICWrite(BYTE device, BYTE address, BYTE count)
{
   //CheckIIC2Bus();
   //if(error)
   //{
   //   IIC2_Stop();
   //   return;
   ///}
   IIC2_Start();
   error=IIC2_Data_In(device);
   if(error)
   {
      IIC2_Stop();
      return;
   }
   error=IIC2_Data_In(address);
   if(error)
   {
      IIC2_Stop();
      return;
   }
   while(count!=0)
   {
      error=IIC2_Data_In(*IICBufPtr);
      if(error)   break;
      count--;
      IICBufPtr++;
   }
   IIC2_Stop();
}

void IICRead(BYTE device, BYTE address, BYTE count)
{
   //CheckIIC2Bus();
   //if(error)
   //{
   //   IIC2_Stop();
   //   return;
   //}
   IIC2_Start();
   error=IIC2_Data_In(device);
   if(error)
   {
      IIC2_Stop();
      return;
   }
   error=IIC2_Data_In(address);
   if(error)
   {
      IIC2_Stop();
      return;
   }
   IIC2_Start();
   error=IIC2_Data_In(device|1);
   if(error)
   {
      IIC2_Stop();
      return;
   }
   while(count!=0)
   {
      *IICBufPtr=IIC2_Data_Out();
      if(count==1)  // last byte
      {
         Send2_Acknowledge(1);
      }
      else
      {
         Send2_Acknowledge(0);
      }
      count--;
      IICBufPtr++;
   }
   IIC2_Stop();
}

//iic write function with two byte address
void IIC_Write2(BYTE device, WORD address, BYTE count)
{
   BYTE data j;

   error=0;
   if(error)
   {
      IIC2_Stop();
      return;
   }   
   IIC2_Start();
   error=IIC2_Data_In(device);
   if(error)
   {
      IIC2_Stop();
      return;
   }
   error=IIC2_Data_In(address%256);
   if(error)
   {
      IIC2_Stop();
      return;
   }
   error=IIC2_Data_In(address/256);
   if(error)
   {
      IIC2_Stop();
      return;
   }
   while(count!=0)
   {
      j=*IICBufPtr;
      error=IIC2_Data_In(*IICBufPtr);
      if(error)
         break;
      count--;
      IICBufPtr++;
   }
   IIC2_Stop();
}

//iic read function with two byte address
void IIC_Read2(BYTE device, WORD address, BYTE count)
{
   if(error)
   {
      IIC2_Stop();
      return;
   }   
   IIC2_Start();
   error=IIC2_Data_In(device);
   if(error)
   {
      IIC2_Stop();
      return;
   }
   error=IIC2_Data_In(address%256);
   if(error)
   {
      IIC2_Stop();
      return;
   }
   error=IIC2_Data_In(address/256);
   if(error)
   {
      IIC2_Stop();
      return;
   }
   IIC2_Stop();
   IIC2_Start();
   error=IIC2_Data_In(device|1);
   if(error)
   {
      IIC2_Stop();
      return;
   }
   while(count!=0)
   {
      *IICBufPtr=IIC2_Data_Out();
      if(count==1)  // last byte
      {
         Send2_Acknowledge(1);
      }
      else
      {
         Send2_Acknowledge(0);
      }
      count--;
      IICBufPtr++;
   }
   IIC2_Stop();
}

#else
#ifdef	HARDIIC2
// hardware IIC
// Wait for byM230_IIC_MBUFI flag and clear it, return 1 if time out, and check ack.
bit wait_IIC(void)
{
   IICWait=IIC_WAIT_TIME;
   error=0;
   //check MBuf sent/received
   while( (byM230_IIC_INTFLG&0x01)==0)   // Wait for byM230_IIC_MBUFl                  
   {
      if(IICWait==0)
      {
         error=1;
         break;
      }
   }
   // check ack
   if((byM230_IIC_STUS2&0x80) != 0)
   {
      error=1;
   }
   
   byM230_IIC_INTFLG=byM230_IIC_INTFLG&0xfe;
   return(error); 
}
  
void I2cStart(void)
{
   byM230_IIC_CTR=0x00;
   ShortDelay(1);
   byM230_IIC_CTR=byM230_IIC_CTR|0x01;   //S rise
}

/*
void I2cStop(void)
{
   byM230_IIC_CTR=0x00;
   ShortDelay(1);
   byM230_IIC_CTR=byM230_IIC_CTR|0x02;   //P rise
}
*/
/*
void SendAck(bit NoAck)
{
   if(NoAck)
   {
      byM230_IIC_CTR=0x84;
   }
   else
   {
      byM230_IIC_CTR=0x80;
   }
}*/

void IICWrite(BYTE slave,BYTE address,BYTE count)
{
   BYTE data i;

   byM230_IIC_INTFLG=byM230_IIC_INTFLG&0xfe;
   byM230_IIC_MBUF=slave;   // First byte of IIC data:slave address
   I2cStart();
   error=wait_IIC(); 

   byM230_IIC_MBUF=address;   // Send next byte:sub address
   error=wait_IIC(); 

   for(i=0; i<count; i++)
   {                                                             
      byM230_IIC_MBUF=*IICBufPtr;   // Send next byte
      IICBufPtr++;
      error=wait_IIC(); 
      if(error==1)   break; 
   } 

   I2cStop();
}

void IICRead(BYTE slave, BYTE address, BYTE count)
{
   BYTE data i;

   byM230_IIC_INTFLG=byM230_IIC_INTFLG&0xfe;
   //start
   byM230_IIC_CTR=0x80;   // S=0,P=0
   byM230_IIC_MBUF=slave;   // slave address (dummy write)
   ShortDelay(1);
   byM230_IIC_CTR=0x81;   // S=1,P=0
   error=wait_IIC(); 
   //dummy write
   ShortDelay(1);
   byM230_IIC_MBUF=address;   //sub address
   error=wait_IIC(); 

   //restart
   byM230_IIC_CTR=byM230_IIC_CTR & 0xfe;   // S set 0
   byM230_IIC_MBUF=slave|0x01;   //restart + slave address (read)
   ShortDelay(1);
   byM230_IIC_CTR=byM230_IIC_CTR | 0x01;   // S set 1
   error=wait_IIC(); 
   //dummy read
   ShortDelay(1);
   IICBuf.ByteArray[0]=byM230_IIC_MBUF;   
   error=wait_IIC();
   i=0;
   while(count!=0)
   {                    
      if(count==1)
      {
         //byM230_IIC_CTR=byM230_IIC_CTR|0x04;   //Ack=1 
         byM230_IIC_CTR=0x05;   //Ack=1 
      }
      ShortDelay(1);
      *IICBufPtr=byM230_IIC_MBUF;
      IICBufPtr++;
      error=wait_IIC();
      if(error==1)   break; 
      count--;
      i++;
   } 
   I2cStop();
}
#else
  // no define SOFTIIC2 or HARDIIC2
#endif
#endif



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -