1. 程式人生 > >stm32 SPI 收發資料

stm32 SPI 收發資料

STM32-SPI使用 SPI知識:
1)
高速同步序列口。3~4線介面(CS ,CLK ,MOSI,MISO),收發獨立、可同步進行。
2)SPI分為主從模式,主模式提供時鐘和片選選擇訊號.
3) 模式控制:CPOL用來控制時鐘訊號(clk)在空閒時候的狀態;CPHA用來控制取樣時刻時CLK的邊緣動作。
CPOL CPHA 模式
0 0 CLK空閒時為低電平,CLK上升沿取樣資料。
0 1 CLK空閒為低電平,CLK下降沿取樣資料。
1 0 CLK空閒時為高電平,CLK上升沿取樣資料。
1 1 CLK空閒時為高電平,CLK下降沿取樣資料。

1)SPI配置(3.01庫):
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //雙工模式
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //SPI主模式
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //8bit資料
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //CLK空閒時為高電平
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //CLK上升沿取樣,因為上升沿是第二個邊沿動作,所以也可以理解為第二個邊沿取樣
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //片選用軟體控制
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; //SPI頻率
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //高位在前
SPI_InitStructure.SPI_CRCPolynomial = 7; //crc7,stm32spi帶硬體ecc
SPI_Init(SPI1, &SPI_InitStructure);
2)CS訊號:
主模式下要為從裝置提供片選訊號,值得注意的是STM32的主頻相當較高,要提防資料沒有完全傳送前拉高CS訊號。
3)SPI讀寫:(非中斷模式)
a)寫一個位元組:
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
//確保發生前Buffer為空,也就是說上一次已經發生完成
SPI_I2S_SendData(SPI1, Data); //往暫存器中寫入一個位元組
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
//等待接受到一個位元組資料,為什麼要這麼做?加這一句的原因是為了確保這個位元組已經發送出去,因為發生和接受是並行同步進行,那就是說你發生出去一個位元組意味著你收到一個位元組。所以這樣判斷完全沒有問題,再說必要性,如果你不加這句你就會容易犯過早拉高CS訊號的錯誤,你想想如果在SPI_I2S_SendData(SPI1, Data)後面立即拉高CS是什麼後果。
SPI_I2S_ReceiveData(SPI1); //都會接收到的資料,看起來沒什麼必要,但以用stm32的經驗推薦這樣做,也許會有意想不到的收穫。
SPI_Writebyte(u8 data)
{
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI1, Data);
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
SPI_I2S_ReceiveData(SPI1);
}
b)讀一個位元組:
讀的時候要注意一個問題,因為從模式是沒法提供時鐘的,所以主模式下必須要在接收的同時提供時鐘。辦法就是傳送一個位元組來實現,因為還是上面說的,傳送一個位元組就意味著收到一個位元組,程式碼和寫完全一樣,只要把讀出來的位元組儲存即可。
u8 SPI_Readbyte(u8 data)
{
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI1, Data);
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
return SPI_I2S_ReceiveData(SPI1);
}



總結:上面的程式是最求穩定而設定的,如果你對速度有要求,你可以做相應的精簡,比如讀寫直接對暫存器進行操作,另外配置SPI前要對從模式的模式瞭解清楚,包括從裝置支援的時鐘範圍和模式(CPOL,CPHA狀態)。

轉自:

http://www.ec66.com/article/list.asp?indexid=4538

相關推薦

STM32 SPI 收發資料 ---規則 + 問題解析

規則: 1)  高速同步序列口。3~4線介面(CS ,CLK ,MOSI,MISO),收發獨立、可同步進行。 2)SPI分為主從模式,主模式提供時鐘和片選選擇訊號. 3) 模式控制:CPOL用來控制時鐘訊號(clk)在空閒時候的狀態;CPHA用來控制取樣時刻時CLK的邊緣動

stm32 SPI 收發資料

STM32-SPI使用 SPI知識: 1) 高速同步序列口。3~4線介面(CS ,CLK ,MOSI,MISO),收發獨立、可同步進行。 2)SPI分為主從模式,主模式提供時鐘和片選選擇訊號. 3) 模式控制:CPOL用來控制時鐘訊號(clk)在空閒時候的狀態;CPHA用

STM32-----採用DMA的方式實現串列埠收發資料

STM32-----採用DMA的方式實現串列埠收發資料 概述 想必看到這篇部落格的你已經知道了DMA的好處了吧,所以這兒就不過多地講述DMA對於緩解MCU壓力有多麼重要的用途,DMA在很多方面都可以使用,如IIC,SPI,USART等,這兒主要給出DMA

【已實現】stm32 SPI DMA中斷收發

#ifdef STM32_USE_DMA /*-----------------------------------------------------------------------*/ /* Transmit/Receive Block using DMA (Platform dependent. S

STM32 IIC詳解】stm32 IIC從機模式(中斷方式收發資料)

1、IIC簡介 第二節程式碼會用到該部分內容,對於IIC來說,從機是不能主動傳送資料的,開始條件都是由主機生成。   1.1、主機發送資料流程   1) 主機在檢測到匯流排為“空閒狀態”(即 SDA、SCL 線均為高電平)時,傳送一個啟動訊號

CANOpen系列教程06_結合程式碼理解CAN底層收發資料(含STM32例程)

該系列教程已經在我的個人微信公眾號**「strongerHuang」**整理並分享。因在這裡分享文章,還需單獨整理一遍,時間有限,就不再一一重複整理出來了。 想要檢視更多相關教程,可以關注我的個人微信公眾號「strongerHuang」,回覆【CANOpen系

