新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > stm32學習筆記--spi與iic

        stm32學習筆記--spi與iic

        作者: 時間:2016-11-27 來源:網絡 收藏
        關于上次說的要改程序的問題,
        //讀ADXL345寄存器
        //addr:寄存器地址
        //返回值:讀到的值
        u8 ADXL345_RD_Reg(u8 addr)
        {
        u8 temp=0;
        IIC_Start();
        IIC_Send_Byte(ADXL_WRITE); //發送寫器件指令
        temp=IIC_Wait_Ack();
        IIC_Send_Byte(addr); //發送寄存器地址
        temp=IIC_Wait_Ack();
        IIC_Start(); //重新啟動
        IIC_Send_Byte(ADXL_READ); //發送讀器件指令
        temp=IIC_Wait_Ack();
        temp=IIC_Read_Byte(0); //讀取一個字節,不繼續再讀,發送NAK
        IIC_Stop(); //產生一個停止條件
        return temp; //返回讀到的值
        }
        這段寫寄存器代碼,不理解temp為什么要被頻繁的賦值,去掉后,宏觀看來對結果沒有影響。第二個不理解的地方是為什么在發送寄存器地址之后要從新啟動一次,因
        為在相似的寫寄存器函數中,在相同的位置不存在重啟代碼。注釋掉該句之后顯示“ADXL345 error”。
        這兩天主要看了三軸加速度計的程序,雖然例程里的能看懂,但是在四軸里的程序卻不那么容易,我甚至不明白為什么他要自己寫一個iic的函數,我打算接下來把它的
        程序和例程里的程序對照來看,看能不能找到什么頭緒。
        下面是對以前學過內容的總結:
        對位的尋址操作
        為了實現對SARM、I/O外設空間中某一位的操作,在尋址空間(4GB)另一地方取個別名區空間,從這地址開始,每一個字(32bit)就對應SRAM或I/O的一位。即原來每
        個字節用一個地址,現在給字節中的每個位一個地址,實現了對位的尋址。
        spi與iic之間各自的優劣
        1 硬件連接的優劣
        SPI是[單主設備( single-master )]通信協議,這意味著總線中的只有一支中心設備能發起通信。當SPI主設備想讀/寫[從設備]時,它首先拉低[從設備]對應
        的SS線(SS是低電平有效),接著開始發送工作脈沖到時鐘線上,在相應的脈沖時間上,[主設備]把信號發到MOSI實現“寫”,同時可對MISO采樣而實現“讀”。
        主從設備必須使用相同的工作參數——SCLK、CPOL 和 CPHA,才能正常工作。如果有多個[從設備],并且它們使用了不同的工作參數,那么主設備必須在讀寫不同從設
        備間重新配置這些參數。
        I²C 是多主設備的總線,I²C沒有物理的芯片選擇信號線,沒有仲裁邏輯電路,只使用兩條信號線—— „serial data? (SDA) 和 „serial clock? (SCL)。
        從上面的分析可以看出,在需要多個從設備的時候,iic比spi需要更少的信號線。
        2 速度比較
        spi為全雙工,速度可以達到10M,而iic快速模式為1M,需要額外I/O緩沖區的高速模式也才3.4M。
        3 總結
        I²C的優點在于它的特色——用很輕盈的架構實現了多主設備仲裁和設備路由。但是對使用的工程師來講,理解總線結構更費勁,而且總線的性能不高。
        SPI的優點在于-------它的結構相當的直觀簡單,容易實現,并且有很好擴展性。SPI的簡單性不足稱其優雅,因為要用SPI搭建一個有用的通信平臺,還需要在SPI之上構建特定的通信協議軟件。也就是說要想獲得SPI特有而IIC沒有的特性——高速性能,工程師們需要付出更多的勞動。另外,這種自定的工作是完全自由的,這也說明為什么SPI沒有官方標準。I²C和SPI都對低速設備通信提供了很好的支持,不過,SPI適合數據流應用,而I²C更適合“字節設備”的多主設備應用。


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 宣恩县| 正阳县| 临沭县| 兴文县| 绥宁县| 霞浦县| 富顺县| 秦安县| 会泽县| 韩城市| 丹寨县| 通山县| 乐业县| 农安县| 宁河县| 留坝县| 深水埗区| 汾西县| 武威市| 清镇市| 莒南县| 肃宁县| 平顶山市| 新乐市| 梁山县| 清镇市| 富裕县| 三亚市| 辽中县| 呈贡县| 苗栗县| 铁力市| 建瓯市| 庆云县| 衡阳市| 水城县| 汨罗市| 定远县| 额济纳旗| 锡林郭勒盟| 屯昌县|