哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32F10x_硬件I2C主從通信 (輪詢發(fā)送,中斷接收)

黃工的嵌入式技術(shù)圈 ? 來源:黃工的嵌入式技術(shù)圈 ? 2020-03-25 10:59 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Ⅰ、寫在前面

關(guān)注我分享文章的朋友應該知道我在前面講述過(軟件、硬件)I2C主機控制從機EEPROM的例子。在I2C通信主機控制程序是比較常見的一種,可以說在實際項目中,很多應用都會使用到I2C通信。但在實際項目中作為I2C從機的應用相對要少的多,本文主要講述關(guān)于【STM32F10x_硬件I2C主從通信】中STM32作為從機的例子。

在學習本問內(nèi)容之前,如果對I2C協(xié)議還不太了解的朋友請先去了解一下I2C協(xié)議,或看我之前關(guān)于I2C通信的文章(我微信公眾號和博客都有)。

關(guān)于STM32硬件I2C作為從機的文章網(wǎng)上很少(我在寫本文之前也在百度、谷歌等網(wǎng)站上搜索了解過),我猜測大概的原因主要是兩點:1.使用該功能的人比較少; 2.說STM32硬件I2C存在BUG。

“使用該功能的人比較少”這個可以理解。其實我不能理解的是,普遍說這個有BUG的現(xiàn)象。我只覺得,你選擇了使用這個芯片來作為開發(fā),你選擇之前應該是認可它的,什么東西都不可能盡善盡美,一點小的瑕疵,只要可以避免就行。就像Windos系統(tǒng)一樣,偶爾死機、藍屏,但是你還是依然會選擇使用它。

關(guān)于STM32硬件I2C自身BUG也不否認,但官方給出了解決的辦法,作為程序員,解決一項BUG,也是對自身能力的一種提升。所以,遇到困難,勇于面對才是正確的做法。

實例實驗:

本文提供兩個實例:一個主機發(fā)送(硬件I2C輪詢發(fā)送數(shù)據(jù))、一個從機接收并打印接收數(shù)據(jù)(硬件I2C中斷接收數(shù)據(jù))。

主機間隔500ms發(fā)送10字節(jié),從機接收10字節(jié)檢測到I2C停止,將收到的數(shù)據(jù)通過串口打印出來。【發(fā)送的數(shù)據(jù)及長度可修改,從機自動檢測停止條件,也就是可以檢測得到主機發(fā)送了多少字節(jié)數(shù)據(jù)】

關(guān)于本文的更多詳情請往下看。

Ⅱ、實例工程下載

筆者針對于初學者提供的例程都是去掉了許多不必要的功能,精簡了官方的代碼,對初學者一看就明白,以簡單明了的工程供大家學習。

筆者提供的實例工程都是在板子上經(jīng)過多次測試并沒有問題才上傳至360云盤,歡迎下載測試、參照學習。

提供下載的軟件工程是基于Keil(MDK-ARM) V5版本、STM32F103ZE芯片,但F1其他型號也適用(適用F1其他型號: 關(guān)注微信,回復“修改型號”)。

STM32F10x_硬件I2C主機(發(fā)送數(shù)據(jù) - 輪詢方式)實例源代碼工程:

https://yunpan.cn/cMKS6muF6643V訪問密碼 8e16

STM32F10x_硬件I2C從機(接收數(shù)據(jù) - 中斷方式)實例源代碼工程:

https://yunpan.cn/cMKSMCkcn8tKv訪問密碼 f3ad

STM32F1資料:

https://yunpan.cn/crBUdUGdYKam2訪問密碼 ca90

Ⅲ、關(guān)于I2C協(xié)議

這里再次提示一下I2C協(xié)議重要的幾點:

1.開始和停止條件

SCL時鐘電平為高:

SDA數(shù)據(jù)線由高 -> 低 為總線開始條件;

SDA數(shù)據(jù)線由低 -> 高 為總線結(jié)束條件;

(IO模擬I2C時注意:開始之后將SCL變?yōu)榈碗娖?,防止誤操作SDA使其通信停止)

時序圖:

2.數(shù)據(jù)位傳輸

SCL時鐘電平為低, 可以改換SDA數(shù)據(jù)線的電平,在SCL上升沿的過程將SDA數(shù)據(jù)發(fā)送出去。

(IO模擬I2C時切記:請先將SCL變?yōu)榈碗娖?,再改變SDA電平狀態(tài))

時序圖:

3.數(shù)據(jù)傳輸

I2C是以字節(jié)(8位)的方式進行傳輸,總線上每傳輸完1字節(jié)之后會有一個應答信號,主器件(主機)需要產(chǎn)生對應的一個額外時鐘。

