本年度最灵异事件---STM32调试记

2019-12-25 18:52发布

如此强大的Cortex-M3,居然有这样的问题,是我的配置不正确还是芯片Bug呢???

今天研究了一天STM32的SPI,正好它有两个SPI,做了自收发测试,没问题,然后找了个SPI的屏幕,死活无法控制,用IO模拟SPI总线却没有问题,悲愤一天,放弃之.
晚上继续拿出来研究,把每个API都研究了一遍,没发现问题,实在受不了了,到网上查资料,找了个别人的程序,如下:
u8 SPI1_SendByte(u8 byte)
{
  /* Loop while DR register in not emplty */
  while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

  /* Send byte through the SPI1 peripheral */
  SPI_I2S_SendData(SPI1, byte);

  /* Wait to receive a byte */
  while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);

  /* Return the byte read from the SPI bus */
  return SPI_I2S_ReceiveData(SPI1);
}

依照正常的操作,下面两句话是可以不要的,因为对LCD的操作是单向的,没必要返回数据,所以我一直没有下面两句话,然后抱着试一试的心理,把下面两句话加上之后,居然工作正常了,把数据手册重新看了一遍,还是没找到答案,我用AVR时从来不加这两句的,到了STM32却非加不可,这个是什么原因呢???

路过的看客,知道答案的就指点下小弟吧.
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
tuy0326
1楼-- · 2019-12-25 23:00
SPI时序过快

加这两句主要是延迟
cy757
2楼-- · 2019-12-26 03:08
你说的这种情况我觉得应该是你还有某些参数没设置好。
hdcz01
3楼-- · 2019-12-26 05:46
建议重新研究下你屏的资料,有返回的数据,否则返回的非空标志位是不会置位的,如果没有返回的数据,你这个程序会陷入死循环。
bike
4楼-- · 2019-12-26 08:27
 精彩回答 2  元偷偷看……
lxyppc
5楼-- · 2019-12-26 13:24
以前调SPI就有一个疑问,SPI工作在9MHz
代码中这样写发送等待的语句,发送会不正常
while(!(SPIx->SR&SPI_I2S_FLAG_TXE));
换成调用函数就正常了
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

上面的代码在后面加一点延时也能正常

有点怀疑SPI的TXE标志不是再最后一个Clock发出去后置位的,而是在最后一个Data发出去后就置1了

从设备是74HC164这样的芯片,不会有反应不过来的情况
由于加点延时可以work around,这个问题也就没有去深究了
skyxjh
6楼-- · 2019-12-26 14:22
TXE是发送寄存器空,不是发送完成!

一周热门 更多>