微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > ARM技术讨论 > 关于ATmega16读写程序

关于ATmega16读写程序

时间:10-02 整理:3721RD 点击:

#include <iom16v.h>
#include "macros.h"
//-----------------------------------------------
#define uchar unsigned char
#define uint unsigned int
#define rd_device_add 0xa1
#define wr_device_add 0xa0
//======================================
//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()      (WTCR=(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);}
//=====================================
delay_us(void)
{
uchar j;
  for(j=200;j>0;j--)
  {
  ;
  }
}
/********************端口初始化******************/
/*void IIC_Init()
{
TWBR=12;
TWSR=1;
TWCR=0x44;
}*/
/** I2C总线读一个字节,如果读失败返回0***/
uchar i2c_Read(uchar RomAddress)
{
   uchar temp;
   Start();//I2C启动
   Wait();
   if(TestAck()!=START) return 0;//ACK
   
   Write8Bit(wr_device_add);//写I2C从器件地址和写方式
   Wait();
   if(TestAck()!=MT_SLA_ACK) return 0;//ACK

   Write8Bit(RomAddress);//写24C64的ROM地址
   Wait();
   if(TestAck()!=MT_DATA_ACK) return 0;
   Start();//I2C重新启动
   Wait();
   if(TestAck()!=RE_START)  return 0;
   Write8Bit(rd_device_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总线写一个字节,返回0:写成功。返回非0:写失败**
*/
uchar i2c_Write(uchar RomAddress,uchar Wdata)
{
  Start();//I2C启动
  Wait();
  if(TestAck()!=START) return 1;//ACK
  Write8Bit(wr_device_add);//写I2C从器件地址和写方式
  Wait();
  if(TestAck()!=MT_SLA_ACK) return 1;//ACK
  Write8Bit(RomAddress);//写24C64的ROM地址
  Wait();
  if(TestAck()!=MT_DATA_ACK) return 1;//ACK
  Write8Bit(Wdata);//写数据到24C64的ROM
  Wait();
  if(TestAck()!=MT_DATA_ACK) return 1;//ACK
  Stop();//I2C停止
  delay_us();//延时等EEPROM写完
  return 0;
}
//******************************************
void main(void)    // 定义主函数
  {
        uchar num;
        DDRC|=1<<4;//定义pc4~pc7口为输出口
        DDRC|=1<<5;
        DDRC|=1<<6;
        DDRC|=1<<7;
        i2c_Write(1,0x6f);          //将数写入AT24C64的0号单元中
       delay(200);
        num=i2c_Read(1);           //从AT24C64的0号单元中读出该数
       delay(200);
  if(num==0x6f)
  {
  PORTC&=~(1<<4);
  PORTC|=1<<5;  
  PORTC|=1<<6;
  PORTC&=~(1<<7);
  }
else
{
  PORTC|=1<<4;
  PORTC|=1<<5;
  PORTC|=1<<6;
  PORTC|=1<<7;
  }
      
}
以上是我写的关于i2c协议读写程序,这个程序好像不能进行正确读写,求高手指教问题出在哪里了,我编程的软件是ICCV7 for AVR



WO KANBUCHU

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top