搜索
bottom↓
回复: 6

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

[复制链接]

出0入0汤圆

发表于 2013-4-13 22:15:51 | 显示全部楼层 |阅读模式
使用的是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的寄存器配置好像都是一样的,设置的工作时钟也一样的,就是出错,不知道是什么问题,请马老师指教!非常感谢。

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2013-4-15 21:31:49 | 显示全部楼层
已解决。

出0入0汤圆

发表于 2013-4-16 23:51:21 | 显示全部楼层
一般是一个低级的错误,自己也不好意思说。既然到这里问,那么犯了什么错误为什么不告诉大家,让大家知道。只想获取,不想付出的人,在技术上不会有出息的。

出0入0汤圆

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

出0入0汤圆

发表于 2013-4-18 12:03:50 | 显示全部楼层
本帖最后由 guew 于 2013-4-18 12:05 编辑
as280711261 发表于 2013-4-18 10:23
马老师,我是首次接触AVR,所以很多问题不能确定,不能断定是程序上的错误,那也就不能彻底去检查硬件上的 ...


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

出0入0汤圆

发表于 2013-4-18 20:31:47 | 显示全部楼层
as280711261 发表于 2013-4-18 10:23
马老师,我是首次接触AVR,所以很多问题不能确定,不能断定是程序上的错误,那也就不能彻底去检查硬件上的 ...

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

出0入0汤圆

发表于 2013-5-26 09:45:27 | 显示全部楼层
machao 发表于 2013-4-18 20:31
1 、这里是技术论坛,我不是什么公司的老板,也没有人知道你是谁,所以没有必要担心什么,你自己的技术机 ...

马老师说的极是也,有些东西你说出来了,才能更好的进步。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 22:04

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表