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

📄 drv_i2c.i

📁 该模板使用于周立功公司研发的EasyARM2100系列开发板
💻 I
字号:
#line 1 "src\\drv_I2C.c"




 
#line 1 "src\\system.h"










#line 1 "src\\target.h"





























 










extern void Reset(void);
















 

extern void TargetInit(void);


















 





 



 
#line 12 "src\\system.h"

#line 1 "src\\sys_init.h"





extern 	void	init_sys(void);
extern 	void 	init_io(void);
extern 	void 	init_clock(void);
extern 	void 	init_timer0(void);
extern 	void 	init_timer1(void);
extern 	void 	init_int0(void);
extern 	void 	init_int2(void);

#line 14 "src\\system.h"













 
















 




















#line 7 "src\\drv_I2C.c"

 
volatile  uint8  I2C_sla;           
volatile  uint8  I2C_suba;          
volatile  uint8  *I2C_buf;          
volatile  uint8  I2C_num;           
volatile  uint8  I2C_end;           
volatile  uint8  I2C_suba_en;       






 
void  __irq  IRQ_I2C(void)
{  uint8  sta;

   sta = I2STAT;                    
   switch(sta)
   {  case  0x08:
            if(1==I2C_suba_en) I2DAT = I2C_sla&0xFE;    
              else I2DAT = I2C_sla;                     
            I2CONCLR = 0x28;        
            break;
            
      case  0x10:
            I2DAT = I2C_sla;        
            I2CONCLR = 0x28;        
            break;
   
      case  0x18:
            if(0==I2C_suba_en)      
            {  if(I2C_num>0)
               {  I2DAT = *I2C_buf++;
                  I2CONCLR = 0x28; 
                  I2C_num--;
               }
               else
               {  I2CONSET = 0x10;  
                  I2CONCLR = 0x28;
                  I2C_end = 1;      
               }
               break;
            }
            if(1==I2C_suba_en)      
            {  I2DAT = I2C_suba;
               I2CONCLR = 0x28;
            }
            if(2==I2C_suba_en)
            {  I2DAT = I2C_suba;
               I2CONCLR = 0x28;
               I2C_suba_en = 0;     
            }
            break;
            
      case  0x28: 
            if(0==I2C_suba_en)      
            {  if(I2C_num>0)
               {  I2DAT = *I2C_buf++;
                  I2CONCLR = 0x28; 
                  I2C_num--;
               }
               else
               {  I2CONSET = 0x10;  
                  I2CONCLR = 0x28;
                  I2C_end = 1; 
               }
               break;
            }
            if(1==I2C_suba_en)      
            {  I2CONSET = 0x20;
               I2CONCLR = 0x08;
               I2C_suba_en = 0;     
            }
            break;
   
   
      case  0x20:
      case  0x30:
      case  0x38:
            I2CONCLR = 0x28;        
            I2C_end = 0xFF;         
            break;
   
   
      case  0x40:
            if(1==I2C_num)          
            {  I2CONCLR = 0x2C;     
            }
            else                    
            {  I2CONSET = 0x04;     
               I2CONCLR = 0x28;
            }
            break;
            
      case  0x50:
            *I2C_buf++ = I2DAT;     
            I2C_num--;
            if(1==I2C_num)
            {  I2CONCLR = 0x2C;     
            }
            else
            {  I2CONSET = 0x04;     
               I2CONCLR = 0x28;
            }
            break;
      
      case  0x58:
            *I2C_buf++ = I2DAT;     
            I2CONSET = 0x10;        
            I2CONCLR = 0x28;
            I2C_end = 1; 
            break;
      
      case  0x48:
            I2CONCLR = 0x28;        
            I2C_end = 0xFF; 
            break;
            
      default: 
            break;
   }
   

   VICVectAddr = 0x00;              
}

         
   







 
uint8  ISendStr( uint8 suba, uint8 *s, uint8 no)
{   
   I2C_sla = 0xa0;
   I2C_suba = suba;
   I2C_buf = s;
   I2C_num = no;
   I2C_suba_en = 2;
   I2C_end = 0;
   
   I2CONCLR = 0x2C;
   I2CONSET = 0x60;             
   
   while(0==I2C_end);
   if(1==I2C_end) return(1);
     else return(0);
}











 
uint8  IRcvStr(uint8 suba,uint8 *s,uint8 no)
{  if(0==no) return(0);
   
    
   I2C_sla = 0xa1;
   I2C_suba = suba;
   I2C_buf = s;
   I2C_num = no;
   I2C_suba_en = 1;
   I2C_end = 0;
   
   I2CONCLR = 0x2C;
   I2CONSET = 0x60;             
   
   while(0==I2C_end);
   if(1==I2C_end) return(1);
     else return(0);
}

   







 
void ee_write (uint8 address,uint16 value)
   {
   uint8 i;
   uint8 data[2];
   uint8 data_buf[2];
   data[0]=value;          
   data[1]=value>>8;       
   for(i=0; i<2; i++) data_buf[i] =data[i] ;
   ISendStr( address, data_buf, 2);		
   }
   








 
uint16  ee_read(uint8 address)
   {
    uint8 i;
    uint8 read_buf[2];   
    uint16 read_value;
   for(i=0; i<2; i++) read_buf[i] = 0;
   IRcvStr( address, read_buf, 2);		
   read_value=(read_buf[1]<<8)|read_buf[0];
   
   return(read_value);
   } 
   
   
    uint8 read_buf1[2];
     uint16 k;
 void i2ctest(void)
    {
     ee_write(0x09,0x838E);
     
     DelayNS(1);
     
     k= 0x838e;
     
           read_buf1[0]=k;
           read_buf1[1]=k>>8;
          
           while(1)
           {
            UART0_SendByte(read_buf1[0]);
            UART0_SendByte(read_buf1[1]);
            DelayNS(200);
           }   				
}

⌨️ 快捷键说明

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