<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > STM32 SPI 注意要點(diǎn)

STM32 SPI 注意要點(diǎn)

作者: 時(shí)間:2016-12-01 來(lái)源:網(wǎng)絡(luò ) 收藏
覺(jué)得SPI很簡(jiǎn)單,所以從來(lái)沒(méi)有去仔細去看就直接用了,這次在調一個(gè)芯片的時(shí)候出現了一個(gè)比較奇怪的問(wèn)題,以為是程序邏輯的問(wèn)題,浪費了好幾天的時(shí)間都沒(méi)有找到原因。今天乖乖查閱了一些手冊,最后在《STM32不完全手冊》里找到了線(xiàn)索,現在索性對SPI做個(gè)總結。首先說(shuō)最近碰到的問(wèn)題。

問(wèn)題一:錯以為SPI的讀數據,直接讀取SPIx->DR寄存器就可以完成。
這個(gè)問(wèn)題我一直沒(méi)注意,十分慚愧。原來(lái)SPI的時(shí)鐘只有在往DR寄存器里面寫(xiě)數據的時(shí)候才會(huì )產(chǎn)生,讀是不會(huì )產(chǎn)生的(暫時(shí)沒(méi)有從哪個(gè)資料中得到確認,不過(guò)我猜就是這樣)。所以要讀取slave發(fā)過(guò)來(lái)的數據,master必須先發(fā)一個(gè)“DUMMY”數據,這個(gè)數據內容不重要,目的只是為了產(chǎn)生一組clock給 slave,slave的數據就沿著(zhù)這一組clock給發(fā)了出來(lái)。
master給slave讀寫(xiě)數據的過(guò)程是這樣的:
寫(xiě):master對DR寫(xiě)數據,產(chǎn)生clock,同時(shí)數據從MOSI管腳移位發(fā)送到slave的MOSI管腳;
讀:master對DR寫(xiě)DUMMy,產(chǎn)生clock,同時(shí)DUMMy由MOSI發(fā)給slave(這個(gè)數據沒(méi)有意義),同時(shí)讀取的數據從slave的MISO管腳移位發(fā)送到master的MISO管腳。

問(wèn)題二:在配置為雙線(xiàn)全雙工的時(shí)候,如上面所說(shuō),在master寫(xiě)數據的時(shí)候,其實(shí)stm32的SPI同時(shí)也往master的DR寄存器里面讀進(jìn)數據(讀寫(xiě)雖然都是DR,其實(shí)是兩個(gè)不同的寄存器)。對這點(diǎn)的忽略,就是這次問(wèn)題產(chǎn)生的原因。
我在對采集芯片讀取數據之前,需要向芯片發(fā)送一個(gè)讀取數據的指令,在發(fā)送指令后,理論來(lái)說(shuō)采集芯片會(huì )自動(dòng)等待發(fā)送數據過(guò)來(lái),只要我stm32這邊發(fā)一個(gè) DUMMy產(chǎn)生一組clock,然后就可以從DR中讀取數據。但是由于在發(fā)送讀取指令的時(shí)候,其實(shí)STM32也同時(shí)也把一個(gè)無(wú)用的數據讀到DR里面去了,這個(gè)數據在沒(méi)有被取走之前,是不會(huì )再接受新的數據的,所以在后來(lái)發(fā)送DUMMY的時(shí)候,讀寄存器DR并沒(méi)有更新,所以讀到的數據自然是錯的。
解決方法是,在發(fā)送指令之后,讀一次數據,清除DR,以便接收下個(gè)數據。


下面對SPI其他要點(diǎn)做一些總結。
管腳定義:
MISO:主設備輸入/從設備輸出
MOSI:主設備輸出/從設備輸入
SCK:串口時(shí)鐘,作為主設備的輸出,從設備的輸入
NSS:從設備選擇

對于NSS,對于從設備,輸入低電平表示選擇該從設備,這個(gè)信號在硬件NSS模式時(shí),由NSS管腳提供;在軟件NSS模式時(shí),由內部SSI位控制,NSS管腳可以用作普通IO使用。
對于主設備,如果NSS輸出被使能,NSS會(huì )輸出低電平,可以與從設備的NSS相連,當從設備為硬件NSS模式時(shí),將自動(dòng)變成從SPI設備(不允許多主環(huán)境);如果NSS輸出被關(guān)閉:允許操作于多主環(huán)境。


關(guān)鍵詞: STM32SPI注意要

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>