DA14850作为SPI从端。主机接收第三字节的数据。

5个职位/ 0个新职位
最后发表
拉尔夫。
离线
最后看到:4年5个月前
加入:2016-02-16 08:06
DA14850作为SPI从端。主机接收第三字节的数据。

喂,

我已经设置对话板作为SPI从属与额外的流量控制线。当从服务器向主服务器发送数据时,主服务器在第三个字节接收数据。除了第一个或两个消息后,重新启动板,其中的数据开始在第二个字节,如预期。我没有使用FIFO缓冲区(SPI_FIFO_MODE = 0x03)。我不知道为什么会这样。调试显示,spidrv_buffer_tx保存数据的方式与预期的一样,没有额外的零字节。我是不是漏掉了什么?

SPI驱动程序如下所示:

空白SPI_Handler_RxTx(空白)
{
/*表示TXRDY未激活到master =在应用程序准备好之前没有收到来自master的进一步接收!*/
SPIDRV_TXRDY_L;

/*表示RXPEND未激活到master =没有进一步传输到master,直到应用程序准备好!*/
SPIDRV_RXPEND_L;

/*为ISR的使用锁定缓冲区*/
spidrv_cntrl。isr_lock = SPIDRV_CS_H_DETECTCNT;

/*等待数据准备好*/
While (spi_data_rdy_getf())
{
/* -------------------------------------------------------------------------------- */
/* SPI RX部分-读取接收字节(如果可能)*/

/*将这个字节转移到rx缓冲区(如果可能的话)*/
如果(spidrv_cntrl。rx_wr_idx < SPIDRV_BUFFSIZE_RX)
{
spidrv_buffer_rx [spidrv_cntrl。rx_wr_idx] = 0 xff&getword16 (SPI_RX_TX_REG0);
spidrv_cntrl.rx_wr_idx + +;

其他的
{/*什么也不做,表示溢出错误*/
spidrv_cntrl.rx_overflw + +;

/* -------------------------------------------------------------------------------- */
/* SPI TX部分-从TX缓冲区转移一个挂起的字节到TX寄存器(如果有的话)*/
如果(spidrv_cntrl。tx_rd_idx < spidrv_cntrl。tx_cnt)
{
SetWord16 (SPI_RX_TX_REG0 0 xff (spidrv_buffer_tx [spidrv_cntrl.tx_rd_idx]));
spidrv_cntrl.tx_rd_idx + +;

其他的
{/* tx read index reached last byte: all done!*/
SetWord16 (SPI_RX_TX_REG0 0 x00);

/*清除挂起标志*/
SetWord16 (SPI_CLEAR_INT_REG 0 x01);

//清除IRQ
SetWord16 (SPI_CLEAR_INT_REG 0 x01);

设备:
MT_dialog
离线
最后看到:6个月3天前
工作人员
加入:2015-06-08 34
嗨,拉尔夫年代,

嗨,拉尔夫年代,

如果您正在使用一个高频而不使用fifo,中断在第一个8位传输的末尾(因为这是数据准备从SPI外设读取的时间),所以您已经失去了一个完整的周期,我假设,当从寄存器读取数据并将数据放置到你的TX缓冲区(你花在ISR服务上的时间)时,你很可能会失去一个额外的完整周期。所以在第三次传输你的SPI TX寄存器有所需的数据已经在,并将被传输。尝试减少主处理器的SPI频率,并检查问题是否持续存在,或者在第一个SPI事务和后续事务之间对主处理器施加延迟,以便SPI TX寄存器有时间获得所需的值。

由于MT_dialog

拉尔夫。
离线
最后看到:4年5个月前
加入:2016-02-16 08:06
谢谢回答!我试着

谢谢回答!我试着降低主机的频率,但是从机的行为没有改变。你说让主人耽搁是什么意思?发送的字节之间的延迟?

你能猜到为什么奴隶在第二个字节上重置后发送第一帧而在第三个字节上只发送随后的传输吗?

拉尔夫。
离线
最后看到:4年5个月前
加入:2016-02-16 08:06
我现在把它修好了。当我

我现在把它修好了。当我完成发送消息和主发送字节,我写0x00在TX寄存器。当我删除这一行时,一切正常,但在某些情况下,ISR调用得太晚了,这导致我的帧中出现零字节。

我实现了RX-FIFO和我预加载它时,我发送数据,所以主接收数据上的第一个字节,一切工作正常。

但现在,当我从外部干扰中醒来时,我有一个不同的问题。因此,我将打开一个新的线程!

MT_dialog
离线
最后看到:6个月3天前
工作人员
加入:2015-06-08 34
嗨,拉尔夫。

嗨,拉尔夫。

很高兴你找到了,谢谢你告诉我们。也非常感谢你没有在同一个帖子上发布你的新问题。

MT_dialog问好