//TWI状态定义
//MT 主方式传输 MR 主方式接收
#define START 0x08
#define RE_START 0x10
#define MT_SLA_ACK 0x18
#define MT_SLA_NOACK 0x20
#define MT_DATA_ACK 0x28
#define MT_DATA_NOACK 0x30
#define MR_SLA_ACK 0x40
#define MR_SLA_NOACK 0x48
#define MR_DATA_ACK 0x50
#define MR_DATA_NOACK 0x58
//常用TWI操作(主模式写和主模式读)
#define Start() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))
#define Stop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))
#define Wait() {while(!(TWCR&(1<<TWINT)));}
#define TestAck() (TWSR&0xf8)
#define SetAck() (TWCR|=(1<<TWEA))
#define SetNoAck() (TWCR&=~(1<<TWEA))
#define Twi() (TWCR=(1<<TWINT)|(1<<TWEN))
#define Write8Bit(x) {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);}
#define rd_24c08_add 0xa1
#define wr_24c08_add 0xa0
uchar bai_wei,shi_wei,ge_wei,read_value;
void ERROR()
{
read_value=TWSR&0XF8;
bai_wei=read_value/100;
shi_wei=read_value%100/10;
ge_wei=read_value%10;
LCD_write_com(0x80);
LCD_write_data('E');
LCD_write_data('r');
LCD_write_data('r');
LCD_write_data('o');
LCD_write_data('r');
LCD_write_data(bai_wei+0x30);
LCD_write_data(shi_wei+0x30);
LCD_write_data(ge_wei+0x30);
while(1);
}
/************************************************/
uchar i2c_Write_One_24c08(uchar Wdata,uchar RomAddress)
{
Start();//I2C启动
Wait();
if(TestAck()!=START) ERROR();//ACK
Write8Bit(wr_24c08_add);//写I2C从器件地址和写方式
Wait();
if(TestAck()!=MT_SLA_ACK) ERROR();//ACK
Write8Bit(RomAddress);//写24C08的ROM地址
Wait();
if(TestAck()!=MT_DATA_ACK) ERROR();//ACK
Write8Bit(Wdata);//写数据到24C32的ROM
Wait();
if(TestAck()!=MT_DATA_ACK) ERROR();//ACK
Stop();//I2C停止
_delay_ms(10);//延时等EEPROM写完
return 0;
}
/************************************************/
uchar i2c_Read_One_24c08(uchar RomAddress)
{
uchar temp;
Start();//I2C启动
Wait();
if (TestAck()!=START) return 0;//ACK
Write8Bit(wr_24c08_add);//写I2C从器件地址和写方式
Wait();
if(TestAck()!=MT_SLA_ACK) return 0;//ACK
Write8Bit(RomAddress);//写24c64的ROM高地址
Wait();
if(TestAck()!=MT_DATA_ACK) return 0;//ACK
Start();//I2C重新启动
Wait();
if (TestAck()!=RE_START) return 0;
Write8Bit(rd_24c08_add);//写I2C从器件地址和读方式
Wait();
if(TestAck()!=MR_SLA_ACK) return 0;//ACK
Twi();//启动主I2C读方式
Wait();
if(TestAck()!=MR_DATA_NOACK) return 0;//ACK
temp=TWDR;//读取I2C接收数据
Stop();//I2C停止 释放总线
return temp;
}
/************************************************
*函数功能: I2C初始化
/************************************************/
void i2c_init(void)
{
TWBR=0X20;
TWSR=00;
TWCR=0X04;
}
void port_init(void)
{
PORTD = 0xFF;
DDRD = 0xFF;
}
int main(void)
{
uchar i;
port_init();
LCD_PORTinit(); //系统初始化
_delay_ms(100); //延时100ms
LCD_init(); //液晶参数初始化
LCD_clear();
i2c_init(); //IIC初始化
_delay_ms(5);
i2c_Write_One_24c08(5,0x03);
_delay_ms(10); //一定要延时
DDRD = 0x00;
i = i2c_Read_One_24c08(0x03);/**/
while(1)
{
LCD_write_char(1,1,i+0x30);
}
}
|