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上来的。
好无解!! 楼主,你还是抓一下波形吧。 帮顶一下 帮顶一下
页:
[1]