如此强大的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却非加不可,这个是什么原因呢???
路过的看客,知道答案的就指点下小弟吧.
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
加这两句主要是延迟
代码中这样写发送等待的语句,发送会不正常
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,这个问题也就没有去深究了
一周热门 更多>