你好,我正面临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——>运行时,ide跳转到文件nmi_handler.c并卡住在第63行。我的PDF文件里有一些图片。
62 if ((SYS_STAT_REG == 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套件的RST引脚头),我可以运行和调试程序
嗨Thanhtu131,
等待_until_no_master_actity()在几个I2C API中调用,并让应用程序等待,直到主设备不再活动。
从附加的文件中,我假设导致NMI的等待_until_no_master_actity()由i2c_wait_until_eeprom_ready()调用。
i2c_wait_until_eeprom_ready()函数进行轮询,直到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