这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » M8,AT24C08 哪位大侠可以给我M8与AT24C08的通信代码

共3条 1/1 1 跳转至

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

院士
2006-09-17 18:14:16     打赏
M8,AT24C08 哪位大侠可以给我M8与AT24C08的通信代码



关键词: AT24C08     哪位     大侠     可以     给我     通信     代码    

院士
2006-12-22 22:43:00     打赏
2楼
问 我刚学AVR,正在用M8做验证实验,做了几个与AT24C08通信的代码都不成功,哪位高手有这方面的代码,可以贴一个给我参考一下吗?谢谢。 1: 先调应答,不要想一口吃胖。I2C协议必须看,跑不掉。 2: 谢谢你。我做了一个MEGA8与24C16通信的程序可是每次调用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)
            {
            case TW_MT_DATA_ACK:
            case TW_MR_SLA_NACK:
                break;
            case TW_MT_DATA_NACK:
                TwiStop();
                 return FALSE;
            default:
                PORTB = 0x03;
                PORTD = TWI_STATUS;
                for(;;)
                    ;
            }

            *dat =  TWDR;
            //TWCR = _BV(TWINT)|_BV(TWEN);  // 发送NAK信号,表示是最后一个字节
            TwiStop();    
            return TRUE;
        }else{
            return FALSE;
        }
    }else{
        return FALSE;
    }

    return TRUE;
}

int main(void)
{
    unsigned char tmp=0;
    unsigned char buf[3]={0x10,0x11,0x12};
    //TWI初始化

     TWSR=0x00;  // 0分频系数,预分频值1
     TWBR=0x0c;  // 4MHz CPU频率,100kHz的TWI速率
     TWAR=0x01;  // 主机,忽略高7位设置,不识别广播
     TWCR=0x44;  // 使能TWI,

    DDRB = 0xff;
    DDRD = 0xff;

    PORTD = 0x00;
    PORTB = 0x00;

    PORTD = 0x00;
    TwiStop();
    for(;;)
    {
        buf[0]++;
        //if(C24WriteByte(0,0x10)==TRUE)
        //{
            _delay_ms(20);
            if(C24WriteByte(1,buf[0])==FALSE)
                continue;
            if(C24ReadByte(1,&tmp)==FALSE)
            {
                PORTB = 0x06;
                
                continue;
            }        
            break;
        //}else{
            //PORTD = tmp;
            //TwiStop();
        //}
        
            
    }


    for(;;)
    {
        PORTB = ~PINB|0x80;
        PORTD = tmp;
    }

    return 0;
}


专家
2022-08-20 16:03:17     打赏
3楼

学习学习


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]