嗨,我面临着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天,但我找不到原因。请帮我!
我很快就会出发你的回复。
谢谢!
设备:
嗨thanhtu131,
我建议首先检查教程8:调试方法为了开始调试应用程序代码。您能找到触发NMI的代码的点吗?
因此,如果我理解正确,它正在研究非BLE项目,但它不在BLE项目上。
您是否使用了任何可用的睡眠模式?
谢谢,PM_DIALOG.
嗨,你已经理解了错误。我可以在BLE和非BLE示例中通常读取EEPROM。但我只能在非BLE示例中从DS3231读取时间。在BLE睡眠模式示例中,如果我将地址从0x50(EEPROM)更改为0x68(DS3231),则触发NMI。默认睡眠模式是DeepSleep模式。事情变得更加神秘:我制作了一个带有RST按钮的封装板,连接到DA14580基本套件上的RST PIN,如果我按下第一个按钮,我可以运行代码并从DS3231读取数据,每次都必须这样做我调试程序。
嗨thanhtu131,
>>>如果我将地址从0x50(EEPROM)更改为0x68(DS3231),则触发NMI的东西。
您必须开始调试您的项目。这就是为什么我以前的答案是遵循建议的教程。
请在调试模式下运行它,将断点添加到读取功能并进入代码中,以便您可以找到错误的内容。
谢谢,PM_DIALOG.
嗨,我遵循了建议的教程。并且硬盘发生在DA14580的I2C_EPEOM库驱动程序中发生。旁边,当硬质求发生时,没有东西已经记录。如果我发现的代码行触发了NMI,则必须在Sereial Monitor中登录。我不能放置打破点的地方。请检查附件PDF文件。
嗨thanhtu131,
你能说明哪个是触发NMI的SDK函数?
谢谢,PM_DIALOG.
正如您在I2C错误PDF文件中看到的,触发NMI的SDK函数是wait_until_no_master_activity()(这是检查涉及寄存器的宏)。我想知道为什么如果我按下重置按钮(我制作了一个适配器板,它可以在DA14580套件中连接到RST引脚标题),我可以运行和调试程序
嗨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.
嗨,非常感谢您的支持,我向下绘制了这个问题来自DS3231 PCB。更改另一个DS3231模块后,操作正常工作。
嗨thanhtu131,
很高兴你想出来了!
谢谢,PM_DIALOG.