本帖最后由 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上来的。 好无解!! |
楼主,你还是抓一下波形吧。 |
|
帮顶一下 |
帮顶一下 |