在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

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

黃工的嵌入式技術(shù)圈 ? 來源:黃工的嵌入式技術(shù)圈 ? 2020-03-25 10:59 ? 次閱讀

Ⅰ、寫在前面

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

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

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

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

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

實(shí)例實(shí)驗(yàn):

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

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

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

Ⅱ、實(shí)例工程下載

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

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

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

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

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

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

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

STM32F1資料

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

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

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

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)榈碗娖剑俑淖僑DA電平狀態(tài))

時序圖:

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

這里就不再描述。主要講述一下主機(jī)發(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è)備地址


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

必須要有的三大步驟:

1.開始

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

3.停止

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

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

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

在實(shí)際項(xiàng)目中中斷接收和DMA接收比較常見,因?yàn)椴挥谜紦?jù)CPU資源,有數(shù)據(jù)來了才響應(yīng)接收【需要CPU具有硬件I2C功能】。

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

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

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

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

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


位于stm32f10x_it.c文件下。

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

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

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

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

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

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

    關(guān)注

    1

    文章

    81

    瀏覽量

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

    關(guān)注

    28

    文章

    1489

    瀏覽量

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

    關(guān)注

    0

    文章

    7

    瀏覽量

    3539
收藏 人收藏

    評論

    相關(guān)推薦

    RISC V的I2C操作

    。tsuData中,1代表10ns;Timeout中,1表示10nstLow和tHigh的1代表10ns10.1.3 軟件部分(Risc V)l? I2C
    的頭像 發(fā)表于 11-01 11:06 ?223次閱讀

    簡單認(rèn)識I2C通信協(xié)議

    I2C(Inter-Integrated Circuit)通信協(xié)議是由飛利浦公司(現(xiàn)為恩智浦半導(dǎo)體)開發(fā)的一種簡單、雙向二線制同步串行總線協(xié)議。自1982年發(fā)布以來,I2C協(xié)議因其高效、靈活和易于實(shí)現(xiàn)的特點(diǎn),在電子設(shè)備間的數(shù)據(jù)交
    的頭像 發(fā)表于 07-25 18:06 ?1501次閱讀

    CH32V003教程--兩線通信總線(I2C

    SMBus 概述   I2C 是半雙工的總線,它同時只能運(yùn)行在下列四種模式中之一:主設(shè)備發(fā)送模式、主設(shè)備接收模式、從設(shè)備發(fā)送模式和從設(shè)備接收
    發(fā)表于 07-21 19:57

    stm32f030的硬件i2c中斷方式讀寫數(shù)據(jù),為什么調(diào)試不出來?

    有沒有哪位大神用過stm32f030的硬件i2c中斷方式讀寫數(shù)據(jù)的?看文檔感覺可以用的,但是怎么就是調(diào)試不出來呢。
    發(fā)表于 05-11 08:02

    求助,關(guān)于STM32F412 I2C從模式HAL庫使用方法的疑問求解

    最近在做一個類似I2C hub的開發(fā),需要一個I2C做從機(jī),4個I2C做主機(jī)轉(zhuǎn)發(fā)從機(jī)接收到的內(nèi)容,選用了STM32F412這顆料,包含四路
    發(fā)表于 04-22 07:47

    用STM8S207硬件I2C調(diào)試用輪詢的方式,一旦加入中斷I2C的時序就出現(xiàn)了問題,為什么?

    用STM8S207 硬件I2C調(diào)試用輪詢的方式發(fā)現(xiàn)如果不加入其它中斷可以正常運(yùn)行,一旦加入中斷I2C
    發(fā)表于 04-19 07:49

    逼真動畫展示I2C、SPI、UART的通信過程

    串行通信協(xié)議,通常用于連接低速設(shè)備,如傳感器、存儲器和其他外設(shè)。它使用兩根線(SCL和SDA)來實(shí)現(xiàn)雙向通信,具有地址定向性和主從模式。優(yōu)點(diǎn):多設(shè)備支持:I2C
    的頭像 發(fā)表于 04-12 08:27 ?998次閱讀
    逼真動畫展示<b class='flag-5'>I2C</b>、SPI、UART的<b class='flag-5'>通信</b>過程

    STM32L4 I2C主從通信,第一次通信成功,第二次只檢測一次中斷就卡住了為什么?

    STM32L4 通過I2C方式組成主機(jī)——從機(jī)通信(主機(jī)從機(jī)都是stm32L431),主機(jī)給從機(jī)第一次發(fā)送消息能夠成功,但是從機(jī)返回信息就會
    發(fā)表于 03-29 08:32

    請問STM32F103 I2C通信和SPI通信哪種方式更穩(wěn)定?

    STM32F103這顆料I2C通信和SPI通信哪種方式更穩(wěn)定?
    發(fā)表于 03-22 06:24

    STM32F103ZET6的I2C硬件輪詢方式作為主發(fā)送數(shù)據(jù),第一次發(fā)送數(shù)據(jù)會出現(xiàn)等待從機(jī)ACK錯誤怎么解決?

    STM32F103ZET6的開發(fā)板,MCU作為主I2C,用I2C硬件輪詢的方式讀寫一個I2C從設(shè)
    發(fā)表于 03-20 06:25

    GD32 MCU硬件I2C不可靠不如軟件I2C?來看看紅楓派開發(fā)版的硬件I2C驅(qū)動如何做到穩(wěn)得一批

    在一個評論中,看到網(wǎng)友對硬件I2C的討論,硬件I2C Busy找不到原因、軟件I2C穩(wěn)得一批。
    的頭像 發(fā)表于 02-23 09:37 ?2803次閱讀
    GD32 MCU<b class='flag-5'>硬件</b><b class='flag-5'>I2C</b>不可靠不如軟件<b class='flag-5'>I2C</b>?來看看紅楓派開發(fā)版的<b class='flag-5'>硬件</b><b class='flag-5'>I2C</b>驅(qū)動如何做到穩(wěn)得一批

    如何配置TC38x I2C中斷

    我們的項(xiàng)目有 MCAL,但是 Loader 只是一個 while 循環(huán),不要使用操作系統(tǒng)模塊。 我們已經(jīng)通過輪詢模式實(shí)現(xiàn)了 I2C 通信,然后我們想切換到中斷模式。 我們?nèi)绾?CAN
    發(fā)表于 01-29 07:42

    stm32 I2c硬件驅(qū)動程序不穩(wěn)定該怎么解決?

    stm32 I2c硬件驅(qū)動程序不穩(wěn)定該怎么解決? stm32I2C 硬件驅(qū)動程序不穩(wěn)定可能
    的頭像 發(fā)表于 01-16 17:11 ?3071次閱讀

    使用兩片ADU360進(jìn)行I2C通信,當(dāng)與從機(jī)進(jìn)行通信時,從機(jī)無法進(jìn)入I2C中斷是為什么?

    問題說明:使用兩片ADU360進(jìn)行I2C通信,主機(jī)使用IO口模擬方式,從機(jī)使用內(nèi)部外設(shè) 主機(jī)IO口模擬方式,確認(rèn)是可行,當(dāng)與從機(jī)進(jìn)行通信時,從機(jī)無法進(jìn)入I2C
    發(fā)表于 01-15 06:47

    aduc7026做I2C slave,接收數(shù)據(jù)存在的疑問求解

    =FIQ_Handler; FIQEN = 0x200;while(1){}} 核心接收測試代碼是這樣的,主機(jī)我換過3種不同型號的開發(fā)板,通過I2C和aduc7026通信,連續(xù)
    發(fā)表于 01-12 06:03
    主站蜘蛛池模板: 黄色永久免费| 在线你懂得| 97人摸人人澡人人人超一碰| 香蕉爱爱网| 看黄网站在线看| 一起射综合网| 免费看欧美一级片| 伊人网综合视频| 午夜影院404| 国产精品资源站| 起碰成人免费公开网视频| 一级特黄色毛片免费看| 亚洲国产欧美在线人成aaa| 国产精品护士| 在线观看视频网站| 亚洲情欲网| 中国一级特黄真人毛片免费看| 中文字幕在线一区二区在线| 亚洲精品免费视频| 亚洲一卡二卡三卡| 一级毛片日韩| 色多多在线播放| 四虎影院在线免费| 我想看一级黄色片| 亚洲激情视频| 亚洲已满18点击进入在线观看| 四虎永久在线精品免费观看地址| 欧美视频精品一区二区三区| 国模精品| 国产美女特级嫩嫩嫩bbb| 一级片在线免费看| 99久久久精品| 全免费一级午夜毛片| 奇米影视亚洲四色8888| www.夜夜爽| 轻点太大了好深好爽h文| 人人澡人人添| 天堂免费视频| 国产一级做a爰大片免费久久| 国产图片区| 手机看片国产免费永久|