其實stm32本身的硬體spi也很好用,但是還是想用軟體來模擬一下psi的時序。
spi 是一種高速的,全雙工,同步序列的通訊匯流排。spi通訊方式相當於是乙個環形結構,由csn、miso、mosi、sclk四線組成,主要是在sclk時鐘線的驅動下,進行資料轉換。
接下來直接上程式配置:
使用32模擬spi時序的io口配置,應該注意的是miso應該選擇模擬輸入方式gpio_mode_in_floating。
以下是我的初始化部分:
/*用於軟體模擬spi io口巨集定義區*/
#define spi_cs_port gpiob
#define spi_cs_pin gpio_pin_11
#define spi_cs_low (spi_cs_port->brr |=spi_cs_pin)
#define spi_cs_high (spi_cs_port->bsrr |=spi_cs_pin)
#define spi_sck_port gpioa
#define spi_sck_pin gpio_pin_12
#define spi_sck_low (spi_sck_port->brr |=spi_sck_pin)
#define spi_sck_high (spi_sck_port->bsrr|=spi_sck_pin)
#define spi_miso_port gpioa
#define spi_miso_pin gpio_pin_8
#define spi_miso_low (spi_miso_port->brr |=spi_miso_pin)
#define spi_miso_high (spi_miso_port->bsrr|=spi_miso_pin)
#define spi_miso_read (spi_miso_port->idr &spi_miso_pin)
#define spi_mosi_port gpioa
#define spi_mosi_pin gpio_pin_11
#define spi_mosi_low (spi_mosi_port->brr |=spi_mosi_pin)
#define spi_mosi_high (spi_mosi_port->bsrr|=spi_mosi_pin)
void spi_gpio_config(void)
模擬spi時序
spi_sck_high; //將時鐘線拉高,在時鐘上公升沿,資料傳送到從裝置
data
<<=
1; if(spi_miso_read) //讀取從裝置發射的資料
spi_sck_low; //在下降沿資料被讀取到主機
}return
data; //返回讀取到的資料
}寫暫存器操作:`
u8 spi_moni_write_reg(u8 reg,u8 data)
接下來就是寫緩衝區、讀緩衝區函式 了:
u8 spi_moni_write_buf(u8 reg,u8 *buf,u8 len)
spi_cs_high;
return states;
}u8 spi_moni_read_buf(u8 reg,u8 *buf,u8 len)
spi_cs_high;
return states;
}
stm32軟體模擬iic
iic inter integrated circuit 匯流排是一種由philips公司在80年代開發的兩線式序列匯流排,用於連線微控制器及其外圍裝置。它是半雙工通訊方式。iic匯流排最主要的優點是其簡單性和有效性。由於介面直接在元件之上,因此iic匯流排占用的空間非常小,減少了電路板的空間和晶元...
FPGA與STM32 模擬32位SPI通訊(二)
1 下午又繼續實驗,發現fpga不輸出資料了,但是sck訊號還有,情況比上午還糟,用signaltap 了一陣也沒有結果,後來發現是杜邦線松了。教訓是以後接線時鬆的線務必不要將就,尤其是在接比較密集的杜邦線,線鬆動了會很難排查,熟悉了signaltap的 但仿不出全部的32個sck訊號,取樣率設到6...
STM32之間SPI通訊
這幾天實驗室比較忙,所以部落格這邊停了一下,繼續吧。繼串列埠中斷後,大家可以嘗試微控制器間串列埠通訊,這裡就不再多贅述。串列埠完了之後,我接著學的就是spi通訊了,作為hello moto公司推出的這種4線全雙工通訊,很節約pcb布局空間,但缺點就是沒有指定的流控制,沒有應答機制來確定訊號收到與否,...