关于Cy_SCB_SPI_ClearTxFifo()和Cy_SCB_SPI_Transfer()使用问题

公告

大中华汽车电子生态圈社区并入开发者社区- 更多资讯点击此

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
叶凡
Level 1
Level 1
First solution authored 5 replies posted 10 sign-ins

各位社区朋友们好

我使用的是mcu型号是cyt2b75,关于Cy_SCB_SPI_ClearTxFifo()和Cy_SCB_SPI_Transfer()有问题。

1、Cy_SCB_SPI_ClearTxFifo():我使用它清除SPI TX FIFO中的数据,后面存入的数据跟发送出去的不对应,全为7ffff,下面是它注释,按它描述的清除的发送1代替,但我后面存入的数据它怎么也以1发送啊?

\sideeffect
* The TX FIFO clear operation also clears the shift register, so that
* the shifter could be cleared in the middle of a data element transfer,
* corrupting it. The data element corruption means that all bits which has
* not been transmitted are transmitted as 1s on the bus.

 

2、Cy_SCB_SPI_Transfer():函数原型为cy_en_scb_spi_status_t Cy_SCB_SPI_Transfer(volatile stc_SCB_t *base, void *txBuf, void *rxBuf, uint32_t size, cy_stc_scb_spi_context_t *context)

我给它最后的参数定义cy_stc_scb_spi_context_t spi_context = {.initKey = CY_SCB_SPI_INIT_KEY};传入NULL或这个成员不等于这个值,MCU会停止运行。但它的返回值一直返回CY_SCB_SPI_TRANSFER_BUSY;还是说这个函数只能主机使用吗,我设置的SPI为从机。

 

0 点赞
1 解答
叶凡
Level 1
Level 1
First solution authored 5 replies posted 10 sign-ins

你好

已经找到问题点了,是由于FIFO被清除的位会被置1,而单片机数据还未完全放入FIFO,主机就来读了,导致读取到错误的数据。

 

在原帖中查看解决方案

0 点赞
7 回复数
Jimmy_L
Moderator
Moderator
Moderator
250 replies posted 250 sign-ins 50 solutions authored

你好,

1. Cy_SCB_SPI_ClearTxFifo是中断传输使用的,你可以调用Cy_SCB_SPI_IsTxComplete是否完成,然后再进行下一次的数据传输。

2. CY_SCB_SPI_INIT_KEY是在NDEBUG模式下使用的,在SPI initial的时候会自己被设置,后续在transfer的时候会调用到。NDEBUG is defined by default for a Release build setting and not defined for a Debug build setting. 所以用户不用去关心这个参数,保持不变就好。

关于SPI的应用可以参考SDL 的sample code和application note225401

0 点赞
叶凡
Level 1
Level 1
First solution authored 5 replies posted 10 sign-ins

你好

我是将MCU作为从机使用的,为了让主机来读时获取到最新的数据,我使用Cy_SCB_SPI_ClearTxFifo将Tx FIFO清空,然后使用Cy_SCB_SPI_WriteArray将最新的数据放入Tx FIFO里面,但是MCU发出去的数据跟放入的数据是不一致的

0 点赞
Jimmy_L
Moderator
Moderator
Moderator
250 replies posted 250 sign-ins 50 solutions authored

你好,

清空FIFO后,您可以给TX buffer赋值,然后writearray,这时候看看FIFO的值是否一致?

0 点赞
叶凡
Level 1
Level 1
First solution authored 5 replies posted 10 sign-ins

你好

查看FIFO里面的值我没找到相关函数,我现在将Tx Buff全置为0,然后使用Cy_SCB_SPI_WriteArray,根据返回值是写入了的。另一端每次读取的值也不完全一样。截图1.png截图2.png截图3.png截图4.png

0 点赞
Jimmy_L
Moderator
Moderator
Moderator
250 replies posted 250 sign-ins 50 solutions authored

你好,

还请先检查一下波特率和SPI 工作模式是否匹配,确定之后再进行测试。

如果您认为是Cy_SCB_SPI_ClearTxFifo引发的问题,您可以先去掉此函数看通讯是否正常。另外可以直接拿示波器或者逻辑分析仪测量SPI slave端发送出来的信号是否正确,先排除SPI master端的影响。

0 点赞
叶凡
Level 1
Level 1
First solution authored 5 replies posted 10 sign-ins

你好

已经找到问题点了,是由于FIFO被清除的位会被置1,而单片机数据还未完全放入FIFO,主机就来读了,导致读取到错误的数据。

 

0 点赞
Jimmy_L
Moderator
Moderator
Moderator
250 replies posted 250 sign-ins 50 solutions authored

你好,

问题解决了,那我先把这条thread锁掉了,如果您有新的问题,可以新建thread讨论,谢谢。

0 点赞