嗨,我面临着I2C器件非常奇怪的错误。我使用的EEPROM AT24C02和实时计数器DS3231。由于它们具有相同的I2C配置(ADRESS模式,字ADDRES大小),我没有下发展库DS3231。我试图读取AT24C02和DS3231 7个字节。在I2C EEPROM示例(非BLE)我可以成功地读取。但在ble_sleepmode例如,在回调函数user_app_init(),我把一些代码行以读取从AT24C02和DS3231 7个字节。>调试 - - >运行,在IDE跳转到文件nmi_handler.c和被困在线路63我有一些捕捉我可以从AT24C02(地址为0x50)。当我的地址更改为DS3231地址(0x68)中读7个字节在PDF文件中。
62如果((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模式。事情变得更加神秘:我做了adpter板与连接到DA14580基本套件中的RST引脚RST按钮,如果我按那个RST按钮,我可以运行的代码,并读取DS3231的数据,我所要做的,每次我调试程序。
嗨Thanhtu131,
>>>如果我的地址从为0x50(EEPROM)更改为0x68(DS3231),东西触发NMI。
你将不得不开始调试项目。这就是为什么我以前的答案是跟随建议的教程。
请在调试模式下运行它,添加断点到读取功能,并进入代码,这样你可以找到越来越错误。
谢谢,PM_DIALOG.
嗨,我按照建议的教程。而发生在这DA14580的i2c_eepeom库驱动程序就行了hardfault。除此之外,当hardfault发生,而不是事情已经日志。如果该行代码,我发现触发器NMI,一定有东西在日志中sereial监视器。我不精把破发点的地方。请检查武官PDF文件。
嗨Thanhtu131,
你能请注明这是SDK函数,触发器NMI?
谢谢,PM_DIALOG.
正如你可以在I2C错误pdf文件看,这会触发NMI的SDK函数是WAIT_UNTIL_NO_MASTER_ACTIVEITY()(这是检查是否有涉及寄存器宏)。我不知道为什么如果我按下复位按钮(I制成,其具有连接到在DA14580试剂盒中的RST销头的按钮的适配器板)中,i可以运行和调试程序
嗨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就绪。首先,该函数将一个虚拟的值,它是等待,直到Tx的FIFO是空的。我强烈建议你探测的引脚(SCL,SDA和RDY),并尝试读取的地址。如果您尝试,我认为,这将是更加清晰的问题可能是什么。
你可以忽略,因为这可以使你发出的是i2c_wait_until_eeprom_ready(),因为这是为了检查,如果您的设备已准备好进行交互发送一个额外的字节到I2C器件,但比i2c_eeprom_read_byte()函数,你等让你什么I2C器件的数据表描述了总线上。
谢谢,PM_DIALOG.
您好,非常感谢您的支持,我已经查明问题来自DS3231 PCB。更换另一个ds3231模块后,操作正常。
嗨Thanhtu131,
很高兴你理解了它!
谢谢,PM_DIALOG.