久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

STM32 SPI 注意要點

作者:佚名   來源:本站原創   點擊數:  更新時間:2014年01月22日   【字體:

        覺得SPI很簡單,所以從來沒有去仔細去看就直接用了,這次在調一個芯片的時候出現了一個比較奇怪的問題,以為是程序邏輯的問題,浪費了好幾天的時間都沒有找到原因。今天乖乖查閱了一些手冊,最后在《STM32不完全手冊》里找到了線索,現在索性對SPI做個總結。首先說最近碰到的問題。

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

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


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

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

關閉窗口

相關文章

主站蜘蛛池模板: 中文字幕在线视频免费视频 | 欧美激情欧美激情在线五月 | 91精品国产综合久久久久 | 久久久久久久一区 | 日韩国产精品一区二区三区 | 亚洲精品久久视频 | 久久精品小视频 | 亚洲一二视频 | 国产精品久久久久久久久久久免费看 | 午夜日韩 | 五月激情综合网 | 成人免费xxxxx在线视频 | av一区二区三区四区 | 日韩成人免费视频 | 亚洲欧美在线一区 | 欧美一级在线 | 羞羞视频在线观看免费观看 | jlzzxxxx18hd护士| 亚洲精品一区二区二区 | 国产精品久久久久久久久久久免费看 | 国产成人精品一区二区三区在线 | 日韩最新网址 | 亚洲综合在线播放 | 国产精品一区一区 | 国产在线精品一区 | 丁香久久 | 欧美九九| 国产视频久久 | 午夜精品久久久 | 久久日韩精品 | 欧美天堂在线 | 精品丝袜在线 | 国产激情偷乱视频一区二区三区 | 国产精品一区在线观看 | 久久国产精品视频 | 精品欧美一区二区在线观看视频 | 丁香久久 | 91精品久久久久久久久 | 欧美激情视频一区二区三区在线播放 | 亚洲精品一区二区三区中文字幕 | 欧美精品久久久久久久久久 |