打印
[AVR单片机]

MEGA128 TWI往24c08中写不进去数据!为什么?

[复制链接]
2102|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
笑飞侠LFB|  楼主 | 2013-7-13 11:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


//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);
         }

}




相关帖子

沙发
qin552011373| | 2013-7-13 23:53 | 只看该作者
你是怎么判断的写不进去?

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
笑飞侠LFB + 1 赞一个!
板凳
airwill| | 2013-7-15 18:07 | 只看该作者
细细调试吧, 肯定能写进去的.
一大堆代码让大家猜, 还不如你拿这仿真器看呢

使用特权

评论回复
地板
笑飞侠LFB|  楼主 | 2013-7-21 00:06 | 只看该作者
呵呵!谢谢大家热心!  原来是我接数据线和时钟线接错啦!

使用特权

评论回复
5
qin552011373| | 2013-7-21 09:19 | 只看该作者
笑飞侠LFB 发表于 2013-7-21 00:06
呵呵!谢谢大家热心!  原来是我接数据线和时钟线接错啦!

你是不是唔满意贴结贴了?看来坛子里好多新人不会怎么接贴啊

使用特权

评论回复
6
笑飞侠LFB|  楼主 | 2013-7-21 12:27 | 只看该作者
qin552011373 发表于 2013-7-21 09:19
你是不是唔满意贴结贴了?看来坛子里好多新人不会怎么接贴啊

呵呵!我新手!不知道 怎么结贴! 还请指教!

使用特权

评论回复
7
qin552011373| | 2013-7-21 13:47 | 只看该作者
笑飞侠LFB 发表于 2013-7-21 12:27
呵呵!我新手!不知道 怎么结贴! 还请指教!

等会整理一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

7

帖子

0

粉丝