一起学nRF51xx 7 - spi
前言
SPI 總線是 Motorola 公司推出的三線同步接口, 以同步串行 3 線方式進行通信。 SPI 接口有 4 條信號線: SCK, MOSI, MISO, SCS。 SPI 總線支持一主多從通訊, SCS 用來選擇要通訊的SPI 外設, 低電平有效。 在 SCK 的驅動下, 主跟指定的從進行全雙工、 同步串行通訊。 SPI 總線中有幾個比較重要的概念, 我們先看一下:
?
1) CPOL(CLOCK POLARITY)
時鐘極性。 SPI 的 CPOL, 表示當 SCLK 空閑, 即 idle 的時候, 其電平的值是低電平 0 還是高電平 1。
CPOL=0, 時鐘空閑 idle 時候的電平是低電平, 當 SCLK 有效的時候, 高電平, 就是所謂的active-high;
CPOL=1, 時鐘空閑 idle 時候的電平是高電平, 當 SCLK 有效的時候, 低電平, 就是所謂的active-low;
?
2)Edge邊沿。 即時鐘電平變化的時刻, 即上升沿(rising edge)或者下降沿(falling edge)。 對于一個時鐘周期內, 有兩個 edge。 分別稱為:
?
A) Leading edge
前一個邊沿=第一個邊沿, 如果開始電壓是 1, 那么就是 1 變成 0 的時候; 如果開始電壓是 0, 那么就是 0 變成 1 的時候.
B) Trailing edge
后一個邊沿=第二個邊沿, 如果開始電壓是 1, 那么就是 0 變成 1 的時候(即在第一次 1變成 0 之后, 才可能有后面的 0 變成 1) ; 如果開始電壓是 0, 那么就是 1 變成 0 的時候。
?
3)CPHA(CLOCK PHYSE )
時鐘相位。 它表示的是在第幾個時鐘有效沿采集數據。 當 CPHA=0, 在第一個邊沿采集數據; 當 CPHA=1, 在時鐘的第二個邊沿采集數據。
?
CPHA=0, 表示第一個邊沿:
對于 CPOL=0, idle 時候的是低電平, 第一個邊沿就是從低變到高, 所以是上升沿;
對于 CPOL=1, idle 時候的是高電平, 第一個邊沿就是從高變到低, 所以是下降沿;
?
CPHA=1, 表示第二個邊沿:
對于 CPOL=0, idle 時候的是低電平, 第二個邊沿就是從高變到低, 所以是下降沿;
對于 CPOL=1, idle 時候的是高電平, 第一個邊沿就是從低變到高, 所以是上升沿;
?
本節將在NRF51822芯片是使用SPI接口實現對板上FLASH芯片GD25Q128的讀寫操作。
?
示例詳解
基于硬件平臺:nrf51822ek_tm開發板。
?
?
本示例所用的最小系統板原理圖:
?
?
工程名為nrfxx-spi確認后按下圖選擇芯片為nrf51822_xxAA->ok
在彈出的對話框中勾選CMSIS中的CORE;Device中的Startup(后面有nrf51Series字樣的);在nrf_device中勾選nrf_gpio,nrf_gpiote,nrf_delay,nrf_ppi,nrf_error,nrf_uart,nrf_spi.h并在nrf_Libraries中勾選app_error,nrf_assert模塊。
?
?
OK之后工程自動生成如下代碼:
新建一個空白文檔,保存為main.c,并加入工程中:
配置工程,選擇使用MicroLIB庫,可以減小程序體積:
加入NRF51定義,并選擇化等級3,可以減小程序體積,但仿真運行時可能會出現與代碼順序不一致現象:
?
調試工具選擇J-LINK,并將接口設置為SW口勾選下載程序后自動復位及運行:
?
加入事先寫好的GD25Q128B驅動程序(該程序是在兆易官方庫基礎上修改得到),并將對應的頭文件路徑加入到工程中。
?
其中spi_flash_init,spi_flash_buffer_write,spi_flash_buffer_read三個函數實現在GD25qxx.c文件中,spi_flash_init主要是完成SPI接口的初始化工作:
在GD25qxx.c除了spi_flash_init需要修改外,還需要對spi_flash_send_byte和spi_flash_send_halfword兩個函數進行修改:
當然,在GD25qxx.h也要進行一些必要修改:
最后本示例使用了MicroLib庫,同時又使用了較大同間的局部變量,如MAIN函數中的uint8_t Txbuff[1024],uint8_t Rxbuff[1024],為了保證本示例功能正常需加大堆棧大小,如下圖設置為4096(4K)字節:
?
完成以上操作就可以通過NRFXX的SPI接口實現對GD25Q128B Flash芯片的讀取操作了。關于nrfxx接口的更多介紹可以去網官https://infocenter.nordicsemi.com/index.jsp 查看相應的接口說明文檔。
?
通過上面的打印的數據可以發現,通過SPI接口成功實現了對GD25Q128的讀寫操作,用邏輯分析儀可以抓取到正常的SPI數據。
OK,本期實驗完成!下期見!同時如果大家有什么疑問或是有想了解的其它內容,也歡迎大家留言!!最后喜歡這個公眾號的同學們記得加關注了,會有不定期技術干貨推出!!
文中源碼資料下載,在公眾號里給十三發消息:
下載|一起學nRF51xx 7
?
關注十三公眾號
?
總結
以上是生活随笔為你收集整理的一起学nRF51xx 7 - spi的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一起学nRF51xx 6 - uart
- 下一篇: 一起学nRF51xx 8 - Time