我做一个这样的实验。
使用看门狗重新启动系统,
然后I2C有时不起作用,
例子
void i2c_write_byte(uint8_t wr_data)
{
等待_while_i2c_fifo_is_full();//等待i2c tx fifo已满
send_i2c_command(wr_data&0xff);//发送写入数据
wait_until_i2c_fifo_is_empty();//等到TX FIFO是空的
wait_until_no_master_actity();//等到没有主活动
}
我想发送一个字节,但它在等待_until_i2c_fifo_is_empty()等待,
FIFO不能为空,我检查i2c_status_reg值,值仍为0x2,
如果我强行和芯片,它会很好地运行。
如何解决这个问题。

嗨Lizhuobin,
对不起,我可能错过了这一点,你说手表狗不起作用吗?
布尔
wt_dialog.
嗨wt_dialog,
看狗工作,
但有时,在手表狗重新启动后,I2C不起作用。
此致,
嗨wt_dialog,
我还在SDK 5.0.4中有类似的问题:
我通过I2C将DA14580接口到温度传感器。基于该示例
filipheral_examples \ i2c \ i2c_eeprom
我可以从/向传感器读取/写温度。但如果我将它移植到榜样中
ble_examples \ ble_app_perifal.
然后它陷入了等待_until_i2c_fifo_is_empty(),然后进入nmi_handlerc(),指示看门狗被激活。
我在文件custs1_task.c中执行I2C初始化
custs1_create_db_req_handler()
{
......
if(status == att_err_no_error)
{
i2c_eeprom_init(i2c_slave_address,i2c_speed_mode,i2c_address_mode,i2c_address_size);
}
......
}
我在App_on_system_powered的回调函数中执行I2C R / W:
i2c_error_code code = i2c_eeprom_write_byte(32,2);
......
为什么它在I2C EEPROM中工作很好,但不在外围示例中?在I2C EEPROM示例中,我只是将初始化呼叫放在其中(1)循环中
如果您可以尽快帮助我,这将是很好的,因为下周我应该向客户展示我的外围应用程序。谢谢
muxf.
嗨muxf,
我建议在创建数据库时进行I2C模块的初始化,但是每当您想要与数据或User_App_Init接口时,虽然这无影响您遇到的行为。你陷入了#define的事实意味着您的FIFO具有数据,程序等待,直到发送数据根本不发送数据(I2C设备也不准备某种原因,并且不会ack数据发送到580)或看门狗在FIFO中的所有数据都发送之前命中。您可以尝试通过拒绝da1458x_config_basic.h中的cfg_wdog来禁用看门狗,或者尝试通过将lookdog_default_period更改为更大的值来增加看门狗的时间段。如果您的代码困扰着,而永远意味着与温度设备通信有问题。或许在外围示例中,代码探测器在发送实际数据之前重复温度传感器,但由于没有看门狗实现,类似于外围示例的东西不会影响外围示例。
谢谢mt_dialog.
嗨mt_dialog,
非常感谢您的支持。它现在有效。
我试图禁用WDOG,但结果相同。你是对的,它必须是错误的沟通。然后,我将BLE_PERITERAL与EEPROM示例行按行进行比较,并在BLE_PERITIELAL示例中找出,I2C没有端口和引脚预留和定义!对不起,我是对话框的新人,所以我不熟悉对话软件架构。我想在外围示例中考虑所有外围设备都应该已经定义。
然后,我为I2C添加此类预留和定义,但不会对结果进行任何更改。应用程序始终进入NMI_Handlerc()。而且我也有有时它适用于相当短的时间间隔。为此,我决定再次检查我的硬件。然后,我将我的传感器重新定位到对话框14580,并尽可能短地制作SCL和SDA电缆。最后它也有效地在BLE_PERITIELAL示例中,我获得了从传感器传送的稳定传感器数据!
我的经验是,对于等待_whille_i2c_fifo_is_full()的困难,应该首先检查
1.端口预订和定义
2.传感器和DA14580之间的硬件连接
再次感谢。
muxf.