i2c奇怪的错误

⚠️
大家好. .谢谢你来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台,它将提供更好的功能,包含在主对话网站中。所有岗位和账户都已迁移。我们现在只接受新论坛的流量-请在上面发布任何新帖子//www.xmece.com/support.我们将在未来几天修复bug /优化搜索和标记。
10个帖子/ 0个新
最后发表
Thanhtu131
离线
最后看到:5个月,3个星期前
加入:2018-09-18 17:44
i2c奇怪的错误

你好,我正面临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

我花了两天的时间也找不到原因。请帮助我!

期待早日收到您的来信。

谢谢!

附件:
设备:
PM_Dialog
离线
最后看到:2天14小时前
工作人员
加入:2018-02-08 11:03
嗨Thanhtu131,

嗨Thanhtu131,

我建议先检查一下教程8:调试方法以便开始调试应用程序代码。你能找出触发NMI的代码是什么意思吗?

所以,如果我理解正确的话,它在非BLE项目上工作,但它不在BLE项目上工作。

你是否在使用任何一种可用的睡眠模式?

谢谢,PM_Dialog

Thanhtu131
离线
最后看到:5个月,3个星期前
加入:2018-09-18 17:44
嗨,你理解错了

嗨,你理解错了。我可以在BLE和非BLE的例子中正常读取eeprom。但是在非ble示例中,我只能从ds3231读取时间。在BLE睡眠模式示例中,如果我将地址从0x50(eeprom)更改为0x68(ds3231),就会触发NMI。默认的睡眠模式是深度睡眠模式。事情变得更神秘的:我要求董事会与RST按钮连接到RST销DA14580基本装备,如果我按,RST按钮,我可以运行代码并读取数据从ds3231和我要做的,每次我调试程序。

PM_Dialog
离线
最后看到:2天14小时前
工作人员
加入:2018-02-08 11:03
嗨Thanhtu131,

嗨Thanhtu131,

>>>如果我把地址从0x50(eeprom)改为0x68(ds3231),就会触发NMI。

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

请在调试模式下运行它,在read函数中添加一个断点,然后进入代码,这样您就可以发现哪里出错了。

谢谢,PM_Dialog

Thanhtu131
离线
最后看到:5个月,3个星期前
加入:2018-09-18 17:44
你好,我已经跟踪了

嗨,我遵循了建议的教程。DA14580的i2c_eepeom库驱动出现硬件故障。另外,当硬件故障发生时,没有东西被记录。如果我发现的代码行触发了NMI,则必须在串行监视器中记录一些东西。我不知道在什么地方放断点。请查收附件中的PDF文件。

附件:
PM_Dialog
离线
最后看到:2天14小时前
工作人员
加入:2018-02-08 11:03
嗨Thanhtu131,

嗨Thanhtu131,

请问触发NMI的SDK功能是哪个?

谢谢,PM_Dialog

Thanhtu131
离线
最后看到:5个月,3个星期前
加入:2018-09-18 17:44
正如您在i2c bug中看到的那样

正如您在i2c bug pdf文件中所看到的,触发NMI的SDK函数是WAIT_UNTIL_NO_MASTER_ACTIVEITY()(这是一个检查涉及寄存器的宏)。我想知道为什么如果我按下复位按钮(我做了一个适配器板,它有一个按钮连接到DA14580套件的RST引脚头),我可以运行和调试程序

PM_Dialog
离线
最后看到:2天14小时前
工作人员
加入:2018-02-08 11:03
嗨Thanhtu131,

嗨Thanhtu131,

WAIT_UNTIL_NO_MASTER_ACTIVITY()在两个I2C api中被调用,并让应用程序等待,直到Master不再有活动。

从附加的文件中,我假设i2c_wait_until_no_master_activity()是由i2c_wait_until_eeprom_ready()调用的,它导致NMI。

i2c_wait_until_eeprom_ready()函数进行轮询,直到I2C就绪。首先,这个函数发送一个虚拟值,并等待Tx的FIFO为空。我强烈建议您探查您的引脚(SCL、SDA和RDY)并尝试读取地址。如果你试着这样做,我想问题会更清楚。

你可以省略,因为这可以导致你问题i2c_wait_until_eeprom_ready(),因为这是发送一个额外的字节I2C设备来检查你的设备是否准备好互动,但除了i2c_eeprom_read_byte()函数得到你I2C总线的数据表的设备描述。

谢谢,PM_Dialog

Thanhtu131
离线
最后看到:5个月,3个星期前
加入:2018-09-18 17:44
嗨,非常感谢你的

您好,非常感谢您的支持,我已经了解到问题来自DS3231 PCB。更换另一个ds3231模块后,操作正常。

PM_Dialog
离线
最后看到:2天14小时前
工作人员
加入:2018-02-08 11:03
嗨Thanhtu131,

嗨Thanhtu131,

很高兴你弄明白了!

谢谢,PM_Dialog