本年度最灵异事件---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却非加不可,这个是什么原因呢???

路过的看客,知道答案的就指点下小弟吧.
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
lxyppc
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,这个问题也就没有去深究了

一周热门 更多>