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

📄 i2c.c

📁 单相 CPU卡表复费率电能表,内部有提供I2C驱动,CPU卡驱动,NEC单片机0513等
💻 C
字号:
#include "includes.h"

unsigned char ErrIndication=0;

void AptoticE2promStart(void)
{
    I2C_SCL_OUT &=~ I2C_SCL;
    I2C_SDA_OUT |= I2C_SDA;
    I2C_SCL_OUT |= I2C_SCL;
    I2C_SDA_OUT &=~ I2C_SDA;
    I2C_SCL_OUT &=~ I2C_SCL;
   
}

void AptoticE2promStop(void)
{
    I2C_SCL_OUT &=~ I2C_SCL;
    I2C_SDA_OUT &=~ I2C_SDA;
    I2C_SCL_OUT |= I2C_SCL;
    I2C_SDA_OUT |= I2C_SDA;
    I2C_SCL_OUT &=~ I2C_SCL;
}

void AptoticE2promSck(void)
{
    I2C_SCL_OUT |= I2C_SCL;
    NOP();
    NOP();
    I2C_SCL_OUT &=~ I2C_SCL;
    NOP();
    NOP();	
}

void AptoticE2promNoAck(void)
{  
    I2C_SCL_OUT &=~ I2C_SCL;
    I2C_SDA_OUT |= I2C_SDA;
    I2C_SCL_OUT |= I2C_SCL;    
    I2C_SCL_OUT &=~ I2C_SCL;
}

void AptoticE2promAck(void)
{
    I2C_SCL_OUT &=~ I2C_SCL;
    I2C_SDA_OUT &=~ I2C_SDA;
    I2C_SCL_OUT |= I2C_SCL;    
    I2C_SCL_OUT &=~ I2C_SCL;
}

unsigned char AptoticE2promTestAck(void)
{
    unsigned short i = 0;
    unsigned char flag = OK;
    
    I2C_SCL_OUT &=~ I2C_SCL;
    I2C_SDA_OUT &=~ I2C_SDA;

    I2C_SDA_DIR |= I2C_SDA;
    I2C_SCL_OUT |= I2C_SCL;

    while(I2C_SDA_IN & I2C_SDA)
    {
        if( i++ > 2000 )
        {
            flag = ERROR;
            break;			
        }
    }
    
    I2C_SDA_DIR &=~ I2C_SDA;
    I2C_SCL_OUT &=~ I2C_SCL;

    return flag;
}

unsigned char AptoticE2promReadByte(void)
{
    unsigned char rdbyte = 0, BitCounter = 8;

    I2C_SDA_DIR |= I2C_SDA;
    do{
        rdbyte <<= 1;
        I2C_SCL_OUT |= I2C_SCL;
        if( I2C_SDA_IN & I2C_SDA ) rdbyte++;
        I2C_SCL_OUT &=~ I2C_SCL;
    }while( --BitCounter );
    I2C_SDA_DIR &=~ I2C_SDA;
    return( rdbyte );
}


void AptoticE2promWriteByte(unsigned char wrbyte)
{
    unsigned short wait = 0;
    unsigned char BitCounter = 8;
	
    do
    {
        if(wrbyte&0x80) I2C_SDA_OUT |= I2C_SDA;
        else I2C_SDA_OUT &=~ I2C_SDA;
        AptoticE2promSck();
        wrbyte<<=1;
    }while(--BitCounter);
	
    I2C_SDA_DIR |= I2C_SDA;
    I2C_SCL_OUT |= I2C_SCL;

    clr_wdt();
    while( I2C_SDA_IN & I2C_SDA )
    {
        if( wait++ >= 1000 )
        {
            ErrIndication=1;
            break;			
        }         
    }
	
    I2C_SDA_DIR &=~ I2C_SDA;
    I2C_SCL_OUT &=~ I2C_SCL;
}

void E2promRead(unsigned short addr,unsigned char *data,unsigned char len)
{
    unsigned char  temph,templ;
    unsigned char  i,j=0;
	
    temph = (unsigned char)(addr/256);
    templ = (unsigned char)(addr%256);    

ReadRestart:	
    ErrIndication = 0;
    AptoticE2promStart();
    AptoticE2promWriteByte(0xA0);
    AptoticE2promWriteByte(temph);
    AptoticE2promWriteByte(templ);
    AptoticE2promStart();
    AptoticE2promWriteByte(0xA1);
    for( i = 0; i < len-1; i++ )
    {
        *(data+i) = AptoticE2promReadByte();
        AptoticE2promAck();
    }    
    *(data+len-1)=AptoticE2promReadByte();
    AptoticE2promNoAck();
    AptoticE2promStop();
    I2C_SCL_OUT |= I2C_SCL;
    I2C_SDA_OUT |= I2C_SDA;    
    if( ErrIndication )
    {
        j++;
        if( j < 3 ) goto ReadRestart;
    }
}

void E2promWrite(unsigned short addr,unsigned char *data,unsigned char len)
{
    unsigned char temph,templ;
    unsigned char i, j = 0;
     
    temph = (unsigned char)(addr/256);
    templ = (unsigned char )(addr%256);

WriteRestart:
    ErrIndication = 0;
    AptoticE2promStart();
    AptoticE2promWriteByte(0xA0);
    AptoticE2promWriteByte(temph);
    AptoticE2promWriteByte(templ);
      
    I2C_WP_OUT &=~ (I2C_WP);
    for(i=0;i<len;i++)
    {
        AptoticE2promWriteByte(*(data+i));
    }    
    AptoticE2promStop();
    I2C_WP_OUT |= I2C_WP;
    I2C_SCL_OUT |= I2C_SCL;
    I2C_SDA_OUT |= I2C_SDA;
    if( ErrIndication )
    {
        j++;
        if( j < 3 ) goto WriteRestart;
    }	
}


⌨️ 快捷键说明

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