打印

请帮忙看看什么问题,IIC读数据不正确

[复制链接]
689|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jupple-George|  楼主 | 2015-4-8 18:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <avr/io.h>
#define F_CPU 12000000UL
#include "util/delay.h"
#include <avr/interrupt.h>
/*********************按键定义*******************************************************/
#define K1 PORTB&=0X01;
#define K2 PORTB&=0X02;
#define K3 PORTB&=0X04;
#define K4 PORTB&=0X08;
/************a******t24c02读写地址********************************************************/
#define rd_device_add 0xa1
#define wr_device_add 0xa0
/***************************MT主式方式传输 MR主式方式接收***********************************/
#define START  0X08
#define RE_START  0X10
#define MT_SLA_ACK  0X18
#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
/************************常用TWI操作(主模式写和主模式读)************************************/
#define Start() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))        //产生START信号
#define Stop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))        //产生STOP信号
#define Wait()                     {while(!(TWCR&(1<<TWINT)));}                //等待当前操作完成
#define TestACK() (TWSR&0xF8)                                //取出状态码
#define SetACK() (TWCR|=(1<<TWEA))                        //产生ACK
#define SetNoAck()    (TWCR&=~(1<<TWEA))
//#define Writebyte(twi_d) {TWDR=(twi_d);TWCR=(1<<TWINT)|(1<<TWEN);}        //发送一个字节(twi_d为写入的数据)
#define Twi() (TWCR=(1<<TWINT)|(1<<TWEN)) //启动I2C读,返回noack
#define Write8Bit(x)  {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);}         //发送一个字节(twi_d为写入的数据)
//#define Twi_Ack() (TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWEA)) //启动I2C读,返回ack
unsigned char Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};  //段码控制
unsigned char dispbit[8]={0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70};    //位选控制   查表的方法控制
unsigned int LedNumVal=10;

void port_init()
{
        DDRA = 0XFF;
        DDRC = 0XFC;
        DDRB = 0X00;
        PORTA = 0XFF;
        PORTB = 0XFF;
        PORTC = 0X00;
}

void twi_init(void)
{
        TWBR=0X20;
        TWSR=0;
        //TWCR=0X44;
}

/******************************I2C总线写一个字节***************************************/
unsigned char i2c_Write(unsigned char RomAddress,unsigned char Wdata)
{
        Start();
        Wait();
        if(TestACK()!=START)
        return 1;
        Write8Bit(wr_device_add);
        Wait();
        if(TestACK()!=MT_SLA_ACK)
         return 1;
        Write8Bit(RomAddress);
        Wait();
        if(TestACK()!=MT_DATA_ACK)
        return 1;
        Write8Bit(Wdata);
        Wait();
        if(TestACK()!=MT_DATA_ACK)
         return 1;
        Stop();
        _delay_ms(10);
        return 0;
}

/********************* I2C总线读一个字节*************************/
unsigned char i2c_Read(unsigned char RomAddress)
{
        unsigned char temp;
        Start();
        Wait();
        if (TestACK()!=START)
        return 0;
        Write8Bit(wr_device_add);
        Wait();
        if (TestACK()!=MT_SLA_ACK)
        return 0;
        Write8Bit(RomAddress);
        Wait();
        if (TestACK()!=MT_DATA_ACK)
        return 0;
        Start();
        Wait();
        if (TestACK()!=RE_START)  
        return 0;
        Write8Bit(rd_device_add);
        Wait();
        if(TestACK()!=MR_SLA_ACK)  
        return 0;
        Twi();
        Wait();
        if(TestACK()!=MR_DATA_NOACK)
        return 0;
        temp=TWDR;
        Stop();
        return temp;
}

void led_show(void)
{       
        unsigned char i;
        unsigned char LEDOUT[4];
        unsigned char LedNumVal;
        i2c_Write(0x01,0x03);
        i2c_Read(0x01);
        LedNumVal=i2c_Read(0x01);
        LEDOUT[0]=Disp_Tab[LedNumVal%10000/1000];
        LEDOUT[1]=Disp_Tab[LedNumVal%1000/100];
        LEDOUT[2]=Disp_Tab[LedNumVal%100/10];
        LEDOUT[3]=Disp_Tab[LedNumVal%10];
       
        /*LEDOUT[4]=Disp_Tab[LedNumVal2%10000/1000];
        LEDOUT[5]=Disp_Tab[LedNumVal2%1000/100];
        LEDOUT[6]=Disp_Tab[LedNumVal2%100/10];
        LEDOUT[7]=Disp_Tab[LedNumVal2%10];*/
       
        for (i=0;i<4;i++)
        {
                PORTC=dispbit[i];
                PORTA=LEDOUT[i];
                //PORTA=0x06;
                _delay_ms(3);
        }
}

int main(void)
{
        port_init();
        twi_init();
        while(1)
        {
                led_show();
        }
       
}

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