STM32軟體SPI實現NRF24L01

2021-10-10 08:30:07 字數 4209 閱讀 3099

nrf一共是八個引腳,除去vcc和gnd還有六個引腳。

所以我們只需要配置這六個引腳就可以了。

這六個引腳分別是sck,mosi,miso,csn,ce,irq

除了miso和irq配置成輸入,其他的都配置為輸出即可,其實如果不配irq也沒事,如果有需要的話可以配置,不配的也是可以的,不會影響微控制器的通訊。

配置輸入和輸出就和配置led和按鍵輸入是一樣的,**可以參考led和按鍵輸入的**。

以上的**是nrf的初始化

接下來我們需要幾個巨集定義,具體的作用是方面我們隨時改變管教的高低電平

/* sck pa0 */

#define nrf_sck(x) gpioa->odr &=~(1<<0);gpioa->odr |= x<<0

/* mosi pa1*/

#define nrf_mosi(x) gpioa->odr &=~(1<<1);gpioa->odr |= x<<1

/* miso pa2*/

#define nrf_miso(x) gpioa->odr &=~(1<<2);gpioa->odr |= x<<2

#define nrf_miso_value (u8)((gpioa->idr&0x04)>>2)

/* csn pa3 */

#define nrf_csn(x) gpioa->odr &=~(1<<3);gpioa->odr |= x<<3

/* ce pa4 */

#define nrf_ce(x) gpioa->odr &=~(1<<4);gpioa->odr |= x<<4

/* irq pa5 */

#define nrf_irq_value (u8)((gpioa->idr&0x20)>>5)

這裡我寫的**是基於暫存器的操作,這個是簡單的巨集定義,例如當我們寫nrf_sck(1)時pa0也就是接到nrf的sck引腳配置為高電平。

我們還需要相應的暫存器的位址巨集定義

#define nrf_read_reg			0x00

#define nrf_write_reg 0x20

#define rd_rx_pload 0x61

#define wr_tx_pload 0xa0

#define flush_tx 0xe1

#define flush_rx 0xe2

#define reuse_tx_pl 0xe3

#define nop 0xff

#define config 0x00

#define en_aa 0x01

#define en_rxaddr 0x02

#define setup_aw 0x03

#define setup_retr 0x04

#define rf_ch 0x05

#define rf_setup 0x06

#define status 0x07

#define max_tx 0x10

#define tx_ok 0x20

#define rx_ok 0x40

#define observe_tx 0x08

#define cd 0x09

#define rx_addr_p0 0x0a

#define rx_addr_p1 0x0b

#define rx_addr_p2 0x0c

#define rx_addr_p3 0x0d

#define rx_addr_p4 0x0e

#define rx_addr_p5 0x0f

#define tx_addr 0x10

#define rx_pw_p0 0x11

#define rx_pw_p1 0x12

#define rx_pw_p2 0x13

#define rx_pw_p3 0x14

#define rx_pw_p4 0x15

#define rx_pw_p5 0x16

#define nrf_fifo_status 0x17

#define tx_adr_width 5

#define rx_adr_width 5

#define tx_pload_width 32

#define rx_pload_width 32

這個時候我們基本已經完成了,現在我們可以寫spi了,簡單的操作,具體幾個函式如下

/* 寫入的時候並讀取乙個位元組 */

u8 nrf_wr

(u8 byte)

return byte;

}

/* 向乙個暫存器寫入乙個值 */

u8 nrf_wr_reg

(u8 reg,u8 value)

/* 讀取暫存器 */

u8 nrf_read

(u8 reg)

/* 讀取指定長度的值 */

u8 nrf_read_buf

(u8 reg,u8 *pbuf,u8 bytes)

nrf_csn(1

);return status;

}/* 寫入指定長度的值 */

u8 nrf_write_buf

(u8 reg,u8 *pbuf,u8 bytes)

nrf_csn(1

);return status;

}

好大致的操作已經完成了,我們現在向nrf暫存器中寫入乙個值,然後我們再去讀這個nrf暫存器的值,應該就是我們寫的值。這一步就是我們所說的nrf自檢。

/* nrf自檢 */

/* 就是先寫入乙個值 然後再讀出乙個值 看一下自己讀出來的是否和自己寫入的是否一樣*/

/* 一樣自檢通過 不一樣自檢不通過 */

u8 nrf24l01_check

(void);

nrf_write_buf

((nrf_write_reg+tx_addr)

,buf,5)

;nrf_read_buf

(tx_addr,buf,5)

;for

(i=0

;i<

5;i++)if

(buf[i]

!=0xa5

)break;if

(i!=5)

return1;

return0;

}

這個時候該配置的都配置了接下來就是兩個微控制器之間的通訊了。

主機我們負責傳送資料,我們需要配置傳送位址和傳送的速率

從機負責接受資料,我們需要配置接收位址和接受速率等

/* 配置接受和傳送的位址 */

const u8 tx_address[tx_adr_width]=;

//傳送位址

const u8 rx_address[rx_adr_width]=;

//傳送位址

位址可以自己隨意設定,但是主機和從機的位址應該一樣,否則連線不上

/* rx模式 */

void

rx_mode

(void

)

/* tx模式 */

void tx_mode(void)

**好 至此我們配置已經全部完成了大致分為

STM32 軟體模擬SPI時序驅動NRF24L01

其實stm32本身的硬體spi也很好用,但是還是想用軟體來模擬一下psi的時序。spi 是一種高速的,全雙工,同步序列的通訊匯流排。spi通訊方式相當於是乙個環形結構,由csn miso mosi sclk四線組成,主要是在sclk時鐘線的驅動下,進行資料轉換。接下來直接上程式配置 使用32模擬sp...

STM32之間SPI通訊

這幾天實驗室比較忙,所以部落格這邊停了一下,繼續吧。繼串列埠中斷後,大家可以嘗試微控制器間串列埠通訊,這裡就不再多贅述。串列埠完了之後,我接著學的就是spi通訊了,作為hello moto公司推出的這種4線全雙工通訊,很節約pcb布局空間,但缺點就是沒有指定的流控制,沒有應答機制來確定訊號收到與否,...

STM32 快速上手SPI

基本的部分前文 stm32 spi 已經介紹過了,這裡只記怎麼用。stm32f103zet6的三個spi的引腳分別為 spi1在apb1時鐘下,spi2和spi3在apb2時鐘下。void spi i2s deinit spi typedef spix void spi init spi typed...