atmega128 TWI 读写AT24C16 出错,读24C02没问题
atmega128 TWI 读写AT24C16 出错,读24C02没问题,第一次写的时候没问题,读出错,然后写也出错了。连续写没问题,一读就出问题/** _24C16_IIC.c
*
* Created: 2014/6/27 10:33:44
*Author: HP
*/
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include <string.h>
#include <stdio.h>
#include <avr/interrupt.h>
#include "twi.h"
#include "uart.h"
int main(void)
{
unsigned char value;
twi_init();
usartinit();
_delay_ms(1000);
while(1)
{
putchar0(0xaa);
//putchar0(0x55);
value=IIC_Write_24C16(0x06,0x43);
putchar0(value);
value=IIC_Read_24C16(0x43);
putchar0(value);
_delay_ms(200);//TODO:: Please write your application code
}
}
////////////////TWI.C文件////////////////////////////////////////////
#include "twi.h"
void twi_init()//初始化IIC
{
TWBR=0x20;
TWCR=0x04;
TWSR=0x00;
}
////////////////////////////////////////////////////////////////////////////
unsigned char IIC_Write_24C16(unsigned char wdata , unsigned char addr)
{
Start();
Wait();
if(TestAck()!=START)
return 5;
Write8bit(WD_24C16_ADDR);
Wait();
if(TestAck()!=MT_SLA_ACK)
return 2;
Write8bit(addr);
Wait();
if(TestAck()!=MT_DATA_ACK)
return 3;
Write8bit(wdata);
Wait();
if(TestAck()!=MT_DATA_ACK)
return 4;
Stop();
return 0;
}
/////////////////////////////////////////////////////////////
unsigned char IIC_Read_24C16(unsigned char addr)
{
unsigned char value;
Start();
Wait();
if(TestAck()!=START)
return 4;
Write8bit(WD_24C16_ADDR);
Wait();
if(TestAck()!=MT_SLA_ACK)
return 3;
Write8bit(addr);
Wait();
if(TestAck()!=MT_DATA_ACK)
return 2;
Start();
Wait();
if(TestAck()!=RE_START)
return 5;
Write8bit(RD_24C16_ADDR);
Wait();
if(TestAck()!=MR_SLA_ACK)
return 6;
Twi();
Wait();
if(TestAck()!=MR_DATA_NOACK)
return 7;
value=TWDR;
Stop();
return (value);
}
//////////////TWI.H文件//////////////////////////////
#ifndef __TWI_H__
#define __TWI_H__
#include <avr/io.h>
#include <util/delay.h>
//MT 主方式传输MR主方式接收
#define START 0X08
#define RE_START0X10
#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_24C16_ADDR 0XA1//读器件地址
#define WD_24C16_ADDR 0XA0//写器件地址
#define Start() (TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)) //启动IIC
#define Stop() (TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO)) //停止IIC
#define Wait() {while (!(TWCR & (1<<TWINT)));} //等待中断发生
#define TestAck() (TWSR&0Xf8) //观察返回状态
#define SetAck() (TWCR|=(1<<TEEA)) //ack应答
#define SetNoAck() (TWCR&=~(1<<TEEA)) //noack应答
#define Twi() (TWCR=(1<<TWINT)|(1<<TWEN)) //启动IIC
#define Write8bit(x){TWDR = x;TWCR = (1<<TWINT)|(1<<TWEN);} //写数据
void twi_init();
unsigned char IIC_Write_24C16(unsigned char wdata , unsigned char addr);
unsigned char IIC_Read_24C16(unsigned char addr);
#endif
大神帮帮忙啊 是页的问题
你好好看一下手册(AT240C16)你就明白~~
器件地址那里! 解决了 在
value=IIC_Write_24C16(0x06,0x43);
putchar0(value);
_delay_ms()10;//加了延时就好了
value=IIC_Read_24C16(0x43);
谢谢楼上几位{:handshake:}
页:
[1]