i2c奇怪的错误

学到更多常见问题解答教程

10个帖子/ 0新
最后一篇
Thanhtu131
离线
最后一次露面:2小时26分钟前
加入:2018-09-18 17:44
i2c奇怪的错误

嗨,我面临着i2c设备非常奇怪的错误。我使用EEPROM AT24C02和实时计数器DS3231。由于它们具有相同的I2C配置(地址模式,Word Addres大小),因此我不必为DS3231开发库库。我正在尝试从AT24C02和DS3231读取7个字节。在I2C EEPROM示例(非BLE)中,我可以成功读取。但在BLE_SLEEPMODE示例中,在回调函数user_app_init()中,我将一些代码从AT24C02和DS3231读取7个字节。我可以从AT24C02读取7个字节(地址0x50)。当我将地址更改为DS3231地址(0x68) - > debug - >运行时,IDE跳转到文件NMI_Handler.c和卡在63行中。我有一些捕获在PDF文件中。

62 if((getword16(sys_stat_reg)&dbg_is_up)== dbg_is_up)
63 __asm(“bkpt#0 \ n”);
64其他
{

我花了2天,但我找不到原因。请帮我!

我很快就会出发你的回复。

谢谢!

附件:
设备:
PM_DIALOG.
离线
最后一次露面:4小时59分钟前
员工
加入:2018-02-08 11:03
嗨thanhtu131,

嗨thanhtu131,

我建议首先检查教程8:调试方法为了开始调试应用程序代码。您能找到触发NMI的代码的点吗?

因此,如果我理解正确,它正在研究非BLE项目,但它不在BLE项目上。

您是否使用了任何可用的睡眠模式?

谢谢,PM_DIALOG.

Thanhtu131
离线
最后一次露面:2小时26分钟前
加入:2018-09-18 17:44
嗨,你已经理解了错误

嗨,你已经理解了错误。我可以在BLE和非BLE示例中通常读取EEPROM。但我只能在非BLE示例中从DS3231读取时间。在BLE睡眠模式示例中,如果我将地址从0x50(EEPROM)更改为0x68(DS3231),则触发NMI。默认睡眠模式是DeepSleep模式。事情变得更加神秘:我制作了一个带有RST按钮的封装板,连接到DA14580基本套件上的RST PIN,如果我按下第一个按钮,我可以运行代码并从DS3231读取数据,每次都必须这样做我调试程序。

PM_DIALOG.
离线
最后一次露面:4小时59分钟前
员工
加入:2018-02-08 11:03
嗨thanhtu131,

嗨thanhtu131,

>>>如果我将地址从0x50(EEPROM)更改为0x68(DS3231),则触发NMI的东西。

您必须开始调试您的项目。这就是为什么我以前的答案是遵循建议的教程。

请在调试模式下运行它,将断点添加到读取功能并进入代码中,以便您可以找到错误的内容。

谢谢,PM_DIALOG.

Thanhtu131
离线
最后一次露面:2小时26分钟前
加入:2018-09-18 17:44
嗨,我跟着

嗨,我遵循了建议的教程。并且硬盘发生在DA14580的I2C_EPEOM库驱动程序中发生。旁边,当硬质求发生时,没有东西已经记录。如果我发现的代码行触发了NMI,则必须在Sereial Monitor中登录。我不能放置打破点的地方。请检查附件PDF文件。

附件:
PM_DIALOG.
离线
最后一次露面:4小时59分钟前
员工
加入:2018-02-08 11:03
嗨thanhtu131,

嗨thanhtu131,

你能说明哪个是触发NMI的SDK函数?

谢谢,PM_DIALOG.

Thanhtu131
离线
最后一次露面:2小时26分钟前
加入:2018-09-18 17:44
正如您在I2C错误中看到的那样

正如您在I2C错误PDF文件中看到的,触发NMI的SDK函数是wait_until_no_master_activity()(这是检查涉及寄存器的宏)。我想知道为什么如果我按下重置按钮(我制作了一个适配器板,它可以在DA14580套件中连接到RST引脚标题),我可以运行和调试程序

PM_DIALOG.
离线
最后一次露面:4小时59分钟前
员工
加入:2018-02-08 11:03
嗨thanhtu131,

嗨thanhtu131,

等待_until_no_master_actity()在几个I2C API中调用,并让应用程序等待,直到主设备不再活动。

From the attached files, I assume that the WAIT_UNTIL_NO_MASTER_ACTIVITY() that is causing the NMI is called by the i2c_wait_until_eeprom_ready().

I2C_WAIT_UNTIL_EEPROM_READY()函数是轮询,直到I2C已准备就绪。首先,此函数发送伪值,直到TX的FIFO为空。我强烈建议你探测你的引脚(SCL,SDA和RDY)并尝试阅读地址。如果你试过,我认为这将更清楚这个问题可能是什么。

由于这可能导致您发布的原因是i2c_wait_until_eeprom_ready(),因为这是为了检查您的设备是否已准备好交互,但除了i2c_eeprom_read_byte()函数的情况下让您在总线上介绍I2C设备的数据表的内容。

谢谢,PM_DIALOG.

Thanhtu131
离线
最后一次露面:2小时26分钟前
加入:2018-09-18 17:44
嗨,非常感谢你的

嗨,非常感谢您的支持,我向下绘制了这个问题来自DS3231 PCB。更改另一个DS3231模块后,操作正常工作。

PM_DIALOG.
离线
最后一次露面:4小时59分钟前
员工
加入:2018-02-08 11:03
嗨thanhtu131,

嗨thanhtu131,

很高兴你想出来了!

谢谢,PM_DIALOG.