|
發布時間: 2018-7-15 08:55
正文摘要:幾年前買了一塊天馬的屏,是HX8357的,最近有空拿出來用,發現原來給的DEMO為模擬9位SPI的,我試過很多種方法,還是沒有辦法用STM32F103的硬件SPI驅動起來,原因是屏需要9位的SPI,但F103的SPI只有8位和16位的模式, ... |
|
是的! 重點是如果中斷多或者時間不好分配時,只能用硬件,便于調度,但就是不知道怎么用8位或16位發送9位的數據。即便時組裝好了,也沒法實現發送。 |
GlenXu 發表于 2023-3-8 13:27 對了,我問這個問題的本意也是想知道如何用硬件的SPI輸出9位,畢竟硬件的方式速度很快,而不是用IO模擬。 |
yaoyao2022 發表于 2022-5-14 22:18 設置沒有問題,不知道怎么產生9位數據到寄存器? 那一位怎么操作后組裝到發送“字”中,因為STM32只有8、16、32位操作,9位是怎么組裝而成的?! |
| 似乎很有道理。 |
| 用硬件是可以用的,但是不能用通用的"庫", 要用你自己寫的"庫",當然,你也可以找找有沒有通用的9位的"庫", 反正, 我從來不用 "函數庫", 搞明白底層原理, 自己寫函數自由度和效率不是更高? |
|
因為這9bit 的SPI 是因為沒有RS 引腳,所以需要多一位來區分是送cmd 還是data .當第9位為0時,傳送的是cmd . 為1時傳送的是data (注:cmd 是指寄存器地址,data 是數據)。 好多年沒有弄這個了,我手上還有之前的寫的函數。你可以參考看看能不能用。 void SPI_WriteComm(unsigned int i) { unsigned char n,m; SPI_CS = 0; SPI_CLK = 0; SPI_DI = 0; SPI_CLK = 1; m=0x80; for(n=0; n<8; n++) { if(i&m) { SPI_CLK = 0; SPI_DI = 1; SPI_CLK = 1; } else { SPI_CLK = 0; SPI_DI = 0; SPI_CLK = 1; } m=m>>1; } SPI_CS = 1; } void SPI_WriteData(unsigned int i) { unsigned char n,m; SPI_CS = 0; SPI_CLK = 0; SPI_DI = 1; SPI_CLK = 1; m=0x80; for(n=0; n<8; n++) { if(i&m) { SPI_CLK = 0; SPI_DI = 1; SPI_CLK = 1; } else { SPI_CLK = 0; SPI_DI = 0; SPI_CLK = 1; } m=m>>1; } SPI_CS = 1; } |
| 可以設置 8 位還是9位 |
|
STM32F030有9位等多位數,但是我不會用! 并且由于容量小,做不了幾個程序。 ![]() |
| 提示:庫也是程序。 |
| 最后問題解決了嗎?期待后續結果。 |