嗨,我面临一个非常奇怪的错误与i2c设备。我使用eeprom AT24C02和实时计数器DS3231。因为他们有相同的i2c配置(地址模式,字地址大小),我不需要为ds3231开发库。我试图从AT24C02和DS3231读取7字节。在i2c eeprom示例(非BLE)中,我可以成功读取。但是在ble_sleepmode示例中,在回调函数user_app_init()中,我放了一行代码从AT24C02和DS3231读取7字节。我可以从AT24C02(地址0x50)读取7个字节。当我将地址更改为DS3231地址(0x68)——> debug——> Run时,ide跳转到文件nmi_handler.c并停留在第63行。我有一些捕获在PDF文件。
62 if ((GetWord16(SYS_STAT_REG) & DBG_IS_UP) == DBG_IS_UP
63年__asm(“BKPT # 0 \ n”);
其他64
{
我花了两天的时间,但是我找不到原因。请帮助我!
我期待着很快收到你的来信。
谢谢!
设备:
嗨Thanhtu131,
我建议先检查一下教程8:调试方法以便开始调试应用程序代码。你能找出触发NMI的代码点是什么吗?
所以,如果我理解正确的话,它在非BLE项目中工作,但不在BLE项目中工作。
你有使用任何一种可用的睡眠模式吗?
谢谢,PM_Dialog
嗨,你理解错了。在BLE和非BLE的例子中,我可以正常读取eeprom。但是我只能在非ble示例中从ds3231读取时间。在BLE睡眠模式的例子中,如果我将地址从0x50(eeprom)更改为0x68(ds3231),就会触发NMI。默认休眠模式为深度休眠模式。事情变得更神秘的:我要求董事会与RST按钮连接到RST销DA14580基本装备,如果我按,RST按钮,我可以运行代码并读取数据从ds3231和我要做的,每次我调试程序。
嗨Thanhtu131,
>>>如果我将地址从0x50(eeprom)更改为0x68(ds3231),会触发NMI。
您将不得不开始调试您的项目。这就是为什么我之前的回答是遵循建议的教程。
请在调试模式下运行它,在read函数中添加一个断点,然后进入代码,这样您就可以发现哪里出错了。
谢谢,PM_Dialog
你好,我已经遵循了建议的教程。DA14580的i2c_eepeom库驱动行出现硬故障。此外,当硬故障发生时,没有东西被记录。如果我找到的代码行触发了NMI,那么串行监视器中必须记录一些东西。我找不到放断点的地方。请查收附件的PDF文件。
嗨Thanhtu131,
请问触发NMI的是哪个SDK功能?
谢谢,PM_Dialog
正如你在i2c bug pdf文件中看到的,触发NMI的SDK函数是WAIT_UNTIL_NO_MASTER_ACTIVEITY()(这是一个宏,用于检查涉及寄存器)。我想知道为什么如果我按下复位按钮(我做了一个适配器板有一个按钮连接到在DA14580 kit的RST引脚头),我可以运行和调试程序
嗨Thanhtu131,
在两个I2C api中调用WAIT_UNTIL_NO_MASTER_ACTIVITY(),并让应用程序等待,直到主程序不再有活动。
从附加的文件中,我假设导致NMI的WAIT_UNTIL_NO_MASTER_ACTIVITY()是由i2c_wait_until_eeprom_ready()调用的。
i2c_wait_until_eeprom_ready()函数将轮询I2C,直到I2C就绪。首先,这个函数发送一个虚拟值,它一直等待,直到Tx的FIFO为空。我强烈建议您探测您的引脚(SCL、SDA和RDY)并尝试读取一个地址。如果你试一试,我想问题会更清楚。
你可以省略,因为这可以导致你问题i2c_wait_until_eeprom_ready(),因为这是发送一个额外的字节I2C设备来检查你的设备是否准备好互动,但除了i2c_eeprom_read_byte()函数得到你I2C总线的数据表的设备描述。
谢谢,PM_Dialog
您好,非常感谢您的支持,我已经查明问题来自DS3231 PCB。更换另一个ds3231模块后,操作正常。
嗨Thanhtu131,
很高兴你弄明白了!
谢谢,PM_Dialog