飞鱼爱上鸟 发表于 2014-6-28 10:39:35

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

飞鱼爱上鸟 发表于 2014-6-28 10:52:11

大神帮帮忙啊

tanguicaicai 发表于 2014-6-28 12:07:06

是页的问题

tanguicaicai 发表于 2014-6-28 12:08:15

你好好看一下手册(AT240C16)你就明白~~
器件地址那里!

飞鱼爱上鸟 发表于 2014-6-28 18:03:56

解决了 在
value=IIC_Write_24C16(0x06,0x43);
putchar0(value);
_delay_ms()10;//加了延时就好了
value=IIC_Read_24C16(0x43);
谢谢楼上几位{:handshake:}
页: [1]
查看完整版本: atmega128 TWI 读写AT24C16 出错,读24C02没问题