DA14850作为SPI slave。主接收第三字节上的数据。

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

喂,

我已经将对话板设置为带有额外流控制线的SPI slave。当从服务器向主机发送数据时,主机在第三个字节接收数据。除了主板重新启动后的前一或两条消息,其中数据如预期的从第二个字节开始。我没有使用FIFO缓冲区(SPI_FIFO_MODE = 0x03)。我不知道为什么会这样。调试表明,spidrv_buffer_tx保存数据,就像它应该做的那样,没有额外的零字节。我还遗漏了什么吗?

SPI驱动程序是这样的:

空白SPI_Handler_RxTx(空白)

/*表示TXRDY INACTIVE to master =没有进一步的接收从master直到应用程序准备好!*/
SPIDRV_TXRDY_L;

/*表示RXPEND INACTIVE to master =没有进一步的传输到master直到应用程序准备好!*/
SPIDRV_RXPEND_L;

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

/*等待数据准备好*/
While (spi_data_rdy_getf())

/* -------------------------------------------------------------------------------- */
/* SPI RX PART - read received byte(如果可能的话)*/

/ /将这个字节转移到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 PART -从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读索引到达最后一个字节:全部完成!*/
SetWord16 (SPI_RX_TX_REG0 0 x00);

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

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

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

嗨,拉尔夫年代,

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

由于MT_dialog

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

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

你猜为什么奴隶发送第一个帧重置后的第二个字节,只有以下传输在第三个?

拉尔夫。
离线
最后看到:4年3个月前
加入:2016-02-16 08:06
我已经修好了。当我

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

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

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

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

嗨,拉尔夫。

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

MT_dialog问好