as280711261 发表于 2013-4-13 08:07:00

ATMEGA64的TWI读写问题

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

unsigned charWAITCOUNT=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;
}

as280711261 发表于 2013-4-15 21:33:04

已经解决,原来论坛里早就有这方面的讨论了,而且有很多,看过以后成功解决了。
页: [1]
查看完整版本: ATMEGA64的TWI读写问题