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

📄 iic.c

📁 在NIOS中利用C语言模拟I2C总线时序
💻 C
字号:
#include"string.h"
#include <stdio.h>
#include <unistd.h>
#include "altera_avalon_pio_regs.h"
#include "system.h" 
#include "time.h" 
#define DELAY_TIME 10000 
#define Set_SDA  IOWR_ALTERA_AVALON_PIO_DATA(SDA_BASE, 0x1)
#define Clr_SDA  IOWR_ALTERA_AVALON_PIO_DATA(SDA_BASE, 0x0)
#define Set_SCL  IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0x1)
#define Clr_SCL  IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0x0)

void I2C_Start(void)
{ /*
      SDA -------_________
      SCL ------------____
*/
  //????
  IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, 0x1);
  IOWR_ALTERA_AVALON_PIO_DIRECTION(SCL_BASE, 0x1);  
  //SDA = 1
  //SCL = 1
  Set_SDA;
  Set_SCL;        
  usleep(DELAY_TIME);  
  //SDA = 0
  //SCL = 1
  Clr_SDA;       
  usleep(DELAY_TIME);  
  //SDA = 0
  //SCL = 0 
  Clr_SCL;        
  usleep(DELAY_TIME);
}

void I2C_Stop(void)
{ /*
      SDA _________--------
      SCL ____-------------
*/
  //????  
  IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, 0x1);
  IOWR_ALTERA_AVALON_PIO_DIRECTION(SCL_BASE, 0x1);      
  //SDA = 0 
  //SCL = 0 
  Clr_SDA;  
  Clr_SCL;     
  usleep(DELAY_TIME);  
  //SDA = 0
  //SCL = 1
  Clr_SDA;
  Set_SCL;           
  usleep(DELAY_TIME);   
  //SDA = 1
  //SCL = 1
  Set_SDA;
  usleep(DELAY_TIME); 
}
 
void I2C_Ack(void)//?????
{  IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, 0x1);
  IOWR_ALTERA_AVALON_PIO_DIRECTION(SCL_BASE, 0x1);
  Clr_SDA;  
  usleep(DELAY_TIME);
  Set_SCL;
  usleep(DELAY_TIME);
  //while(IORD_ALTERA_AVALON_PIO_DATA(SDA_BASE)){;};
  Clr_SCL;
  usleep(DELAY_TIME);
}
void Check_Ack(void)
{ char a=1;
  // SDA = "Z"
  // SCL = 0
  IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, 0x0);
  //IOWR_ALTERA_AVALON_PIO_DIRECTION(SCL_BASE, 0x1);  
  Clr_SCL;  
  usleep(DELAY_TIME);   
  // SCL = 1
  Set_SCL;
  usleep(DELAY_TIME);
  while(a)
   {
     a=IORD_ALTERA_AVALON_PIO_DATA(SDA_BASE);
     usleep(DELAY_TIME);
     printf("waiting ACK a is %d\n",a);
   }  
  usleep(DELAY_TIME);//
  printf("detected ACK\n");   
  Clr_SCL;  
  usleep(DELAY_TIME);  
}

void I2C_Nack(void)//?????
{ IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, 0x1);
  IOWR_ALTERA_AVALON_PIO_DIRECTION(SCL_BASE, 0x1); 
  Set_SDA;
  usleep(DELAY_TIME); 
  Set_SCL;
  usleep(DELAY_TIME); 
  Clr_SCL;
  usleep(DELAY_TIME); 
}

void I2C_Send_Byte(char d)
{   
unsigned char i = 8; 
IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, 0x1);
IOWR_ALTERA_AVALON_PIO_DIRECTION(SCL_BASE, 0x1);
usleep(DELAY_TIME); 

/*
                    MSB
    SDA  ______-------------__________
  
    SCL  _________-------_____________
 
 */
 
   Clr_SDA;
   Clr_SCL;
   usleep(DELAY_TIME);
 
while( i-- )
  {
 
    if (d&0x80) 
        Set_SDA;   
    else 
        Clr_SDA;    
    usleep(DELAY_TIME);     
    
       Set_SCL;   
    usleep(DELAY_TIME);     
       Clr_SCL;   
    usleep(DELAY_TIME); 
    
    //SCL = 0
    //SDA = 0
      Clr_SDA;
      Clr_SCL;
    usleep(DELAY_TIME); 
    
    d = d << 1;
   }
usleep(DELAY_TIME);

}


unsigned char I2C_Receive_Byte(void)
{
unsigned char rn = 8, data=0,rr=0x80;
IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, 0x0);
IOWR_ALTERA_AVALON_PIO_DIRECTION(SCL_BASE, 0x1);
usleep(DELAY_TIME);
for(;rn!=0;rn--)
{
Set_SCL;
usleep(DELAY_TIME);
if (IORD_ALTERA_AVALON_PIO_DATA(SDA_BASE)) 
data|=rr;
//printf("IORD_ALTERA_AVALON_PIO_DATA",IORD_ALTERA_AVALON_PIO_DATA(SDA_BASE));
else
data&=~rr;
rr>>=1;
 Clr_SCL;
usleep(DELAY_TIME);
}
//printf("I2C_Receive_Byte is %x\n",data);
return data;
}

void AT24C16_W(unsigned char address, unsigned char ddata )
{
I2C_Start();
I2C_Send_Byte(0xa0);
Check_Ack();
I2C_Send_Byte(address);
Check_Ack();
I2C_Send_Byte(ddata);
Check_Ack();
//printf("write data\n");
I2C_Stop();
usleep(50000);
}

unsigned char AT24C16_R(unsigned char address)
{
unsigned char rdata;

I2C_Start();
I2C_Send_Byte( 0xa0 );
Check_Ack();
I2C_Send_Byte( address );
Check_Ack();
I2C_Start();
I2C_Send_Byte( 0xa1 );
Check_Ack();
rdata=I2C_Receive_Byte();
I2C_Nack();
I2C_Stop();
return rdata;
}
int main()
{volatile char data;  
 AT24C16_W(0x02,0x88);
 AT24C16_W(0x05,0x9b);
 usleep(100000);
 data=AT24C16_R(0x02);
 printf("%x\n",data);
 data=AT24C16_R(0x05);
 printf("%x\n",data);
 
 
}
 

⌨️ 快捷键说明

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