BLDC 無刷電機FOC驅動 STM32官方培訓資料

show stm32 培訓 驅動 href tmx blank .html 1-1 STM32 PMSM FOC SDK V3.2 培訓講座一http://v.youku.com/v_show/id_XNTM2NjgxMjU2.html?from=s1.8-1-1.2STM

stm32-SPI讀取串行FLASH

stm32 支持 時鐘 檢測 ora 緩沖 sequence pass conf SPI協議:是由摩托羅拉公司提出的通訊協議(Serial Peripheral Interface),即串行外圍設備接口,是一種高速全雙工的通信總線。它被廣泛地使用在ADC、LCD 等設備與M

stm32-SPI通訊原理詳解

ash orf 即使 信號線 時鐘 tro 信號中斷 設備 操作 那麽今天再說說SPI吧,通過前面的IIC其實我們知道,通訊協議,其實就是通過時序來傳輸數據,通過自定義不同的函數來實現數據的傳輸(具體就是按照時序,來讀寫寄存器的標誌位,來完成數據傳輸的具體操作),所以可以通

利用USB-I2C實現從機I2C收發資料

Ginkgo USB-I2C介面卡韌體從V2.8.17版本開始支援I2C從機功能,下面就針對這個功能的使用做簡單介紹。實現目的:1、I2C從機接收資料,也就是接收I2C主機的資料並顯示出來;2、I2C從機發送資料,也就是把資料傳輸到介面卡裡面後,主機能將這些資料讀出來;上位機測試軟體用Ginkgo_

WS2812燈珠(二)-- STM32 SPI+DMA方式驅動

    通過硬體SPI的可以很巧妙的模擬出WS2812的通訊時序,用spi的8位資料模擬ws281x的一位資料。 要將系統時鐘設定為56M,SPI分頻數設定為8,則SPI的通訊頻率為7M,1s/7M≈143ns 即傳輸一位資料的時間約為143納秒(ns)  3*14

網路是怎樣連線的學習筆記-第二章-收發資料(上)

2.3 收發資料 2.3.1 將 HTTP 請求訊息交給協議棧 當控制流程從 connect 回到應用程式之後,接下來就進入資料收發階段了。 資料收發操作是從應用程式呼叫 write 將要傳送的資料交給協議棧開始的,協議棧收到 資料後執行傳送操作,這一操作包含如下要點。 協議棧並不關心應用程式傳來的

簡單的C#TCP協議收發資料示例

參考:http://www.cnblogs.com/jzxx/p/5630516.html 一、原作者的這段話很好,先引用一下: Socket的Send方法,並非大家想象中的從一個埠傳送訊息到另一個埠,它僅僅是拷貝資料到基礎系統的傳送緩衝區,然後由基礎系統將傳送緩衝區的資料到連線的另一埠。值得一說的是,這

rdma通過netlink收發資料的堆疊

iproute2 中的子工具rdma 的呼叫堆疊,可以很清楚的看到如果通過socket傳送和接收資料的flow res_get_commpn_dumpit nldev_res_get_cq_dump netlink_dump __netlink_dump_start rdma_nl_rcv ne

STM32-準備:資料+開發環境

(資料說明:記錄資料對應晶片主要是:STM32F407,可能有些不是,但這些大部分是一些輔助性文件資料,作為參考) 一、STM32開發環境搭建 1.安裝keil5 2.破解keil5 3.安裝晶片包 4.安裝所需的軟體包:https://pan.baidu.com/s/1bQUiy_9TGz

基於51 微控制器的串列埠收發資料

在進行串列埠的收發資料過程中一定要注意波特率的問題。 大多數51微控制器用的都是11m晶振而只有少部分用的是奇葩的12m(樓主的就是),在12m晶振進行串列埠通訊時切忌要將波特率設定為4800以下,應為12m晶振的波特率在9600以上誤差很大容易丟失資料,動手能力強的可以折騰一下用定時器輸出96

STM32 SPI NSS大揭祕

      關於這個NSS我曾經為它頭痛了很久,看手冊,看程式,看視訊,看帖子,我都沒有徹底搞明白它。曾經幾次想徹底解決它,但是都夭折了,只能把自己寫好的筆記拋棄。還因此多慮導致氣血不足,上火,由此導致牙痛,嘴脣乾裂。簡直痛苦不已。那時候,我真的覺得我可

python 實現linux串列埠收發資料

使用python實現在linux平臺收發串列埠資料,原始碼如下: uart.py #!/usr/bin/python import serial,time,thread ser=serial.Serial('/dev/ttyS1', timeout=1) print s

STM32f407與STM32F103 串列埠採用DMA收發資料配置方法的異同

最近有個專案需要用到STM32F407ZET6這款晶片,其中有一個串列埠收發資料的應用。因為之前有用過STMF32F103ZET6通過DMA收發資料的方案,所以我打算移植之前的程式碼實現這個功能,STM32F103的DMA相關介紹參見STM32F103 DMA介紹 之前專案使用的程式碼如下:

RIPv1收發資料包詳解

       本文將詳解RIPv1收發路由更新的機制, 先來複習一下RIPv1,距離向量路由,廣播更新,不支援VLSM,CIDR,不支援認證,不支援手工彙總,不支援下一跳,不支援Tag欄位,所以可以看出,RIPv1非常的不方便且不安全,因為他無法手工彙總與認證