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

📄 twi_drv.c

📁 Atmel AVR mega324p 的IIC驱动
💻 C
字号:
#ifndef __TWI_DRV_C__
#define __TWI_DRV_C__

#include "NGVDP_VDP.h"


/*
unsigned char EE_STATE;
unsigned char EE_DATA;
unsigned char EE_ADD;
unsigned char DEV_ADD;
*/
uint8 TWI_timer;

void Write8Bit(unsigned char x)
{
    TWDR = x;
    TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWIE);
}


uint8 ic2_write_basic(unsigned char Devaddress, unsigned char RomAddress, unsigned char Wdata)
{
    EE_DATA = Wdata;
    EE_ADD = RomAddress;
    DEV_ADD = Devaddress;
    EE_STATE = 0x0f;
    TWI_timer = Over_Time_TWI;
    //Start();//I2C启动
    TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN) | (1 << TWIE);
    EE_STATE = EE_WRITE;
    Over_Time_IIC_timer = Over_Time_IIC;
    while ((EE_STATE != EE_WRITE_OK) && (EE_STATE != EE_WRITE_FAULT))
    {
        if (Over_Time_IIC_timer == 0)
        {
            TWI_init();
            //LCD_Status = LCD_OFFLINE;
            return 1;
        }
        ;
    }
    if (EE_STATE == EE_WRITE_FAULT)
        //LCD_Status = LCD_OFFLINE;
        return 1;
    if (EE_STATE == EE_WRITE_OK)
        //LCD_Status = LCD_ONLINE;
        return 0;
    Over_Time_IIC_timer = 0xff;
    return 0;
}

unsigned char i2c_Write(unsigned char Devaddress, unsigned char RomAddress, unsigned char Wdata)
{
    uint8 temp = 0;
    while (ic2_write_basic(Devaddress, RomAddress, Wdata))
    {
        temp++;
        if (temp == 10)
        {
            LCD_Status = LCD_OFFLINE;
            return 0;
        }
        __watchdog_reset();
    }
    LCD_Status = LCD_ONLINE;
    return 0;
#if 0
    if (LCD_Status == LCD_OFFLINE)
        return 0;
    EE_DATA = Wdata;
    EE_ADD = RomAddress;
    DEV_ADD = Devaddress;
    EE_STATE = 0x0f;
    TWI_timer = Over_Time_TWI;
    //Start();//I2C启动
    TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN) | (1 << TWIE);
    EE_STATE = EE_WRITE;
    Over_Time_IIC_timer = Over_Time_IIC;
    while ((EE_STATE != EE_WRITE_OK) && (EE_STATE != EE_WRITE_FAULT))
    {
        if (Over_Time_IIC_timer == 0)
        {
            TWI_init();
            LCD_Status = LCD_OFFLINE;
            return 0;
        }
        ;
    }
    if (EE_STATE == EE_WRITE_FAULT)
        LCD_Status = LCD_OFFLINE;
    if (EE_STATE == EE_WRITE_OK)
        LCD_Status = LCD_ONLINE;
    Over_Time_IIC_timer = 0xff;
    return 0;
#endif
}
/*
unsigned char i2c_Read(unsigned char Devaddress, unsigned char RomAddress)
{
    EE_ADD = RomAddress;
    DEV_ADD = Devaddress;
    EE_STATE = EE_READ;
    Start();//I2C启动
    // TWI_timer	= Over_Time_TWI;
    while (EE_STATE != EE_READ_OK)
    {
        ;
    }
    return EE_DATA;
}
*/
void TWI_init()
{
    EE_STATE = EE_READ;
    TWAR = 0x01;
    TWDR = 0xFF;
    TWCR = ((0 << TWINT) | (0 << TWEA) | (0 << TWSTA) | (0 << TWSTO) | (0 << TWWC) | (1 << TWEN) | (0 << TWIE));
    TWSR = 0x00;
    TWBR = 0x0c;     // Bit Rate setting
}

#endif

⌨️ 快捷键说明

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