i2c采用者永远阻止

⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在迁至我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程https://www.dialog-seminile.com/support.。我们将在未来几天修复错误/优化搜索和标记。
7个帖子/ 0新
最后一篇
单自然打击
离线
最后一次露面:2个月1周前
加入:2015-10-26 13:43
i2c采用者永远阻止

我正在尝试获得I2C适配器工作,但由于某种原因,当我调用AD_I2C_WRITE_READ()时它是永恒阻止的。

对于上下文,我以以下方式使用适配器:
- There is a task which has the sole function of processing I2C transactions.
- 任务有一个待处理事务的Freertos队列。
- 任务从队列中获取下一个事务(如果为空的块),然后执行
同步交易。
- 当交易完成后,任务向交易的始发任务发送信号。
- No other task uses the I2C peripheral.

这种设计很简单,意味着所有其他线程都可以使用I2C
阻止。这与我在其他处理器上实现了I2C驱动程序的方式匹配,它有效
very well.

任务看起来像这样(它是C ++类的一部分):

void i2cmasterdriver :: task_func_impl()
{
//初始化I2C设备。
ad_i2c_init();

// Possibly have a break or pause condition.
while (true)
{
// This will block if there is nothing in the queue.
m_queue.receive(m_trans);

//呼叫者可以将指向数据缓冲区(对于较大的块)传递。
//如果null,我们将此指向自己的缓冲区。注意:此时执行此项
//由于该结构被值复制,并且可能会有任何其他指针
//无效。
if(m_trans.data == nullptr)
{
m_trans.data =&m_trans.buffer [0];
}

//打开我们要与之交谈的I2C从设备。这是最奇怪的建筑
//我还看过管理奴隶。
i2c_device device = ad_i2c_open(nfc_chip);

//这是一个阻止呼叫。
int ret_code = ad_i2c_write_read(
设备,
(m_trans.tx_length > 0) ? &m_trans.data[0] : nullptr,
m_trans.tx_length,
(m_trans.rx_length> 0)?&m_trans.data [m_trans.tx_length]:nullptr,
m_trans.rx_length,
hw_i2c_f_add_stop);

//我们将返回值 - 通过调度程序 - 因此恢复数据指针
//表示我们使用了自己的缓冲区或外部缓冲区。
if(m_trans.data ==&m_trans.buffer [0])
{
m_trans.data = nullptr;
}

//让客户知道我们都完成了。
m_on_complete.emit(m_trans);

//关闭设备以准备下一个事务。
ad_i2c_close(设备);
}
}

我的配置中包含以下行:

#define dg_configuse_hw_i2c(1)
#define dg_configi2c_adapter(1)

以下行包含在periph_init中:

hw_gpio_configure_pin(hw_gpio_port_0,hw_gpio_pin_0,hw_gpio_mode_output,hw_gpio_func_i2c_scl,true);
hw_gpio_configure_pin(hw_gpio_port_0,hw_gpio_pin_1,hw_gpio_mode_output,hw_gpio_func_i2c_sda,true);

以下行包含在platform_devices.h中:

I2C_BUS(I2C1)
i2c_slave_device_dma(i2c1,nfc_chip,0x28,hw_i2c_addressing_7b,hw_i2c_speed_standard,0)
I2C_BUS_END.

This issue is that the call to ad_i2c_write_read() blocks and never returns. If I comment this
line out so that the queued transactions are just thrown away, the task works exactly as expected.
我可能错过了哪些其他设置,宏或选项?由于只有一个任务使用I2C,也许我应该使用低级驱动程序......

事情发生的方式,我想我宁愿只写下自己的裸金属司机。有哪些例子可用吗?

Thanks.

设备:
单自然打击
离线
最后一次露面:2个月1周前
加入:2015-10-26 13:43
似乎我需要

在开始交易之前,我似乎需要获得公共汽车 - 这就是外围设备本身的原因并启用中断。所以它现在没有阻止。然而....

没有什么在电线上出来。没有附加设备,但我至少应该看到地址。

Thanks.

单自然打击
离线
最后一次露面:2个月1周前
加入:2015-10-26 13:43
啊!回答了我自己的问题。

啊!回答了我自己的问题。如果您使引脚输出打开漏极并将设备放在总线上以拉动线路,则会有很多帮助。

Thanks.

PM_DIALOG.
离线
最后一次露面:14小时6分钟前
职员
加入:2018-02-08 11:03
嗨单自然克里克,

嗨单自然克里克,

我强烈建议你看看I2C Adapter Concept (HTML)from our support page of DA14680. This tutorial explains I2C adapters and how to configure the DA1468x as an I2C Master device. The adapters are not implemented as separate tasks and should be considered as an additional layer between the application and the LLDs. It is recommended to use adapters for accessing a hardware block.

谢谢,PM_DIALOG.

单自然打击
离线
最后一次露面:2个月1周前
加入:2015-10-26 13:43
谢谢,但我已经

谢谢你,但我已经做了这一切。我下stand the I2C Adapter Concept. Unfortunately, I don't think the design is ideal. This is why I have created a thread to serialise calls to ad_i2c_write_read() without stalling any other threads in the application. It works very well now, and is a better fit for my event driven application framework.

我有一个跟进问题:如果我要使用两个I2C外围设备,它似乎是适配器会阻止它们上的并发事务。真的吗?

Thanks.

PM_DIALOG.
离线
最后一次露面:14小时6分钟前
职员
加入:2018-02-08 11:03
嗨单自然克里克,

嗨单自然克里克,

是的,这是真的!适配器将防止并行交易。

谢谢,PM_DIALOG.

单自然打击
离线
最后一次露面:2个月1周前
加入:2015-10-26 13:43
唔。谢谢你让我

唔。谢谢你让我知道。这对我来说看起来非常糟糕。