DA14850作为SPI奴隶。主机在第三个字节上接收数据。

5个帖子/ 0新
最后一篇
RALF S.
离线
最后一次露面:4年2个月前
加入:2016-02-16 08:06
DA14850作为SPI奴隶。主机在第三个字节上接收数据。

哈洛,

我已将对话框设置为SPI从站,具有额外的流量控制线。当从站向主机发送数据时,主机在第三个字节上接收它们。除了重新启动电路板之后的第一个或两条消息,其中数据在第二个字节上从预期开始。我不使用FIFO缓冲区(SPI_FIFO_MODE = 0x03)。我不知道为什么会发生这种情况。调试表明,SPIDRV_BUFFER_TX保存像它应该执行的数据,而没有额外的零字节。有什么我缺少的东西吗?

SPI驱动程序如下所示:

void spi_handler_rxtx(void)
{
/ *表示TXrdy非活动到Master =从掌握到申请准备好之前没有进一步接收!* /
spidrv_txrdy_l;

/ *表示rxpend非活动到master =在申请准备好之前没有进一步传输到掌握!* /
spidrv_rxpend_l;

/ *锁定ISR使用的缓冲区* /
spidrv_cntrl.isr_lock = spidrv_cs_h_detectcnt;

/ *等到数据准备好* /
while(spi_data_rdy_getf())
{
/ * ----------------------------------------------------------------------- * /
/ * spi rx part - 读取收到的字节(如果可能的话)* /

/ *将此字节传输到我们的RX缓冲区(如果可能的话)* /
if(spidrv_cntrl.rx_wr_idx {
spidrv_buffer_rx [spidrv_cntrl.rx_wr_idx] = 0xff&getword16(spi_rx_tx_reg0);
spidrv_cntrl.rx_wr_idx ++;
}
别的
{/ *无关,表示溢出错误* /
spidrv_cntrl.rx_overflw ++;
}

/ * ----------------------------------------------------------------------- * /
/ * SPI TX部分 - 将一个待处理的字节从TX缓冲区传送到TX寄存器(如果有)* /
if(spidrv_cntrl.tx_rd_idx {
setword16(spi_rx_tx_reg0,0xff&(spidrv_buffer_tx [spidrv_cntrl.tx_rd_idx]));
spidrv_cntrl.tx_rd_idx ++;
}
别的
{/ * tx读取索引到达最后一个字节:完成!* /
setword16(spi_rx_tx_reg0,0x00);
}

/ *清除待处理标志* /
setword16(spi_clear_int_reg,0x01);
}

//清除IRQ(再次提出,如果待定的话)
setword16(spi_clear_int_reg,0x01);
}

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

嗨Ralf S,

如果使用的是一个高频率,而不使用的FIFO,中断命中在第一个8位传历程的结束(因为这是该数据已准备好被从SPI外围读出的时间),所以你有媒体链接丢失一个完整的周期,我假设最可能您将在从寄存器读取数据时丢失额外的完整周期,并将数据放置到您的TX缓冲区(您为ISR服务的时间)。因此,在第3次发送中,您的SPI TX寄存器具有已有所需的数据,并且将被传输。尝试缩短主机的SPI频率并检查问题是否持续或将延迟延迟到第一个SPI事务和后续的主机之间,以便为SPI TX寄存器有时间获得所需的值。

谢谢mt_dialog.

RALF S.
离线
最后一次露面:4年2个月前
加入:2016-02-16 08:06
谢谢回答!我试过了

谢谢回答!我试图降低主频率,但从奴隶的行为没有改变。对主人延迟延迟,你是什么意思?发送的字节之间的延迟?

你有猜测为什么从Slave在第二个字节上重置后发送第一帧,并且仅在第三个发射时只有以下传输?

RALF S.
离线
最后一次露面:4年2个月前
加入:2016-02-16 08:06
我现在工作了。当我

我现在工作了。当我完成发送消息和主站仍然发送字节时,我在TX寄存器中写了0x00。当我删除这一行时,一切正常,但在某些情况下,ISR被称为太晚,这导致我的框架中的零个字节。

我实现了RX-FIFO,我在发送数据时预加载它,因此主站是在第一个字节上接收数据,一切都正常工作。

但是现在我从外部中断唤醒时有一个不同的问题。因此,我会打开一个新的线程!

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

嗨Ralf S.

很高兴你找到了它,谢谢你让我们知道。对于未在同一帖子上发布新问题,也非常感谢您。

最好的问候mt_dialog.