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

📄 i2c.c

📁 单相复费率MSP430硬件时钟参考代码,MSP413设计方案
💻 C
字号:
#include "msp430x41x.h"
#include "general.h"

unsigned char I2CTemp0;
unsigned short I2CTemp1;
unsigned char ErrIndication=0;

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

void I2CStart(void)
{
    _DINT();

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

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

    _EINT();
    ClrWDT();
}

void I2CAck(void)
{
    I2C_SDA_OUT&=~(I2C_SDA);
    I2CSCLHighToLow();
}

void I2CNoAck(void)
{
    I2C_SDA_OUT|=I2C_SDA;
    I2CSCLHighToLow();
}

unsigned char I2CReadByte(void)
{
    unsigned char temp=0,BitCounter=8;

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

void I2CSendByte(unsigned char data)
{
    unsigned char BitCounter=8;
    unsigned char wait=0;

    do
    {
        if(data&0x80) I2C_SDA_OUT|=I2C_SDA;
        else I2C_SDA_OUT&=~(I2C_SDA);
        I2CSCLHighToLow();
        data<<=1;
    }while(--BitCounter);

    // 将WAITACK放入SENDBYTE又省空间又有效率
    I2C_SDA_DIR&=~(I2C_SDA);
    I2C_SCL_OUT|=I2C_SCL;
    while(I2C_SDA_IN&I2C_SDA) // 循环等待ACK信号255次循环
    {
        wait++;
        if(!wait)
        {
            ErrIndication=1;
            break;
        }
    };
    I2C_SCL_OUT&=~(I2C_SCL);
    I2C_SDA_DIR|=I2C_SDA;
}

void E2promBegin()
{
    for(;I2CTemp1>=0x100;I2CTemp1-=0x100)
    {
        I2CTemp0+=2;
    }
    I2CStart();
    I2CSendByte(I2CTemp0);
    I2CSendByte(I2CTemp1);
}

void E2promRead(unsigned short addr,unsigned char *data,unsigned char len)
{
    unsigned char i,j=0;

ReadRestar:
    ErrIndication=0;
    I2CTemp0=0xA0;
    I2CTemp1=addr;
    for(i=0;i<len;i++,I2CTemp1++)
    {
        E2promBegin();
        I2CStart();
        I2CSendByte(I2CTemp0+1);
        data[i]=I2CReadByte();
        I2CNoAck();
        I2CStop();
    }
    if(ErrIndication)
    {
        j++;
        if(j<3) goto ReadRestar;
    }
}

void E2promWrite(unsigned short addr,unsigned char *data,unsigned char len)
{
    unsigned char i,j=0;

#ifdef TEST_COURSE
    LcdLightOn(1);
#endif
WriteRestar:
    ErrIndication=0;
    I2CTemp0=0xA0;
    I2CTemp1=addr;
    E2PROM_WP_OUT&=~(E2PROM_WP);
    for(i=0;i<len;i++,I2CTemp1++)
    {
        E2promBegin();
        I2CSendByte(data[i]);
        I2CStop();
        Delay(800);
    }
    E2PROM_WP_OUT|=E2PROM_WP;
    if(ErrIndication)
    {
        j++;
        if(j<3) goto WriteRestar;
    }
}

#ifdef _HARDWARE_RTC
void RealtimeOper(unsigned char addr,unsigned char *data,unsigned char len)
{
    unsigned char i,j=0,mode;

OperRestar:
    ErrIndication=0;
    mode=addr&0x01;
    I2CTemp0=addr&0xFE;
    I2CStart();
    I2CSendByte(0x64);
    I2CSendByte(I2CTemp0);
    for(i=0;i<len;i++)
    {
        if(mode)
        {
            data[i]=I2CReadByte();
            if(i==len-1) I2CNoAck();
            else I2CAck();
        }
        else
        {
            I2CSendByte(data[i]);
        }
    }
    I2CStop();
    if(ErrIndication)
    {
        j++;
        if(j<3) goto OperRestar;
    }
}
#endif

⌨️ 快捷键说明

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