bwu 发表于 2015-4-23 15:55:15

RTC DS1307 I2C 无应答,大家看看

本帖最后由 bwu 于 2015-4-23 16:00 编辑

目前在调试一块RTC 芯片 DS1307 用的是I2C接口,采用的是IO模拟时序(硬件I2C看着有点蛋疼)
​在写入器件地址后,器件没有应答,不知道是什么情况。

...​
​DS1307_start();
DS1307_write_byte(0xD0); //发送写命令
​Ack_DS1307();​
​..

​//IIC发送一个字节
static void DS1307_write_byte(unsigned char dat)
{
unsigned char i;

SDA_OUT();
    IIC_SCL(0); //释放总线准备数据
    SysCtlDelay(8); //延时

    //Data is transferred with the most significant bit (MSB) first.
for (i = 0; i < 8; i++)
{
if (dat & 0x80) //MSB
{
IIC_SDA(1);
}
else
{
IIC_SDA(0);
}

dat <<= 1;
SysCtlDelay(8); //延时
IIC_SCL(1); //锁定总线传输数据
SysCtlDelay(8); //延时
IIC_SCL(0);
SysCtlDelay(8); //延时
}
}


/*
​收从机应答:将数据线(SDA)置高,时钟线(SCL)变低-->变高-->变低,
                判断数据线(SDA)的电平:低为有应答,高位无应答
*/
static void Ack_DS1307(void)
{
    unsigned char errtime=250;//因故障接收方无ACK,超时值为255。
    //数据线升高,以便捕捉相应信号,(相应信号:拉低数据线)
    SDA_OUT();
    IIC_SCL(0);SysCtlDelay(8);
    IIC_SDA(1);SysCtlDelay(8);
    SDA_IN(); SysCtlDelay(8);   //SDA设置为输入   
    IIC_SCL(1);SysCtlDelay(8);

    while (READ_SDA()) //等待捕捉相应信号,信号没有到来前一直保持循环,信号到来后迅速跳出循环
    {
    errtime--;
    if (!errtime)
    {
               DS1307_stop(); //传送失败,停止传送
         Printf("Error: ack failed\r\n");
         return ;
    }
    }

    SDA_OUT();
    IIC_SCL(0);//无论传送是否正确,都需放空总线,以备后用
    SysCtlDelay(8);

    return ;
}

​打印出 Printf("Error: ack failed\r\n");

​可以确定的是时序是正确的,按照datasheet上来的。
​好无解!!

发表于 2015-4-23 16:38:26

楼主,你还是抓一下波形吧。

拼命三郎 发表于 2015-4-23 18:07:35

kanimal 发表于 2015-4-27 22:37:42

帮顶一下

kanimal 发表于 2015-4-27 22:39:10

帮顶一下
页: [1]
查看完整版本: RTC DS1307 I2C 无应答,大家看看