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

📄 i22c.c

📁 通用曼彻斯特RFID读卡程序
💻 C
字号:
/***********************************************************/
//  This Program Is Designed For Operating 24 Series EEPROM /
//  It is Suitable For All the Products By Using The Very   /
//  											Function.   /				
//  It Has A Head File.It Must Be Added To Your Project,    /
//  							And As Well As The C File.  /
//	It Was Designed By Bozai.                               /
//  Last Modefied At 2005.08.21.                            /
/***********************************************************/




#include <intrins.h>

#include "I2C.h"

#define uchar unsigned char
#define uint unsigned int


/***************************************************/
//                基本操作函数                     //
/***************************************************/
bit ack;	         	/*应答标志位*/
   
// 启动总线
void Start_I2c()
{
  SDA=1;   	
  _nop_();
    _nop_();  
  SCL=1;
  _nop_(); _nop_();_nop_();_nop_();_nop_();    
  SDA=0;   	
  _nop_(); _nop_();_nop_();_nop_();_nop_();
  SCL=0;   
  _nop_();_nop_();  _nop_();
}

// 停止总线
void Stop_I2c()
{
  SDA=0;  
  _nop_();_nop_();
  SCL=1;  
  _nop_(); _nop_();_nop_();_nop_();_nop_();
  SDA=1; 
  _nop_(); _nop_();_nop_();_nop_();
}

// 发送一个字节
void  SendByte(uchar Data)
{
 	uchar i; 
	for(i=0;i<8;i++)  
    {
     	if((Data<<i)&0x80)SDA=1;  
        else  SDA=0;                
     	_nop_();  _nop_();
   	    SCL=1;               
		_nop_(); _nop_(); _nop_();_nop_();_nop_();         
		SCL=0; 
    }
    _nop_();_nop_();_nop_();_nop_();
    SDA=1;                
    _nop_();_nop_(); _nop_();_nop_();   
    SCL=1;
    _nop_();_nop_();_nop_();
    if(SDA==1)ack=0;     
       else ack=1; 
	_nop_(); _nop_();
    SCL=0;
    _nop_();_nop_();
}

//  接受一个字节
uchar  ReceiveByte()
{
  uchar temp;
  uchar i;
  
  temp=0; 
  SDA=1;             	
  for(i=0;i<8;i++)
      {
        _nop_();           
        SCL=0;                  
        _nop_();_nop_(); _nop_();_nop_();_nop_();
        SCL=1;                  
        _nop_();_nop_();
        temp=temp<<1;
        if(SDA==1)temp|=0x01;
        _nop_();_nop_(); 
      }
  SCL=0;    
  _nop_();_nop_();
  return(temp);
}

//  应答信号
void Ack_I2c(bit NoReply)//1为非应答
{
  
  if(NoReply==0)SDA=0;     	   
      else SDA=1;
  _nop_();_nop_(); _nop_();      
  SCL=1;
  _nop_();_nop_();_nop_();_nop_(); _nop_();  
  SCL=0;         
  _nop_();_nop_();    
}



/*******************************************************************
                 用户操作函数                                   
*******************************************************************/

// 向有一个数据地址的器件发送多个字节
bit SendStringOneDataAddress(uchar ChipAddress,uchar DataAddress,uchar *Buffer,uchar Length)
{
   uchar i;
   WP=0;
   Start_I2c();               /*启动总线*/
   SendByte(ChipAddress);             /*发送器件地址*/
   if(ack==0)return(0);
   SendByte(DataAddress);            /*发送器件子地址*/
   if(ack==0)return(0);

   for(i=0;i<Length;i++)
   {   
     SendByte(Buffer[i]);            /*发送数据*/
     if(ack==0)return(0);
   } 
   Stop_I2c();                /*结束总线*/ 
   WP=1;
   return(1);
}



// 从有一个数据地址的器件读多个字节
bit ReceiveStringOneDataAddress(uchar ChipAddress,uchar DataAddress,uchar *Buffer,uchar Length)
{
   uchar i;
   WP=0;
   Start_I2c();                  /*启动总线*/
   SendByte(ChipAddress);        /*发送器件地址*/
   if(ack==0)return(0);
   SendByte(DataAddress);        /*发送器件子地址*/
   if(ack==0)return(0);
   Start_I2c();			         /*重新启动总线*/
   SendByte(ChipAddress+1);
   if(ack==0)return(0);
   for(i=0;i<Length-1;i++)
   {   
     Buffer[i]=ReceiveByte();    /*发送数据*/
      Ack_I2c(0);                /*发送就答位*/ 
   } 
   Buffer[i]=ReceiveByte();
   Ack_I2c(1);                   /*发送非应答位*/
   Stop_I2c();                   /*结束总线*/ 
   WP=1;
   return(1);
}

⌨️ 快捷键说明

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