傳輸格式:8位數(shù)據(jù) + 1位應答

數(shù)據(jù)傳輸必須帶響應,相關(guān)的響應時鐘脈沖由主機產(chǎn)生,在響應的時鐘脈沖期間,發(fā)送器釋放 SDA 線(高)。

在響應的時鐘脈沖期間 接收器必須將 SDA 線拉低,使它在這個時鐘脈沖的高電平期間保持穩(wěn)定的低電平。

應答位的產(chǎn)生及接收:

1.在(主機)寫數(shù)據(jù)的時候是從機應答(給主機),主機檢測;

2.在(主機)讀數(shù)據(jù)的時候是主機應答(給從機),從機檢測;

(這里可以借助I2C讀寫函數(shù)一起理解)

1.時序圖(主機寫,從機應答,主機讀取應答):


2.時序圖(主機讀,主機產(chǎn)生應答):

更多關(guān)于I2C協(xié)議的文檔可以網(wǎng)上查詢,也可以參看我下面下載鏈接的文檔(周立功翻譯的版本):https://yunpan.cn/cMJxKJzpWFtHE訪問密碼 82f3

Ⅳ、硬件I2C主機發(fā)送數(shù)據(jù)

硬件I2C主機的配置其實很簡單,和前面讀寫EEPROM的(主機)配置一樣。

可參考我之前的文章:STM32F10x_模擬I2C讀寫EEPROM

這里就不再描述。主要講述一下主機發(fā)送數(shù)據(jù)這一塊的代碼。

我封裝的發(fā)送數(shù)據(jù)函數(shù):

I2C_Master_BufferWrite(uint8_t* pBuffer, uint32_t NumByteToWrite, uint8_t SlaveAddress)

主要就是3個參數(shù):數(shù)據(jù)BUF、數(shù)據(jù)長度、從設(shè)備地址


看過我前面主機讀寫EEPEOM代碼的人應該很清楚,這里很相似。讀寫EEPROM比這里多了一個步驟,那就是多了寫數(shù)據(jù)地址的步驟。

必須要有的三大步驟:

1.開始

2.設(shè)備地址/寫

3.停止

主程序間隔500ms調(diào)用一次該函數(shù),發(fā)送一串(我們定義10字節(jié)),從機也是間隔500ms收到一串數(shù)據(jù)并打印出來。

Ⅴ、硬件I2C從機中斷接收數(shù)據(jù)

硬件I2C的從機接收數(shù)據(jù)一般分為三類:中斷接收、DMA接收和輪詢接收;

在實際項目中中斷接收和DMA接收比較常見,因為不用占據(jù)CPU資源,有數(shù)據(jù)來了才響應接收【需要CPU具有硬件I2C功能】。

而輪詢接收數(shù)據(jù)很占用CPU資源,一般是CPU沒有硬件I2C資源,處理的數(shù)據(jù)不多的情況下。

硬件I2C從機配置I2C這一塊比較簡單,和上面主機類似,請參看源代碼或參考我之前文章的講述。

可參考我之前的文章:STM32F10x_模擬I2C讀寫EEPROM

提醒:配置中注意關(guān)于I2C事件中斷這一塊(請看源代碼)。

中斷接收函數(shù)源代碼如下:


位于stm32f10x_it.c文件下。

進入I2C事件中斷,判斷是I2C從機事件,此時,作為從機接收數(shù)據(jù)需要檢測三個標示:

1.檢測主機已發(fā)生地址(ADDR = 1);

2.檢測有接收數(shù)據(jù)(RXNE = 1);

3.檢測到停止條件(STOPF =1)。

