维库电子市场网
登录 免费注册 首页 | 行业黑名单 | 委托交易 | 帮助 | English
 
IC供应
IC求购
非IC供应
非IC求购
电子资讯
技术资料
商人论坛
 
技术文章 PDF资料 IC价格 引脚说明 电路图 IC替换 IC厂商 电子辞典
作者 主题 内容
采购元器件好去处--维库电子市场网推荐
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

哪位大侠可以给我M8与AT24C08的通信代码

作者:wujian 栏目:单片机
哪位大侠可以给我M8与AT24C08的通信代码
我刚学AVR,正在用M8做验证实验,做了几个与AT24C08通信的代码都不成功,哪位高手有这方面的代码,可以贴一个给我参考一下吗?谢谢。

2楼: >>参与讨论
NE5532
先调应答,不要想一口吃胖。
I2C协议必须看,跑不掉。

3楼: >>参与讨论
wujian
谢谢你。我做了一个MEGA824C16通信的程序
可是每次调用C24Start,传送完SLA+W后,TW_STATUS返回0xf8,怎么这么怪?到底是怎么回事啊?

/*
    4M Hz CPU频率
*/
#define F_CPU 4000000UL  // 1 MHz

#include <avr/io.h>
#include <compat/twi.h>
#include <avr/delay.h>


#define BOOL unsigned CHAR

#define TRUE  1
#define FALSE 0
#define EEADDR      0  // 寻址
#define EEWR        0  // 写
#define EERD        1  // 读

#define TwiStart()    TWCR = _BV(TWINT)|_BV(TWSTA)|_BV(TWEN)
#define TwiStop()     TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWSTO)
#define TWI_STATUS    (TWSR & 0xF8)


BOOL C24Start(unsigned CHAR addr, BOOL bWrite)
{
    // 发送开始位
    unsigned CHAR renum=10; // 重试次数

resend:
    TwiStart();
    while(!(TWCR&_BV(TWINT))==0)
        ;
    SWITCH(TWI_STATUS)
    {
    case TW_START:
    case TW_REP_START:
        break;
    case TW_MT_ARB_LOST:
        renum --;
        if(renum == 0)
            return FALSE;
        goto resend;
        break;
    default:
        return FALSE;
    }

    // 发送地址和读写位
    TWDR = addr|bWrite;
    TWCR = _BV(TWINT)|_BV(TWEN);  // 清中断,开始传输
    while((TWCR&_BV(TWINT))==0)
        ;
    
    if(bWrite == EEWR) // 主设备写模式
    {
        
        SWITCH(TW_STATUS)
        {
        case TW_MT_SLA_ACK: // 从设备成功响应
            break;
        case TW_MT_SLA_NACK: // 从设备未响应
            renum --;
            if(renum == 0)
                return FALSE;
            TwiStop();
            goto resend;
            break;
        default:
            PORTD = TW_STATUS;
            PORTB = 0x05;
            for(;;)
                ;
            TwiStop();
            return FALSE;
        }
    }else{
        if(TWI_STATUS != TW_MR_SLA_ACK&&TWI_STATUS != TW_NO_INFO)
        {
            PORTD = TWI_STATUS;
            PORTB = 0x33;
            for(;;)
                ;
            return FALSE;
        }
        
    }    
            
    return TRUE;
}
// 写一个字节
BOOL WriteByte(unsigned CHAR dat)
{
    TWDR = dat;
    TWCR = (1<<TWINT)|(1<<TWEN); // 启动发送数据
    while(!(TWCR&(1<<TWINT)))  // 等待发送完成
        ;
    SWITCH(TW_STATUS)
    {
    case TW_MT_DATA_ACK:
    case TW_MT_SLA_NACK:
    case TW_MT_DATA_NACK:
        break;
    default:
        PORTB = 0x1f;
        PORTD = TW_STATUS;
        for(;;)
            ;
        return FALSE;
    }

    return TRUE;
}
BOOL C24WriteByte(unsigned CHAR addr,unsigned CHAR dat)
{

    if(C24Start(0xa0,EEWR))
    {
        if(WriteByte(addr)== FALSE)
            return FALSE;
        if(WriteByte(dat)== FALSE)
            return FALSE;
    }
    
    TwiStop();
    return TRUE;

}

BOOL C24ReadByte(unsigned CHAR addr,unsigned CHAR *dat)
{


    if(C24Start(0xa0,EEWR))  // 写设备号
    {
        if(WriteByte(addr) == FALSE)  // 写地址
        {
            TwiStop();
            return FALSE;
        }

        if(C24Start(0xa0,EERD))  // 开始读
        {
            //TWCR = _BV(TWINT)|_BV(TWEN)|_BV(TWEA);
            TWCR = _BV(TWINT)|_BV(TWEN); // 发送NAK
            while (!(TWCR & (1<<TWINT)))
                ;
            SWITCH(TWI_STATUS)
            {
   &nb
参与讨论
昵称:
讨论内容:
 
 
相关帖子
双龙DTMF演示程序的两点疑问,做过DTMF(软件PWM方法)的请进
本贴使我的积分达到10000,这一时刻留给我的AVR!
AVR
求助!
avrstudio4.12中如何看static变量的值及位置?
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号