搜索
bottom↓
回复: 4

atmega128 TWI 读写AT24C16 出错,读24C02没问题

[复制链接]

出0入0汤圆

发表于 2014-6-28 10:39:35 | 显示全部楼层 |阅读模式
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_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_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

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2014-6-28 10:52:11 | 显示全部楼层
大神帮帮忙啊

出0入0汤圆

发表于 2014-6-28 12:07:06 | 显示全部楼层
是页的问题

出0入0汤圆

发表于 2014-6-28 12:08:15 | 显示全部楼层
你好好看一下手册(AT240C16)你就明白~~
器件地址那里!

出0入0汤圆

 楼主| 发表于 2014-6-28 18:03:56 | 显示全部楼层
解决了 在
value=IIC_Write_24C16(0x06,0x43);
putchar0(value);
_delay_ms()10;//加了延时就好了
value=IIC_Read_24C16(0x43);
谢谢楼上几位
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 21:33

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表