硬件I2C通信中,起始條件由硬件判斷完成,我們檢測的就需要這幾步就能完成基本的接收數(shù)據(jù)功能。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • STM32F10x
    +關(guān)注

    關(guān)注

    2

    文章

    82

    瀏覽量

    21401
  • I2C
    I2C
    +關(guān)注

    關(guān)注

    28

    文章

    1562

    瀏覽量

    131709
  • 主從通信
    +關(guān)注

    關(guān)注

    0

    文章

    7

    瀏覽量

    3647
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    ISO164x熱插拔雙向I2C隔離器:特性、應用與設(shè)計要點

    ISO164x熱插拔雙向I2C隔離器:特性、應用與設(shè)計要點 在電子工程師的日常設(shè)計中,可靠的通信隔離器件至關(guān)重要。ISO164x熱插拔雙向I2C
    的頭像 發(fā)表于 12-17 14:15 ?959次閱讀

    CW32 I2C接口的主要特性

    CW32F030 內(nèi)部集成 2I2C 控制器,能按照設(shè)定的傳輸速率(標準,快速,高速)將需要發(fā)送的數(shù)據(jù)按照 I2C規(guī)范串行
    發(fā)表于 12-16 07:51

    I2C的總線協(xié)議

    用狀態(tài)。 I2C 通信采用主從結(jié)構(gòu),并由主機發(fā)起和結(jié)束通信。主機通過發(fā)送 START 起始信號來發(fā)起
    發(fā)表于 12-15 08:07

    CW32單片機I2C接口來讀寫EEPROM芯片

    一、概述 CW32L083 內(nèi)部集成 2I2C 控制器,能按照設(shè)定的傳輸速率(標準,快速,高速)將需要發(fā)送的數(shù)據(jù)按照 I2C 規(guī)范串行發(fā)送
    發(fā)表于 12-09 07:43

    I2C的狀態(tài)碼

    I2C 總線狀態(tài)通過 I2C 狀態(tài)寄存器 I2Cx_STAT 來標識,共 26 個正常接收發(fā)送狀態(tài),和
    發(fā)表于 12-08 08:04

    I2C使用10位地址進行主機發(fā)送從機接收

    I2C使用10位地址進行主機發(fā)送從機接收 示例下載 目的:演示AT32F403Axx I2C使用
    發(fā)表于 11-19 13:10

    I2C使用10位地址進行主機接收從機發(fā)送

    I2C使用10位地址進行主機接收從機發(fā)送 示例下載 目的:演示AT32F403Axx I2C使
    發(fā)表于 11-19 13:07

    SPI、I2CI2S、UART:通信協(xié)議解釋

    , SCLK, CS) 全雙工、主從 高速(可達幾十 MHz) Flash、傳感器、顯示屏 硬件簡單、速率高,但線多,擴展性差 I2C Int
    的頭像 發(fā)表于 11-18 10:53 ?707次閱讀

    基于芯源CW32F030 MCU的I2C通信及應用

    。 I2C的主要特點: 雙向通信:同一條數(shù)據(jù)線可用于發(fā)送接收數(shù)據(jù)。 多主多從架構(gòu):支持多個主設(shè)備和從設(shè)備。 簡單的硬件設(shè)計:只需要兩根信
    發(fā)表于 11-18 08:29

    AT32F4xx I2C使用輪詢模式進行主機發(fā)送從機接收

    AT32F4xx I2C使用輪詢模式進行主機發(fā)送從機接收 示例目的 演示AT32F403Ax
    發(fā)表于 11-05 14:00

    AT32F4xx I2C使用輪詢模式進行主機接收從機發(fā)送

    AT32F4xx I2C使用輪詢模式進行主機接收從機發(fā)送 示例目的 演示AT32F403Axx
    發(fā)表于 11-05 13:58

    I2C使用輪詢模式進行主機接收從機發(fā)送

    I2C使用輪詢模式進行主機接收從機發(fā)送演示AT32F403Axx I2C使用
    發(fā)表于 10-20 16:32

    AT32F403A硬件I2C與從機通信

    示例目的 演示AT32F403A硬件I2C與從機通信。 注:本應用筆記對應的代碼是基于雅特力提供的V2.x.x 板級支持包(BSP)而開發(fā)
    發(fā)表于 09-10 16:59

    STM32F103 I2C從機接收數(shù)據(jù)的問題

    我使用STM32F103做一個I2C從機接收數(shù)據(jù)的功能,通過查閱函數(shù)手冊,使用了2種方法 方法1: 1、調(diào)用HAL_I2C_EnableLi
    發(fā)表于 06-06 12:29

    CYPD3177 I2C通信無應答怎么解決?

    SOC端通過I2C與CYPD3177進行通信,在讀芯片ID時(0x0002寄存器),主機發(fā)送數(shù)據(jù)后無應答。目前SOC端和CYPD3177只連接了兩根
    發(fā)表于 05-12 07:10
    庐江县| 友谊县| 志丹县| 舞阳县| 荥经县| 纳雍县| 博湖县| 尼玛县| 曲靖市| 南岸区| 昔阳县| 琼中| 西乌| 堆龙德庆县| 胶州市| 杭州市| 科尔| 衡南县| 苏州市| 曲周县| 弥渡县| 保靖县| 洞头县| 棋牌| 保山市| 余江县| 永宁县| 辰溪县| 平定县| 石棉县| 澳门| 瓮安县| 建阳市| 新源县| 贵溪市| 琼海市| 南皮县| 汉川市| 囊谦县| 房山区| 浮梁县|