STM32 軟體模擬SPI時序驅動NRF24L01

2021-08-03 16:16:36 字數 1925 閱讀 9679

其實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布局空間,但缺點就是沒有指定的流控制,沒有應答機制來確定訊號收到與否,...