关于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