2017-02-10 60 views
1

我一直在試圖移植一些AVR代碼來驅動一個簡單的SPI LCD作爲學習練習(我對ARM一般來說很新穎)。爲此,我只需要在主模式下使用SPI。我查看了我的器件(STM32F103C8)的datasheet,發現我需要的SPI1引腳,SCK和MOSI分別與其他外設(第29頁)一起映射爲PA5和PA7的替代功能。我的理解是,爲了在這些引腳上使用SPI功能,我需要確保映射到同一引腳的任何其他功能都被禁用。但是,在查看外設時鐘控制寄存器的默認值時,看起來其他功能已被禁用。STM32F1 - 在裸機上使用主SPI

我看着SPI部分在reference manual,包括第25.3.3 - 在主模式配置SPI。首先,我在APB2ENR中啓用SPI1主時鐘,並按照本節中的步驟將SPI1配置爲符合我的需要。我還更改了PA5/7的設置,將其模式設置爲「備用功能輸出推輓」(9.1.4)。最後,我通過設置CR1_SPE來啓用SPI1。

從我的閱讀中,我曾經想過,在配置SPI之後,通過將值加載到SPI1數據寄存器中,數據將被移出。但是,在寫入數據之後,SPI狀態寄存器中的TXE標誌永遠不會置位,表示我寫入的數據只是坐在那裏。

在這一點上,我假設有其他東西我沒有正確配置。例如,我不能100%確定如何處理PA5/7引腳。我試圖從數據表中理解我能做些什麼,但我沒有得到任何地方。還有什麼需要完成之前,它會工作?

+0

我不認爲引腳配置不正確會阻止SPI嘗試傳輸數據。它不會去任何地方,但外圍設備仍然會這樣。我會建議外設配置不正確。你是否啓用了SPI的時鐘?你是否啓用了SPI? –

+0

發佈你的代碼,否則我們所能做的只是猜測...... –

回答

4

我幾乎可以肯定你沒有在SPIx->CR1寄存器中設置SSMSSI位。 SPI在這些芯片是非常簡單的,對輪詢傳輸需要設置SSMSSISPEMSTR,正確的格式(LSBFIRSTCPOLCPHA),並在適當的SPIx->CR1波特率(BR),你是好去。

+0

你說得對,我沒有觸及SSM/SSI設置,因爲我認爲它們不會影響主模式。我會用代碼更新我的帖子,謝謝 – Triforcer

+0

@Triforcer - 當您不使用硬件CS引腳時,這些位會影響主模式。 STM32應該支持多主機模式,所以當主機模式下CS低時,它們不會傳輸任何東西。 SSM和SSI作爲「軟件從屬選擇」並適用相同的規則 - 當它們爲「0」時,您將看不到任何傳輸。 –

+0

設置SSI/SSM位解決了我的問題,謝謝。我過去使用的微控制器沒有多主機的規定,所以這個概念對我來說是陌生的。我不知道爲什麼你的答案被低估了。對於沒有給出理由的人來說,這似乎不具有建設性。 – Triforcer