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...