搜索
bottom↓
回复: 1

ATMEGA64的TWI读写问题

[复制链接]

出0入0汤圆

发表于 2013-4-13 08:07:00 | 显示全部楼层 |阅读模式
这个TWI程序在ATMEGA16上调试成功,但是在ATMEGA64上这个程序就调试不通,请问mega64上需要TWI端口特殊操作吗?
#include<iom64v.h>
#include<macros.h>

#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
                                    
#define RD_DEVICE_ADDR  0xA7           //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改
#define WD_DEVICE_ADDR  0xA6           //ALT  ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A

unsigned char  WAITCOUNT=60;

//常用TWI操作(主模式写和读)
#define Start()                        (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))                //启动I2C
#define Stop()                        (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))                //停止I2C
#define Wait()                        {while(!(TWCR&(1<<TWINT)));}                                //等待中断发生
#define TestAck()                                (TWSR&0xf8)                                        //观察返回状态
#define SetAck                        (TWCR|=(1<<TWEA))                                //做出ACK应答
#define SetNoAck                                (TWCR&=~(1<<TWEA))                                //做出Not Ack应答
#define Twi()                        (TWCR=(1<<TWINT)|(1<<TWEN))                        //启动I2C
#define Write8Bit(x)                                        {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);}                //写数据到TWDR



unsigned char I2C_Write(unsigned char RegAddress,unsigned char Wdata);
unsigned char I2C_Read(unsigned RegAddress);


void findquestionG(void)//标记找问题
{
    PORTA&=~BIT(0);
        delay_nms(100);
    PORTA|=BIT(0);
        delay_nms(100);
}

void findquestionB(void)//标记找问题
{
    PORTB&=~BIT(6);
        delay_nms(100);
    PORTB|=BIT(6);
        delay_nms(100);
}


/*********************************************
I2C总线写一个字节
返回0:写成功
返回1:写失败
**********************************************/
unsigned char I2C_Write(unsigned char RegAddress,unsigned char Wdata)
{
          Start();                                                //I2C启动
          Wait();
          if(TestAck()!=START)
          {
            findquestionG();
                return 1;                                        //ACK
          }       
//          delay_nus(4);
          Write8Bit(WD_DEVICE_ADDR);        //写I2C从器件地址和写方式
          Wait();
          delay_nus(4);
          if(TestAck()!=MT_SLA_ACK)
          {
            findquestionB();
                return 1;                                        //ACK
          }       
          
          Write8Bit(RegAddress);                //写器件相应寄存器地址
          Wait();
          if(TestAck()!=MT_DATA_ACK)
                  return 1;                                    //ACK
          
          Write8Bit(Wdata);                                 //写数据到器件相应寄存器
          Wait();
          if(TestAck()!=MT_DATA_ACK)
                  return 1;                                    //ACK         
          Stop();                                                  //I2C停止
          delay_nus(4);                                    //延时  
          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从器件地址和写方式
           Wait();
           if (TestAck()!=MT_SLA_ACK)
                     return 1;                                    //ACK
          
           Write8Bit(RegAddress);                //写器件相应寄存器地址
           Wait();
           if (TestAck()!=MT_DATA_ACK)
                     return 1;
          
           Start();                                                      //I2C重新启动
           Wait();
           if (TestAck()!=RE_START)  
                     return 1;
          
           Write8Bit(RD_DEVICE_ADDR);        //写I2C从器件地址和读方式
           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停止
           return temp;
}

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2013-4-15 21:33:04 | 显示全部楼层
已经解决,原来论坛里早就有这方面的讨论了,而且有很多,看过以后成功解决了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-24 03:25

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

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