I2C通信流动保护(超时)

6个帖子/ 0新
最后一篇
Vadym.
离线
最后一次露面:6个月前1年
加入:2015-08-13 08:28
I2C通信流动保护(超时)

你好。

通过i2c通信,DA14580在Master角色,SDK 5.0.3中将DA14580连接到RTC设备PCF85263A。
我使用对话框官方I2C驱动程序,用于从“DA14580_PERIALEAL示例代码”的EEPROM,并且当外部设备(RTC)连接到总线时。
当rtc设备断开连接而不响应(没有ack),sw进入函数“i2c_wait_until_eeprom_ready”中的无限循环。

在i2c模块中有一些示例或hw解决方案,如超时或模块重启时的问题?

我认为这个问题是一样的http://support.dialog-semicondiondiondiondum/i2c-communication-eeprom-24lc08b.

谢谢,
Vadym。

设备:
mt_dialog.
离线
最后一次露面:6个月2周前
职员
加入:2015-06-08 11:34
嗨Vadym,

嗨Vadym,

请检查下面的职位,

http://support.dialog-semicondiondiondiondum/i2c-read-hangs-waitforreceivedbyte

谢谢mt_dialog.

Vadym.
离线
最后一次露面:6个月前1年
加入:2015-08-13 08:28
你好。

你好。

我考虑使用硬件定时器TMR0实现超时的选项以进行超时读数。
在功能“read_data_single”时,禁用所有中断时都有部分。当I2C从设备没有答案时,该程序在禁用中断时恰好等待。
如果我理解对,我将不会收到定时器中断回调,我需要通过轮询测试TMR?
如何获得TMR0的指示是重叠的或来自TMR0的任何标志?

我可以在哪里找到I2C和TMR0模块的API或详细描述?

谢谢,
Vadym。

mt_dialog.
离线
最后一次露面:6个月2周前
职员
加入:2015-06-08 11:34
嗨Vadym,

嗨Vadym,

是的,如果禁用中断,则会从计时器中获取中断,因此您可以通过读取计时器寄存器Timer0_On_reg的值来调查计时器,或者您可以使用NVIC_GETPENDINGIRQ(IRQN_TYPE IRQN)轮询挂起的中断,以便检查SWTIM_IRQN是否发生了,并在以等待另一个定时器中断之后清除中断。我认为后来更好。

谢谢mt_dialog.

Vadym.
离线
最后一次露面:6个月前1年
加入:2015-08-13 08:28
你好。

你好。

我尝试使用Timer0进行超时目的。
计时器以下一个方式初始化并启动:
void timeouttimer0_init(void)
{
timer0_stop();
timer0_register_callback(timer0_general_user_callback_function);
set_tmr_enable(clk_per_reg_tmr_enabled);
set_tmr_div(clk_per_reg_tmr_div_8);
timer0_set_pwm_high_counter(no_pwm);
timer0_set_pwm_low_counter(no_pwm);
timer0_init(tim0_clk_fast,pwm_mode_one,tim0_clk_div_by_10);
}
void timeouttimer0_start_10ms(void)
{
timer0_disable_irq();
timer0_set_pwm_on_counter(reload_10ms);// 2000.
timer0_start();
timer0_enable_irq();
}

我在非常少的时间内收到第一个中断(我不成功地衡量它)。在我在预期的时间(10msec)中断中断后。
只有在中断生成时才会从某些“重新加载值”中加载的定时器值(TIMER0_ON_REG)是否从中中断发生?
或者我的定时器设置序列是错误的吗?

谢谢!

mt_dialog.
离线
最后一次露面:6个月2周前
职员
加入:2015-06-08 11:34
嗨Vadym,

嗨Vadym,

您在Timer_on_reg中放置的值是重新加载定时器计数到零的值的值,我不会看到您的定时器的内容如何错误,尽管您可以查看如何在下面的SDK中使用定时器目录\ peripheral_examples \ timer0 \ timer0_general \。关于中断你在开始定时器之后几乎是监禁,是计时器的一部分,你无法避免它,只是忽略它。

谢谢mt_dialog.