i2c奇怪的错误
DA14580
7个月前
i2c奇怪的错误
发布的thanhtu131.0点 9回复嗨,我面临一个非常奇怪的错误与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
{
我花了两天的时间,但是我找不到原因。请帮助我!
我期待着很快收到你的来信。
谢谢!
附件 | 大小 |
---|---|
结果文件 | 1.31 MB |
7个月前
嗨,你理解错了。在BLE和非BLE的例子中,我可以正常读取eeprom。但是我只能在非ble示例中从ds3231读取时间。在BLE睡眠模式的例子中,如果我将地址从0x50(eeprom)更改为0x68(ds3231),就会触发NMI。默认休眠模式为深度休眠模式。事情变得更神秘的:我要求董事会与RST按钮连接到RST销DA14580基本装备,如果我按,RST按钮,我可以运行代码并读取数据从ds3231和我要做的,每次我调试程序。
7个月前
嗨Thanhtu131,
>>>如果我将地址从0x50(eeprom)更改为0x68(ds3231),会触发NMI。
您将不得不开始调试您的项目。这就是为什么我之前的回答是遵循建议的教程。
请在调试模式下运行它,在read函数中添加一个断点,然后进入代码,这样您就可以发现哪里出错了。
谢谢,PM_Dialog
7个月前
你好,我已经遵循了建议的教程。DA14580的i2c_eepeom库驱动行出现硬故障。此外,当硬故障发生时,没有东西被记录。如果我找到的代码行触发了NMI,那么串行监视器中必须记录一些东西。我找不到放断点的地方。请查收附件的PDF文件。
附件 | 大小 |
---|---|
i2c bug.pdf | 374.77 KB |
6个月前
嗨Thanhtu131,
在两个I2C api中调用WAIT_UNTIL_NO_MASTER_ACTIVITY(),并让应用程序等待,直到主程序不再有活动。
从附加的文件中,我假设导致NMI的等待_until_no_master_actity()由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
7个月前
嗨Thanhtu131,
我建议先检查一下教程8:调试方法以便开始调试应用程序代码。你能找出触发NMI的代码点是什么吗?
所以,如果我理解正确的话,它在非BLE项目中工作,但不在BLE项目中工作。
你有使用任何一种可用的睡眠模式吗?
谢谢,PM_Dialog