前面給小伙伴講過串口發(fā)送和接收異常的可能原因,今天我們講下SPI全雙工模式下數(shù)據(jù)接收異常的一個(gè)原因。
我們知道,SPI是一主多從的總線結(jié)構(gòu),主機(jī)和哪個(gè)從機(jī)是通過CS片選來決定的。
![wKgZomWvFsKAI3KxAAB38qQEBEM744.png](https://file1.elecfans.com/web2/M00/BD/DF/wKgZomWvFsKAI3KxAAB38qQEBEM744.png)
我們再來看下SPI的框圖:
![wKgZomWvFsaAJXPfAADOqvpAng8304.png](https://file1.elecfans.com/web2/M00/BD/DF/wKgZomWvFsaAJXPfAADOqvpAng8304.png)
除了有發(fā)送緩沖區(qū)和接受緩沖區(qū)外,還有一個(gè)移位寄存器,所以當(dāng)使用SPI發(fā)送最后一個(gè)字節(jié)到發(fā)送緩沖區(qū)時(shí),倒數(shù)第二個(gè)字節(jié)還在移位寄存器中沒有發(fā)出,此時(shí)如果應(yīng)用程序?qū)臋C(jī)CS拉高的話,就會(huì)導(dǎo)致從機(jī)失效,從而不會(huì)發(fā)出正確的數(shù)據(jù)。
那么如何解決呢?
只需要在拉高CS片選前,調(diào)用下面這個(gè)語句即可:
while(SET == (spi_i2s_flag_get(SPI0,SPI_FLAG_TRANS)));
這句的意思是等待SPI通訊空閑,對應(yīng)讀取的標(biāo)志位是SPI_STAT 寄存器中的bit7位
![wKgaomWvFs2AfpfCAAC4GVxLw1I704.png](https://file1.elecfans.com/web2/M00/BE/CB/wKgaomWvFs2AfpfCAAC4GVxLw1I704.png)
![wKgaomWvFtGAXOiSAABqjjQI80A702.png](https://file1.elecfans.com/web2/M00/BE/CB/wKgaomWvFtGAXOiSAABqjjQI80A702.png)
當(dāng)該位為0時(shí),就標(biāo)志著SPI緩沖區(qū)和移位寄存器中都沒有數(shù)據(jù)了,你就可以放心大膽的控制CS片選腳啦。
-
單片機(jī)
+關(guān)注
關(guān)注
6044文章
44624瀏覽量
638956 -
嵌入式
+關(guān)注
關(guān)注
5095文章
19189瀏覽量
307974 -
SPI
+關(guān)注
關(guān)注
17文章
1724瀏覽量
92185
發(fā)布評論請先 登錄
相關(guān)推薦
請問ESP32S3 SPI怎么配置全雙工模式下從機(jī)連續(xù)傳輸?
![](https://file1.elecfans.com/web2/M00/BF/69/wKgaomWzEOaAK5eBAAs-adI_dyQ739.png)
評論