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

📄 i2cfeep.h

📁 i2c通信
💻 H
字号:
#ifndef	_I2CFEEP_H
#define	_I2CFEEP_H   
#define I2CADD 0xd0
#define  I2CINIT(ParaName)  (ParaName=BeEEPROM)
unsigned char BeEEPROM[10];
//int slarv =0;
unsigned char slarv=0;
//int adrpoint=33; 
unsigned char adrpoint=33;
//unsigned char judge=0x7e;
unsigned char state=0;   

/*--------------------------------------------------*/
interrupt [18] void twi_isr(void)
{
 //twi event   
  TWCR&=0X7F;  
  //TWCR|=0X80;
   //COM_LED=1-COM_LED; 
      //   if(LEDCOM == 0)
      //  {
              //  COM_LED=0;
       //         LEDCOM=1;
       // }
      //  else
       // {
               // COM_LED=1;
       //         LEDCOM=0;
       // }  
   //delay_ms(1);  
   state=TWSR&0xF8;
   //USART_Transmit_Unwait(state);
 switch (state)
 {
 //从接收
 case TW_SR_SLA_ACK: 
 case TW_SR_ARB_LOST_SLA_ACK:
 case TW_SR_GCALL_ACK:
 case TW_SR_ARB_LOST_GCALL_ACK:
          slarv=0; 
 	  Twi_Ack();  //返回ACK
	  break;
 case TW_SR_DATA_ACK:
 case TW_SR_DATA_NACK: 
           
            if(slarv==0)
            {   
               adrpoint = TWDR; 
               slarv = 1;
            }
            else
            {   BeEEPROM[adrpoint]=TWDR;
                //datais[adrpoint] = TWDR;  
                 slarv=0;
               adrpoint++;
            }    
         
 	  Twi_Ack();  //返回ACK
	  break;
 case TW_SR_GCALL_DATA_ACK:
 case TW_SR_GCALL_DATA_NACK:	
 
 	  Twi_Ack();  //返回ACK
	  break;
 case TW_SR_STOP:

 	  Twi_Ack(); 
	  break;
 //从发送*****************************
 
   case TW_ST_SLA_ACK:               // 0xA8: 自己的SLA+R 已经被接收,ACK 已返回 

   case TW_ST_ARB_LOST_SLA_ACK:// 0xB0: SLA+R/W 作为主机的仲裁失败;自己的SLA+R 已经被接收,ACK 已返回 
      // 被选中为从读出 (数据将从传回主机) 
	  //TWDR=main_tmp;  //发送全局变量中值 
	 
	  
  case TW_ST_DATA_ACK:            // 0xB8: TWDR 里数据已经发送,接收到ACK 
      //发送数据位 
	// TWDR=main_tmp; 
	//TWDR=0xaa; 
	if(adrpoint!=33)
	  TWDR=BeEEPROM[adrpoint]; 
       Twi_Ack();  
      
	  break;    
   case TW_ST_DATA_NACK:            // 0xC0: TWDR 里数据已经发送接收到NOT ACK 
   case TW_ST_LAST_DATA:            // 0xC8: TWDR 的一字节数据已经发送(TWAE = “0”);接收到ACK 
      // 全部完成 
      // 从方式开放 
      Twi_NoAcK(); 
	  twi_slave_init(I2CADD);        //重新回到初始化状态,等待接收模式的到来
      break; 
   case TW_NO_INFO:                 // 0xF8: 没有相关的状态信息;TWINT = “0” 
      // 无操作 
	  break; 
   case TW_BUS_ERROR:               // 0x00: 由于非法的START 或STOP 引起的总线错误 
      // 内部硬件复位,释放总线 
      TWCR=TWCR&TWCR_CMD_MASK|(1<<7)|(1<<4)|(1<<6); 
     break;  
 	 default:   
 	        //PORTD=0XFF;
	 break;
 }
}    
/*--------------------------------------------------*/

/*--------------------------------------------------*/
void twi_slave_init(uint8 add)
{
 TWCR= 0x00; //disable twi
 TWBR= 0x00; //set bit rate
 TWSR= 0x00; //set prescale
 TWAR= add; //set slave address 从机地址为 0x01
 TWCR= 0x45; //enable twi
 //TWEN必须置位以使能TWI接口。TWEA也要置位以使主机寻址到自己(从机地址或广播) 时返回确认信息ACK
} 
/*--------------------------------------------------*/










#endif

⌨️ 快捷键说明

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