虽然写的是IIC,但其实在system bd中并没有勾选IIC0、IIC1,而是根据IIC协议写了相关的函数(不是我写的)。
用到的RTC是DS3231芯片。
目前遇到的问题是:
zynq调试成功;fmql调试失败,其中年、日、时、秒读写成功,而月、分写入失败。
【总结:没找到原因】
疑问:写入的地址是哪里得到的?为什么是0xD0(bit0是读写控制位)---->DS3231数据手册中写了。
IIC协议:
关于 NXP PCA85073A 实时时钟读取数据时出现 IIC 传输失败的原因解析和解决方法-CSDN博客
示波器调IIC:
模拟IIc通讯失败解决办法&&通讯线长度问题_模拟iic发送字节失败-CSDN博客
发现单步调试时,写月/分出现的情况是:写入0xD0失败(无ACK应答)
而不加断点调试,写月/分出现的情况是:写入0xD0成功;写data后无ACK应答。
可能的原因是:
硬件配置(引脚,虚焊等),线路过长,速率配置/时序,主机复位,
https://www.cnblogs.com/wfagly/p/18218994
如何解决i2c设备主机与从机直接无法正常数据交互的问题-电子发烧友网
https://wenku.csdn.net/column/4smv4k79zy#3.2.2%20%E6%95%B0%E6%8D%AE%E5%B8%A7%E5%A4%84%E7%90%86%E9%94%99%E8%AF%AF
IIC通讯失败发送数据无回应 - 嵌入式学习小组 - 电子技术论坛 - 广受欢迎的专业电子论坛!
根据以上链接,分析可能出现的原因:
(总线上只有一个设备)速率配置/时序问题;按最低速度通讯试试
硬件(上拉电阻、);
iic协议编写;
etc。
调试现象(正常情况)
黄色为SCL,紫色为SDA
写地址
写位置(0-6 表示秒分时、星期、日月年) 4表示Day
写数据 0x16表示Day为16
发现,每次写入数据(共3次),SDA都会有一个尖峰,目前认为它是应答信号。
调试现象(不正常情况)
以为尖峰后面的第一个SCL高电平为返回应答信号,所以红色框内的周期是在这之后的,即传输data——发现少一个周期,只写了7bit数据。
(后面发现,其实是尖峰前的SCL高电平为返回应答信号,这样data是8bit。但是因此发现的是,没有读取到应答信号?)
为了方便看信号,data全写0:
第一个红框为写位置(0-6),第二个红框为data写入(data设为0)
发现,写位置前是正常的(尖峰位置),而写位置后的尖峰太靠后了,使data写入出现错误(目前这么理解。)
因此增大SCL=0后的延时(SDA只有在SCL为低电平时才能变化):
但是尖峰位置随之向后延时了。
Failed
增加SCL=1的时间,读取应答信号时间延后:
本来是等1/2的高电平时间后读取应答信号,然后再等1/2的高电平时间。
是不是说明写位置(Month、Minute)时就失败了?
看看zynq:
在传输的第8个周期,SCL一变为低电平,SDA就有了尖峰。
写入失败,是因为data写入后SDA为非应答(即没有拉低)。
可能的原因:
ds3231处于忙碌或不接收数据的状态;
通信速率太快;
线路太长;
再探索IIC应答信号和非应答信号_iic发所有地址都没有应答-CSDN博客
读了一下DS3231的寄存器,Control寄存器、Control/Status寄存器的值都是0x1C、0x88。没有什么区别(写成功和不成功都是这个)。