STM32開發之SPI 與W25Q128通訊

2021-09-14 02:34:46 字數 3136 閱讀 1001

除錯stm32l051的spi2 和 w25q128 通訊問題。問題是spi的sck一直高電平,沒有訊號輸出,一直高;mosi有訊號輸出,miso一直是高電平,沒有訊號輸出。gpio的初始化和spi的初始化,基本沒有什麼異常。

stm32和ad7606的spi除錯心得 

原子哥 暫存器版**

方法:gpio 配置有問題,gpio沒有配置為上拉,以及gpio_speed。

因此有必要對基於stm32中外設的gpio設定做乙個總結。

全雙工spi作為主機時,片選可以使硬體控制也可以使軟體控制;硬體控制時(sclk/mosi/miso/css)均配置為復用、輸出速度為高,設定為內部上拉;軟體控制時(sclk/mosi/miso)均配置為復用、輸出速度為高,設定為內部上拉,(css)配置為推挽輸出模式,速度高,內部上拉。

gpio的設定可由gpio_set和gpio_af_set兩個函式。

下面是gpio_set函式的具體內容: note注意:在輸入模式(普通輸入/模擬輸入)下,otype和ospeed引數無效!!

#define gpio_pin0_select    (0x00000001)

#define gpio_pin0_select (0x00000002)

...#define gpio_pin15_select (0x00008000)

#define

/*@fun: gpio_set

@note: gpio通用設定

@param: gpiox:gpioa~gpioi.待設定的io組

bitx:0x0000~0xffff,位設定,每個位代表乙個io,第0位代表px0,第1位代表px1,

mode:0~3;模式選擇,0,輸入(系統復位預設狀態);1,普通輸出;2,復用功能;3,模擬輸入.

otype:0/1;輸出型別選擇,0,推挽輸出;1,開漏輸出.

ospeed:0~3;輸出速度設定,0,2mhz;1,25mhz;2,50mhz;3,100mh.

pupd:0~3:上下拉設定,0,不帶上下拉;1,上拉;2,下拉;3,保留.

note注意:在輸入模式(普通輸入/模擬輸入)下,otype和ospeed引數無效!!

*/void gpio_set(gpio_typedef* gpiox,u32 bitx,u32 mode,u32 otype,u32 ospeed,u32 pupd)

}}

gpio復用設定函式 gpio_af_set

/*

@fun:gpio_af_set

@note: gpio復用設定

@param:

gpiox:gpioa~gpioi.

bitx:0~15,代表io引腳編號.(15%8)

afx:0~15,代表af0~af15.

*/void gpio_af_set(gpio_typedef* gpiox,u8 bitx,u8 afx)

1、設定為雙線全雙工方向;

2、設定spi主機工作模式;

3、設定spi的資料大小為8位幀結構;

4、序列同步時鐘的空閒狀態cpol為低電平、序列同步時鐘的跳變沿設定cpha位;

5、從器件軟體管理設定;

6、設定波特率預分頻以定義序列時鐘波特率

7、資料傳輸從低位還是高位開始;

8、crc值計算的多項式設定。

9、使能spi裝置。

下面是初始化過程:

uint16_t tempreg = 0;

//spi的gpio配置pb12~15(nss/sck/miso/mosi)四個引腳

rcc->ahb1enr |= rcc_ahb1enr_gpioben;  //使能portb時鐘

rcc->apb1enr |= rcc_apb1enr_spi2en;  //使能spi2時鐘使能

gpio_set(gpiob,gpio_pin13_select | gpio_pin14_select | gpio_pin15_select 2,0,3,1);

gpio_set(gpiob,gpio_pin12_select,1,0,3,1); //普通輸出,作為片選使能腳

gpio_af_set(gpiob,gpio_pin13_select ,5); //pin13~pin15 復用為spi2

gpio_af_set(gpiob,gpio_pin14_select ,5);

gpio_af_set(gpiob,gpio_pin15_select ,5);

//spi2 初始化

rcc->apb1rstr |= rcc_apb1rstr_spi2rst; //復位spi2

rcc->apb1rste &= ~rcc_apb1rstr_spi2rst; //停止復位spi2

//作為主機、選擇軟體控制從器件選擇、時鐘相位設為第二個沿取樣、時鐘極性為空閒時高電平、256分頻、使能

//spi、雙工模式(收發)、8位資料、從msb先傳送

tempreg = (spi_cr1_mstr | spi_cr1_ssm | spi_cr1_ssi | spi_cr1_cpha | spi_cr1_cpol | spi_cr1_br | spi_cr1_spe)\

& ~(spi_cr1_rxonly | spi_cr1_dff | spi_cr1_lsbfirst);

spi2->cr1 = tempreg;

spi2->i2scfgr &= ~spi_i2scfgr_i2smod; //選擇spi模式

while((spi2->sr & (spi2_sr_txe))==reset)

;spi2->dr = 0xff;

while((spi2->sr & (spi2_sr_rxne))==reset)

;spi2->dr;

通用的spi速度設定

/*

@fun: spi2_setspeed

@note: spi1速度設定函式

@param:

speedset:0~7

spi速度=fapb2/2^(speedset+1)

fapb1時鐘一般為42mhz

*/void spi2_setspeed(uint8_t speedset)

基本流程一致。

stm32 華邦W25X32晶元spi匯流排配置

pi3匯流排使用時,注意改變指定管腳的對映 gpio remap swj jtagdisable jtag dp 禁用 sw dp 使能 include stm32f10x gpio.h include stm32f10x spi.h define flash cs 1 6 define spi f...

STM32之SPI匯流排協議

spi匯流排協議是一種序列外圍裝置介面,是motorola公司推出的一種三線同步序列接 術,spi是一種高速的 全雙工 同步的通訊匯流排,並且在晶元上的物理介面只需要占用4根線,節約了晶元的管腳。spi是乙個環形匯流排結構,由sck cs mosi miso構成,時序也很簡單,主要是在sck的控制下...

stm32之spi之NSS管腳訊號

nss管腳及我們熟知的片選訊號,作為主裝置nss管腳為高電平,從裝置nss管腳為低電平。當nss管腳為低電平時,該spi裝置被選中,可以和主裝置進行通訊。在stm32中,每個spi控制器的nss訊號引腳都具有兩種功能,即輸入和輸出。所謂的輸入就是nss管腳的訊號給自己。所謂的輸出就是將nss的訊號送...