10个职位/ 0
最后发表
mabraun
离线
最后看到:3年9个月前
加入:2015-11-16 15:57
SPI GTL死锁

你好,

我操作一个DA14580外部处理器的配置。这是由加州大学(SPI主)使用GTL几十种SPI协议。我不停地跑进死锁的问题。当流媒体数据在祝福(因此很多加州大学和DA)之间的交通,我遇到一个州DA和加州大学想同时传输。更具体地说,DA卡住的spi_hci_write_func ()函数。它所信号高并等待一个SPI驱动传输(spi_wait_for_transfer ()):


spi_dready_high ();/ /维护所请求传输
{做
spi_wait_for_transfer ();/ /等待SPI事务从SPI主设备


然而,加州大学试图在同一时间发送消息和卡住spi_send_hci_msg ()所信号功能,等待去低:


/ /禁用所打断
dready_irq_disable ();
/ /轮询所检测,如果数据被接收
而(dready_get_status ());

以下情况:
——加州大学禁用所打断,就在DA断言所信号。
——所信号是高,但没有中断触发加州大学。
——相反,加州大学所信号去等待低。
——所信号不会低,由于DA是等待一个SPI传播。
- - >死锁

我想知道协议打算如何避免遇到上述僵局。从样子没有机制,防止这种情况。

谢谢!
mabraun

编辑:试图使问题更全面的描述

关键词:
MT_dialog
离线
最后看到:6个月1天前
工作人员
加入:2015-06-08 34
嗨mabraun,

嗨mabraun,

有一个序列通过SPI总线传输数据信号和数据交换的设备不仅所为了防止这种情况,还有flow_on flow_off数据前应交换两个设备可以通过SPI总线传输数据。你可以看看嗯- b - 013为了检查详细的协议。有一个特定的程序主人跟奴隶之前,反之亦然为了避免这种僵局,主传输之前应该检查如果奴隶可用(如果从奴隶是一个流的最后一条消息发送字节)之前调用spi_send_hci_msg()和禁用中断。

由于MT_dialog

mabraun
离线
最后看到:3年9个月前
加入:2015-11-16 15:57
嗨MT_dialog,

嗨MT_dialog,

谢谢你的回复。我深知flow_on / flow_off原则,我已经仔细阅读嗯- b - 013。值得澄清的是,我用了接近记者从SDK5示例中提供的源代码(主机和DA),这就是为什么流控制机制是(或应该是)正确实施。我的问题是不相关的流控制机制,甚至在部分6.2.3嗯- b - 013:

防止事件的同时传输两个主人和奴隶(即主
发送0 x05开始字节开始消息的传输和奴隶在同一时间
发送一个随后发送另一个消息流从字节)
,主必须承认
所请求的奴隶。

高亮显示的例子正是我经历的问题:主人想要发送消息(0 x05),奴隶想发送流字节。它仍在继续:

为此,当主检测所是活跃的,它发送一个
确认字节(ACK,选择()通知奴隶,可以继续发送
流字节(或其他数据)。这个功能是如图3所示。在任何所上升的边缘,
主人必须承认它检测到它,并使奴隶设备发送数据。如果
主所上升的边缘,不承认奴隶等到芯片选择线
不活跃(表明主完成发送消息),激活所
了,等待确认继续传输。

然而,上述行为(粗体显示)似乎并不在DA端实现的(见spi_hci.c):

bool spi_hci_flow_off_func(空白)
{
uint8_t tmp;
/ /首先检查如果没有正在进行的传输
如果((spi_cs_getf () = = 0))
{
返回错误;
}
NVIC_DisableIRQ (SPI_IRQn);/ /禁用SPI中断CPU
spi_dready_high ();/ /维护所请求传输
{做
spi_wait_for_transfer ();/ /等待SPI事务从SPI主设备
tmp = spi_rxtxreg_read ();/ /从SPI得到字节
}(tmp ! = DREADY_ACK);/ /如果所不承认,再试一次
[…]
}

上面的代码首先检查如果传输正在进行,然后它声称所行,然后它等待一个无限期SPI转让(或DREADY_ACK字节)。这种行为不符合:

如果主人不承认所上升的边缘,奴隶等到芯片选择线是不活跃的(表明主完成发送消息),再次激活所,等待确认继续传输。

让我们看看加州大学(主持人):部分6.2.3也指出

所上升的边缘,在任何主必须承认它检测到它,并使奴隶设备发送数据。

spi_hci_msg的代码。c是这样的:

空白spi_send_hci_msg (uint16_t大小,uint8_t * msg_ptr)
{
uint16_t我;
/ /禁用所打断
NVIC_DisableIRQ (GPIO0_IRQn);
/ /轮询所检测,如果数据被接收
而(GPIO_GetPinStatus (SPI_GPIO_PORT SPI_DREADY_PIN));
spi_cs_high ();/ /关闭计算机
spi_cs_low ();/ /打开计算机
spi_access (0 x05);
[…]
}

的代码第一个禁用所打断,然后这对所调查,然后它把SPI芯片选择线低。如果所高后中断禁用,加州大学将无限期地等待所所硬中断请求优先级别再低,请求将不会提供服务。同时,CS行不防止这种情况的发生,因为它是拉低处于待发状态后,所中断。

在这里我丢失的东西吗?

对不起,长文章,但我想确认我理解正确。

干杯!

MT_dialog
离线
最后看到:6个月1天前
工作人员
加入:2015-06-08 34
嗨mabraun,

嗨mabraun,

请原谅我如果我错了,你已经注意到,当有一个正在进行的事务从主,所以奴隶发送流量,和主发送(为了承认它的存在,所以主人准备发送数据和禁用IRQ immidiatelly奴隶问题后flow_off为了发送数据,所以所销得到高当时CS是禁用的(高所以躲避的CS检查spi_cs_getf()函数)所以来被高主卡在轮询程序和奴隶阻塞、等待(永远不会从主来的消息。

你经历过这种问题在您的应用程序,如果你做了,你有捕获的SPI事务?

由于MT_dialog

mabraun
离线
最后看到:3年9个月前
加入:2015-11-16 15:57
嗨MT_dialog,

嗨MT_dialog,

是的,你找到了正确的做法。在附上的图片,你会发现4的信号:
1。SPI CLK(黄色)
2。SPI味噌(蓝色)
3所示。SPI CS(粉色)
4所示。所(绿色)
我的范围只有4通道,所以我不能抓住莫西人。

一开始的截图可以看到flow_off交流:2 SPI字节,包含DREADY_ACK FLOW_ON字节。之后,主发起传输(注意CS直线低而所不活跃)。(成功的)传播之后,奴隶断言所信号(因为它想发出一个flow_off消息),以及主想传达一个信息,把CS线低。(为更好地可视化我搬spi_cs_low ()代码行之前而(dready_get_status ());。否则你不会看到CS线被拉低。)注意所和CS都断言所高)(CS低,几乎在同一时间,但没有后续SPI通信是可见的。这是当死锁发生。

谢谢你的帮助!
mabraun

附件:
MT_dialog
离线
最后看到:6个月1天前
工作人员
加入:2015-06-08 34
嗨mabraun,

嗨mabraun,

我检查与支持团队,他们能告诉我,这种情况可能会发生,没有超时或任何其他机制,防止580发送命令而主机就开始发送数据流僵局似乎可以发生,很少但它的可能。因为我们从来没有ecountered这种问题,在操作SPI你能确保这个僵局是肯定的原因拖延你的系统,你能提供一个更完整的捕捉你的信号,为了确保0 x05离开宿主(莫西人信号)或如果你能调试,你确认这就是代码困在双方(spi_send_hci_msg()和spi_hci_flow_of_func ()) ?

由于MT_dialog

mabraun
离线
最后看到:3年9个月前
加入:2015-11-16 15:57
嗨MT_dialog,

嗨MT_dialog,

谢谢你的回复。在我目前的设置我能调试双方,这就是为什么我知道双方确实是困在spi_send_hci_msg()和spi_hci_flow_off_func ()。

我附上4更多的屏幕截图。我捕获了所有5个信号线路(所有显示在紫色),按照以下顺序:时钟,莫西人,味噌,CS,所。此外,我使用一个协议分析器解释莫西人和味噌,蓝色的屏幕截图所示。公共汽车1对应于莫西人,Bus2味噌。

1. png:总体视图序列导致死锁问题。

2. png:猪肉的放大视图序列。所高,主承认它(0()和从发送FlowOn字节(0 x06)。

3. png:放大视图的第一个字节发送的主人,这消息(0 x05)的开始。

4. png:放大视图发送的消息的结束主拉高(CS)。之后,发生死锁:奴隶想发送FlowOff(通过断言所)开始,主人想要发送下一条消息。请注意:在与我以前的帖子,我做到了移动spi_cs_low ()代码行之前而(dready_get_status ()),这就是为什么你不能看到CS线被拉低。这是原始代码的行为。然而,问题仍然是相同的:主是困在spi_send_hci_msg(),等待所信号低。奴隶是困在spi_hci_flow_off_func(),等待一个SPI转移。

请让我知道如果你需要任何额外的信息。

谢谢你的帮助,
mabraun

mabraun
离线
最后看到:3年9个月前
加入:2015-11-16 15:57
任何更新吗?你会

任何更新吗?你能提供一个固定的几十种实现SPI协议吗?

谢谢,
mabraun

MT_dialog
离线
最后看到:6个月1天前
工作人员
加入:2015-06-08 34
嗨mabraun,

嗨mabraun,

当时的问题是提出变更请求,到目前为止,我们有一个可能的解决方案,以克服这个僵局,但要花一些时间来对其进行测试和评估任何问题或限制。我将会有更多的在这星期或下星期,我将让你知道。

我们很抱歉给您带来不便。

由于MT_dialog

mabraun
离线
最后看到:3年9个月前
加入:2015-11-16 15:57
嗨MT_dialog,

嗨MT_dialog,

谢谢你的更新,这是好消息。请与我保持联络。

问候,
mabraun