打印

有关飞思卡尔I/O口模拟I2C线的问题

[复制链接]
3180|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mjbzy|  楼主 | 2010-12-28 10:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
为什么我的程序不能正确读取PCF8583呢?下面附有程序,请大家帮忙看看

#define  SDA  PTDD_PTDD5
#define  SCL  PTDD_PTDD6

void I2C_Delay(void)   //0.18us*27=4.86us
{
    asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm"nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm
("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");      
}
void I2C_Start(void)
{   
    PTDDD_PTDDD5=1; //SDA set output
    PTDDD_PTDDD6=1; //SCL set output
     
    SDA=1;
    I2C_Delay();
    SCL=1;
    I2C_Delay();           //起始条件建立时间大于4.7us,延时
    SDA=0;
    I2C_Delay();           //起始条件锁定时间大于4μs
    SCL=0;
    I2C_Delay();
}
void I2C_Stop(void)
{
    PTDDD_PTDDD5=1; //SDA set output
    PTDDD_PTDDD6=1; //SCL set output
   
    SDA=0;
    I2C_Delay();
    //SCL=0;
    //I2C_Delay();           //结束条件建立时间大于4μs
   
    SCL=1;
    I2C_Delay();           //结束条件建立时间大于4μs
   
    SDA=1;
    I2C_Delay();           //结束条件锁定时间大于4.7μs
}

void Write_ACK(void)
{
    PTDDD_PTDDD5=1; //SDA set output
    PTDDD_PTDDD6=1; //SCL set output
   
    SDA=0;
    I2C_Delay();
    SCL=1;
    I2C_Delay();            //SCL保持高电平大于4μs
   
    SCL=0;
    I2C_Delay();
}

void Write_NoAck(void)
{
    PTDDD_PTDDD5=1; //SDA set output
    PTDDD_PTDDD6=1; //SCL set output
      
    SDA=1;
    I2C_Delay();
    SCL=1;
    I2C_Delay();           //SCL保持高电平大于4μs
   
    SCL=0;
    I2C_Delay();
}

void Wait_ACK(void)
{   
    u8 errtime=20;  //20
   
    PTDDD_PTDDD5=1; //SDA set output
    PTDDD_PTDDD6=1; //SCL set output
   
    SDA=1;
    I2C_Delay();
   
    PTDDD_PTDDD5=0; //SDA set input
    SCL=1;
    I2C_Delay();
    while((SDA==1)&&(errtime>0))
    {  
        errtime--;
        if(!errtime)        
        {  
            I2C_Stop();
            //Led_On();
        }
    }   
    SCL=0;
    I2C_Delay();
}
void Write_Byte(u8 wdata)
{
    u8 i;
    PTDDD_PTDDD5=1; //SDA set output
    PTDDD_PTDDD6=1; //SCL set output  
      
    for(i=0;i<8;i++)
    {
        if(wdata&0x80) SDA=1;
          else SDA=0;
          wdata<<=1;
          I2C_Delay();   
          SCL=1;
          I2C_Delay();       //SCL保持高电平大于4μs
          SCL=0;
          I2C_Delay();
    }
    Wait_ACK();
}

u8 Read_Byte(void)
{
    u8 i,bytedata;
    PTDDD_PTDDD5=1; //SDA set output
    PTDDD_PTDDD6=1; //SCL set output
    SDA=1;
    PTDDD_PTDDD5=0; //SDA set input
           
    for(i=0;i<8;i++)
    {
        SCL=1;
        I2C_Delay();
      
        bytedata<<=1;
        //bytedata|=SDA;
        if(SDA) bytedata|=0x01;
        SCL=0;
        I2C_Delay();
    }
    return(bytedata);
}

void Write_Data(u8 address,u8 mdata)
{
    I2C_Start();
    Write_Byte(0xA0);           /*写命令*/
    Write_Byte(address);        /*写地址*/
    Write_Byte(mdata);          /*写数据*/
    I2C_Stop();
   
}
u8 Read_Data(u8 address)               /*单字节选择性读*/
{   
    u8 rdata;
    I2C_Start();
    Write_Byte(0xA0);             /*写命令*/
    Write_Byte(address);          /*写地址*/
   
    I2C_Start();
    Write_Byte(0xA1);             /*读命令*/
    rdata=Read_Byte();
    Write_NoAck();
    I2C_Stop();
    return(rdata);
}

