哈洛,
我已将对话框设置为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);
}
嗨Ralf S,
如果使用的是一个高频率,而不使用的FIFO,中断命中在第一个8位传历程的结束(因为这是该数据已准备好被从SPI外围读出的时间),所以你有媒体链接丢失一个完整的周期,我假设最可能您将在从寄存器读取数据时丢失额外的完整周期,并将数据放置到您的TX缓冲区(您为ISR服务的时间)。因此,在第3次发送中,您的SPI TX寄存器具有已有所需的数据,并且将被传输。尝试缩短主机的SPI频率并检查问题是否持续或将延迟延迟到第一个SPI事务和后续的主机之间,以便为SPI TX寄存器有时间获得所需的值。
谢谢mt_dialog.
谢谢回答!我试图降低主频率,但从奴隶的行为没有改变。对主人延迟延迟,你是什么意思?发送的字节之间的延迟?
你有猜测为什么从Slave在第二个字节上重置后发送第一帧,并且仅在第三个发射时只有以下传输?
我现在工作了。当我完成发送消息和主站仍然发送字节时,我在TX寄存器中写了0x00。当我删除这一行时,一切正常,但在某些情况下,ISR被称为太晚,这导致我的框架中的零个字节。
我实现了RX-FIFO,我在发送数据时预加载它,因此主站是在第一个字节上接收数据,一切都正常工作。
但是现在我从外部中断唤醒时有一个不同的问题。因此,我会打开一个新的线程!
嗨Ralf S.
很高兴你找到了它,谢谢你让我们知道。对于未在同一帖子上发布新问题,也非常感谢您。
最好的问候mt_dialog.