社区导航

 
查看: 212|回复: 2

[经验] 关于STM32的SPI只发送模式SPI_Direction_1Line_Tx

[复制链接]

227

TA的帖子

1

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2018-11-9 09:38:16 | 显示全部楼层 |阅读模式
最近做一款TFT屏SPI驱动,由于是单向写数据没有用到MISO脚,因此SPI配置为SPI_Direction_1Line_Tx模式。但调试的时候发现屏始终未能正常显示,分析SPI波形后发现CS信号总是在数据未传输完成前被置高了(CS低电平有效)。后面参照了别人的例程向DR写数据后不再等待判断TXE位置1,而是等待BSY位为零。结果也还是未能解决CS被提前置高的问题,网上问了一圈之后依然没有得到想要的答案。最后仔细研读了一遍STM32F103的技术手册才发现了问题的症结所在:原来在向DR写数据后SPI并不会立即启动发送此时BSY仍然为0,TXE为0,延迟2个APB时钟周期后发送启动TXE变为1,BSY变为1,等到数据发送完成BSY再变为0。因此关于我的问题解决办法是写DR后先等待TXE为1以确认发送动作已启动,后面再等待BSY为0即发送结束可以置高CS信号。如此问题解决。另外附上数据手册上的原文:

“注: 1.  对于不连续的传输,在写入 SPI_DR 寄存器的操作与设置 BSY 位之间有 2 个 APB 时钟周期的延
迟,因此在只发送模式下,写入最后一个数据后,最好先等待 TXE=1 ,然后再等待 BSY=0 。
2 . 只发送模式下,在传输 2 个数据之后,由于不会读出接收到的数据, SPI_SR 寄存器中的 OVR 位
会变为 ’1’ 。 ( 译注:软件不必理会这个 OVR 标志位 )”


详见数据手册23.3.5节,第466页。
此帖出自stm32/stm8论坛
模电临时工


回复

使用道具 举报

3287

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-11-9 11:49:45 | 显示全部楼层
不错,另外问下楼主这种情况中断怎么弄?

点评

中断好像还真没办法,因为中断只有TXE中断,如在TXE中断函数中等待BSY为0似乎不太符合我等的价值观。不过可以考虑启用硬件NSS模式,让硬件来管理片选信号,这个方式我没有尝试过在这里只是提供一个可能的解决方案。  详情 回复 发表于 2018-11-9 14:41


回复

使用道具 举报

227

TA的帖子

1

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2018-11-9 14:41:19 | 显示全部楼层
huo_hu 发表于 2018-11-9 11:49
不错,另外问下楼主这种情况中断怎么弄?

中断好像还真没办法,因为中断只有TXE中断,如在TXE中断函数中等待BSY为0似乎不太符合我等的价值观。不过可以考虑启用硬件NSS模式,让硬件来管理片选信号,这个方式我没有尝试过在这里只是提供一个可能的解决方案。
模电临时工


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2018-11-19 18:14 , Processed in 0.108264 second(s), 16 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表