void Read_All_Data(u8 address,u8 count,u8 *buff)   /*多字节连续读*/
{   
    u8 i;
    I2C_Start();
    Write_Byte(0xA0);             /*写命令*/
    Write_Byte(address);          /*写地址*/
    I2C_Start();
    Write_Byte(0xA1);             /*读命令*/
    for(i=0;i<count;i++)
    {
        buff[i]=Read_Byte();
        if(i<count-1)
        {
          Write_ACK();
        }
    }
    Write_NoAck();
    I2C_Stop();
}

void P8583_Init(void)
{
      Write_Data(0x00,0x00); /*设置状态寄存器 32.768kHz,未屏蔽 禁止报警 */
      
      PTDPE |= 0x60;   //内部上拉SDA/SCL线
}

相关帖子

沙发
mjbzy|  楼主 | 2010-12-28 20:22 | 只看该作者
关于管教的方向问题也考虑进去了,还是不行,麻烦大家帮忙看看!谢谢

使用特权

评论回复
板凳
mjbzy|  楼主 | 2010-12-30 19:14 | 只看该作者
怎么也没有人指点一下啊,卡了好几天了

使用特权

评论回复
地板
luciatian| | 2011-2-25 14:48 | 只看该作者
没有仔细看你的程序,我这有一个调好的,直接就可以用。
void Delay_1(uchar count)
{
    uchar i=0;
    for(i=0;i<count;i++){;}
}              

void Time_putnum()            
{      
    uchar temp[7];
    uchar i=0;   

    for(i=0;i<7;i++)
    {
        temp[i]=((g8563_Store[i]>>4)&0x0f)*10;
        Store[i]=temp[i]+(g8563_Store[i]&0x0f);
    }
            // 十位    // 个位
}
void Start(void)
{
    //TIE=0;
        SETSCLOUT;
        SETSDAOUT;   
    SDA = 1;  //SDA = 1
    Delay_1(1);
    SCL = 1;  //SCL = 1
    Delay_1(1);
    SDA = 0;  //SDA = 0
    Delay_1(1);
    SCL = 0;  //SCL = 0
    Delay_1(1);
}
void Stop(void)
{
    SETSCLOUT;
        SETSDAOUT;
    SDA = 0;  //SDA = 0
    Delay_1(1);
    SCL = 1;  //SCL = 1
    Delay_1(1);
    SDA = 1;  //SDA = 1
    Delay_1(1);   
    SCL = 0;  //SCL = 0
    Delay_1(1);
    //TIE=1;
}
void WriteNOACK(void)
{
        SETSDAOUT;
    SDA = 1;//SDA = ack
    Delay_1(1);
    SCL = 1;  //SCL = 1
    Delay_1(1);
    SCL = 0;  //SCL = 0
}

void WriteACK(void)
{
    SETSCLOUT;
        SETSDAIN;  //
    SDA = 0;//SDA = ack
    Delay_1(1);
    SCL = 1;  //SCL = 1
    Delay_1(1);
    SCL = 0;  //SCL = 0
}
void WaitACK(void)
{     
    uchar errtime=255;
    SETSCLOUT;
        SETSDAOUT;
    SDA = 1;  //SDA = 1
    Delay_1(1);                        
    SCL = 1;  //SCL = 1
    Delay_1(1);
        SETSDAIN;
    while(SDA)
    {
        errtime--;
        if(!errtime)
        {
            Stop();
            //SystemError=0x11;
            //return false;
            return;
        }
    }
    SCL = 0;  //SCL = 0
    //return;
    //return true;
}
void writebyte(uchar wdata)
{
    uchar i;
    SETSCLOUT;
        SETSDAOUT;
    for(i=0;i<8;i++)
    {
        SCL=0;
        Delay_1(1);
        if(wdata&0x80)
            SDA = 1;  //SDA = 1
        else
            SDA = 0;  //SDA = 0
        wdata<<=1;
        SCL = 1;  //SCL = 1
        Delay_1(1);
        //SCL = 0;  //SCL = 0
        //Delay_1(1);
    }
    SCL = 0;
    WaitACK();                    
}
uchar Readbyte(void)
{
    uchar i,bytedata;
    SETSCLOUT;
        SETSDAOUT;

    SDA = 1;  //SDA = 1
    for(i=0;i<8;i++)
    {
        SCL = 1;  //SCL = 1
        bytedata<<=1;
            SETSDAIN;
        bytedata|=SDA;
        SCL = 0;  //SCL = 0
        Delay_1(1);
    }
    return(bytedata);
}
void writeData(uchar address,uchar mdata)
{
    Start();                                        // ????
    writebyte(0xa2);            // ???ü??
    //WaitACK();
    writebyte(address);         // ?????·
    //WaitACK();
    writebyte(mdata);           // ??????
    //WaitACK();
    Stop();                                                // ????
}
uchar ReadData(uchar address)
{
    uchar rdata;
    Start();                                   // ????
    writebyte(0xa2);           // ???ü??
    writebyte(address);        // ?????·
    Start();                                   // ????
    writebyte(0xa3);           // ??ü??
    rdata=Readbyte();  
    //WriteACK();
    WaitACK();
    Stop();                                           // ????
    return(rdata);
}  
/*void ReadData1(uchar address,uchar count,uchar  *buff)
{
    uchar  i;                                   
    Start();                                   // ????
    writebyte(0xa2);           // ???ü??
    writebyte(address);        // ?????·
    Start();                                   // ????
    writebyte(0xa3);           // ??ü??
    for(i=0;i<count;i++)
    {
        //*(buff+i)= Readbyte();
        buff[i]= Readbyte();

        if(i<count-1)
        //WriteNOACK(0);
        WriteNOACK();
    }
    //WriteNOACK(4);      
    WriteNOACK();
    Stop();                                           // ????
}*/

