as280711261 发表于 2013-4-13 22:15:51

马老师,你好,请教一个MEGA64的问题?

使用的是AVR硬件TWI程序,在MEGA16上可以正常读写程序,在SCL时钟相同的条件下,在MEGA64上不能正常读写?
TWI配置:
        //配置I2C
        SFIOR&=~BIT(PUD);
        DDRD&=~(BIT(0)|BIT(1));
        PORTD|=(BIT(0)|BIT(1));
TWI初始化:
void TWI_init(void)

{

    TWCR = 0x00;         //关闭TWI模块
   TWAR = 0x00;         //主机模式,该地址无效
   TWBR = Baud_set;   //25
   TWSR = P_value;       //1分频
   TWCR= 0x04;            //使能TWI,禁止中断
}
TWI读写:
/*********************************************
I2C总线写一个字节
返回0:写成功
返回1:写失败
**********************************************/
unsigned char I2C_Write(unsigned char RegAddress,unsigned char Wdata)
{
          Start();                                                //I2C启动
          Wait();
          if(TestAck()!=START)
          {
             findquestionG();                                                                   //错误指示,发现首次写入START,能都正常收到0X08,;第二次以后,写入start,返回0X08出错,返回1.
             return 1;                                        //ACK
          }       
          Write8Bit(WD_DEVICE_ADDR);        //写I2C从器件地址和写方式
          Twi();
          Wait();
          if(TestAck()!=MT_SLA_ACK)
          {
                findquestionB();                                                                  //错误指示,首次在发完写I2C从器件地址和写方式后,返回0X18出错,返回1。
                return 1;                                        //ACK
          }       
          
          Write8Bit(RegAddress);                //写器件相应寄存器地址
          Twi();
          Wait();
          if(TestAck()!=MT_DATA_ACK)
                  return 1;                                  //ACK
          
          Write8Bit(Wdata);                               //写数据到器件相应寄存器
          Twi();
          Wait();
          if(TestAck()!=MT_DATA_ACK)
                  return 1;                                  //ACK       
          Stop();                                                //I2C停止
          delay_nms(15);                                //延时
          return 0;
}

/*********************************************
I2C总线读一个字节
返回0:读成功
返回1:读失败
**********************************************/

unsigned char I2C_Read(unsigned RegAddress)

{
           unsigned char temp;
           Start();//I2C启动
           Wait();
           if (TestAck()!=START)
                     return 1;                                       //ACK          
          
           Write8Bit(WD_DEVICE_ADDR);        //写I2C从器件地址和写方式          
           Twi();
           Wait();
           if (TestAck()!=MT_SLA_ACK)
                     return 1;                                  //ACK
          
           Write8Bit(RegAddress);                //写器件相应寄存器地址
           Twi();
           Wait();
           if (TestAck()!=MT_DATA_ACK)
                     return 1;
          
           Start();                                                      //I2C重新启动
           Wait();
           if (TestAck()!=RE_START)
                     return 1;
          
           Write8Bit(RD_DEVICE_ADDR);        //写I2C从器件地址和读方式
           Twi();
           Wait();
           if(TestAck()!=MR_SLA_ACK)
                     return 1;                                   //ACK
          
           Twi();                                          //启动主I2C读方式
           Wait();
           if(TestAck()!=MR_DATA_NOACK)
                  return 1;                                        //ACK       
          
           temp=TWDR;//读取I2C接收数据
       Stop();//I2C停止
           delay_nms(1);
           TWCR=0X80;////清除TWINT和禁止TWI(不加上这句程序只能读一次)

   return temp;
}

同样的程序,在16上运行正常,看16和64的数据手册,关于TWI的寄存器配置好像都是一样的,设置的工作时钟也一样的,就是出错,不知道是什么问题,请马老师指教!非常感谢。

as280711261 发表于 2013-4-15 21:31:49

已解决。

machao 发表于 2013-4-16 23:51:21

一般是一个低级的错误,自己也不好意思说。既然到这里问,那么犯了什么错误为什么不告诉大家,让大家知道。只想获取,不想付出的人,在技术上不会有出息的。

as280711261 发表于 2013-4-18 10:23:49

马老师,我是首次接触AVR,所以很多问题不能确定,不能断定是程序上的错误,那也就不能彻底去检查硬件上的问题,所以想在论坛上面请教一下,确认16和64在TWI上没有什么区别,但是一直都没人恢复。我自己在论坛里面逛了很久,才初步确认程序上没问题,最后在硬件上找到是限流电阻使用偏大导致的。这个问题没必要特地来解释清楚吧?你这话说的严重了吧?

guew 发表于 2013-4-18 12:03:50

本帖最后由 guew 于 2013-4-18 12:05 编辑

as280711261 发表于 2013-4-18 10:23 static/image/common/back.gif
马老师,我是首次接触AVR,所以很多问题不能确定,不能断定是程序上的错误,那也就不能彻底去检查硬件上的 ...

大哥误会了,前思科首席技术官蒂姆说过,写技术笔记和文档是最好的学习方法。
如果你不介意,可以把问题刚产生时的现象,中间调试过程的思路,最后问题答案,以及答案所引出的进一步思考用文字记录下来,这个过程本身就是一种很好的自我提高方法。
心情好的话发到论坛,像我这样的后来者也可以学习学习,大伙讨论讨论,那就更好了。
这就是件两全其美的事了。

machao 发表于 2013-4-18 20:31:47

as280711261 发表于 2013-4-18 10:23 static/image/common/back.gif
马老师,我是首次接触AVR,所以很多问题不能确定,不能断定是程序上的错误,那也就不能彻底去检查硬件上的 ...

1 、这里是技术论坛,我不是什么公司的老板,也没有人知道你是谁,所以没有必要担心什么,你自己的技术机密自己不说谁也不知道。
2、实际上很多工程师认为软件很重要,其实硬件是基础,硬件和软件在嵌入式上是不分家的。有许多人碰到问题就到这里问,其实我也不能知道到底是哪里出了问题,没看到东西就知道什么地方错了,那是上帝。
3、之所以让大家把出现问题的地方,和解决问题的方法介绍一下,是为了大家能吸取经验。这也是技术的一部分。
4、实际上,你找的问题可能还不是关键点,能详细说明一下,可能会有朋友会给出更好的建议。你放弃了这个机会。

zhexuejia 发表于 2013-5-26 09:45:27

machao 发表于 2013-4-18 20:31 static/image/common/back.gif
1 、这里是技术论坛,我不是什么公司的老板,也没有人知道你是谁,所以没有必要担心什么,你自己的技术机 ...

马老师说的极是也,有些东西你说出来了,才能更好的进步。
页: [1]
查看完整版本: 马老师,你好,请教一个MEGA64的问题?