void ReadData1(uchar address,uchar count,uchar *buff)
{
    uchar  i;                                   
    Start();                                   // ????
    writebyte(0xa2);           // ???ü??
    //WaitACK();
    writebyte(address);        // ?????·
    //WaitACK();
    Start();                                   // ????
    writebyte(0xa3);           // ??ü??
    //WaitACK();
    for(i=0;i<count;i++)
    {
        //*(buff+i)= Readbyte();
        buff[i]= Readbyte();
        Store[i]=buff[i];

        if(i<count-1)
        //WriteNOACK(0);
        WriteACK();         // 收到一个字节后发送一个应答位
    }
    //WriteNOACK(4);      
    WriteNOACK();             // 收到最后一个字节后发送一个非应答位
    Stop();                                           // ????
}
void P8563_Read(void)
{
    //uchar buff[7];
    //ReadData1(0x02,0x07,buff);
    g8563_Store[0]=ReadData(0x02)&0x7f;    // ??
    //Date_Time.Second=g8563_Store[0];
    if(g8563_Store[0]==0)
    {
        g8563_Store[1]=ReadData(0x03)&0x7f;    // ·?
        //Date_Time.Minu=g8563_Store[1];
        if(g8563_Store[1]==0)
        {
            g8563_Store[2]=ReadData(0x04)&0x3f;    // ???±
            //Date_Time.Hour=g8563_Store[2];
            if(g8563_Store[2]==0)
            {
                g8563_Store[3]=ReadData(0x05)&0x3f;    // ??
                //Date_Time.Day=g8563_Store[3];
                if(g8563_Store[3]==0)
                {
                    g8563_Store[4]=ReadData(0x06)&0x07;    // ????
                    if(g8563_Store[4]==0)
                    {  
                        g8563_Store[5]=ReadData(0x07)&0x1f;    // ??/????
                        if(g8563_Store[5]==0)
                        {
                            g8563_Store[6]=ReadData(0x08);         // ?ê  
                         }
                    }
                }
            }
        }
    }  
}
void P8563_settime(void)
{
    uchar  i;
    writeData(0x00,0x40);
    writeData(0x01,0x00);
    for(i=2;i<=8;i++)
    {
        writeData(i,g8563_Store[i-2]);
    }
    writeData(0x00,0x00);
}
void P8563_init(void)
{
    uchar  i=0;
    /* 检查是否第一次启动,是则初始化时间,检查对象为秒(0x02)最高位为1则初始化*/
    //if((ReadData(0x02)&0x7f)==0x8)
    //{
    for(i=0;i<=6;i++)
    {
        g8563_Store[i]=c8563_Store[i];      //初始化时间
    }
    P8563_settime();
    //Flag1_regs.bit.p8563_initf=1;
}

使用特权

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

本版积分规则

0

主题

9

帖子

0

粉丝