chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(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)用都會(huì)使用到I2C通信。但在實(shí)際項(xiàng)目中作為I2C從機(jī)的應(yīng)用相對(duì)要少的多,本文主要講述關(guān)于【STM32F10x_硬件I2C主從通信】中STM32作為從機(jī)的例子。

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

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

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

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

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

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

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

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

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

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

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

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

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時(shí)鐘電平為高:

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

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

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

時(shí)序圖:

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

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

(IO模擬I2C時(shí)切記:請(qǐng)先將SCL變?yōu)榈碗娖剑俑淖僑DA電平狀態(tài))

時(shí)序圖:

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

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

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

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

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

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

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

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

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

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


2.時(shí)序圖(主機(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個(gè)參數(shù):數(shù)據(jù)BUF、數(shù)據(jù)長度、從設(shè)備地址


看過我前面主機(jī)讀寫EEPEOM代碼的人應(yīng)該很清楚,這里很相似。讀寫EEPROM比這里多了一個(gè)步驟,那就是多了寫數(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ī)類似,請(qǐng)參看源代碼或參考我之前文章的講述。

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

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

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


位于stm32f10x_it.c文件下。

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

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

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

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

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

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

    關(guān)注

    2

    文章

    81

    瀏覽量

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

    關(guān)注

    28

    文章

    1543

    瀏覽量

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

    關(guān)注

    0

    文章

    7

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    AT32F403A硬件I2C與從機(jī)通信

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

    第十八章 I2C通信測(cè)試

    本章介紹了I2C協(xié)議,其物理層用SDA和SCL雙線,支持多設(shè)備:協(xié)議層含起始/停止信號(hào)、應(yīng)答機(jī)制等。還講解W55MH32的I2C外設(shè)及初始化,并進(jìn)行了通信測(cè)試代碼的分析。
    的頭像 發(fā)表于 06-19 17:07 ?857次閱讀
    第十八章 <b class='flag-5'>I2C</b><b class='flag-5'>通信</b>測(cè)試

    STM32H7CubeMX配置硬件I2C,讀寫失敗是什么問題呀?

    STM32H7CubeMX配置硬件I2C,讀寫失敗什么問題呀,同樣的操作F4和F1都能正常使用,應(yīng)該不存在
    發(fā)表于 06-12 06:21

    ADuM2250/ADuM2251熱插拔雙通道I2C隔離器技術(shù)手冊(cè)

    ADuM2250/ADuM2251 為熱插拔數(shù)字隔離器,內(nèi)置非閂鎖雙向通信通道,且與I2C接口兼容。這樣就不需要將I2C信號(hào)分成單獨(dú)的發(fā)送信號(hào)與接收
    的頭像 發(fā)表于 06-06 14:22 ?825次閱讀
    ADuM2250/ADuM2251熱插拔雙通道<b class='flag-5'>I2C</b>隔離器技術(shù)手冊(cè)

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

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

    第十六章 一文淺談I2C

    本篇文章介紹了W55MH32的I2C總線,其由SDA和SCL構(gòu)成,具設(shè)備尋址等特點(diǎn),協(xié)議含起始 / 停止信號(hào)等。闡述主從模式,介紹了相關(guān)例程,用于驗(yàn)證 I2C 通信功能。
    的頭像 發(fā)表于 05-28 16:07 ?753次閱讀
    第十六章 一文淺談<b class='flag-5'>I2C</b>

    CYPD3177 I2C通信無應(yīng)答怎么解決?

    SOC端通過I2C與CYPD3177進(jìn)行通信,在讀芯片ID時(shí)(0x0002寄存器),主機(jī)發(fā)送數(shù)據(jù)后無應(yīng)答。目前SOC端和CYPD3177只連接了兩根
    發(fā)表于 05-12 07:10

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-I2C設(shè)備驅(qū)動(dòng)之Linux下的I2C驅(qū)動(dòng)簡介

    的物理細(xì)節(jié),如時(shí)鐘頻率、總線狀態(tài)管理、起始和停止條件等。I2C設(shè)備驅(qū)動(dòng):I2C設(shè)備驅(qū)動(dòng)是用于與特定I2C設(shè)備通信的軟件模塊。每個(gè)I2C設(shè)備都
    發(fā)表于 04-15 10:39

    飛凌嵌入式ElfBoard ELF 1板卡-I2C設(shè)備驅(qū)動(dòng)之Linux下的I2C驅(qū)動(dòng)簡介

    的物理細(xì)節(jié),如時(shí)鐘頻率、總線狀態(tài)管理、起始和停止條件等。I2C設(shè)備驅(qū)動(dòng):I2C設(shè)備驅(qū)動(dòng)是用于與特定I2C設(shè)備通信的軟件模塊。每個(gè)I2C設(shè)備都
    發(fā)表于 04-15 10:19

    I2C總線通信原理 如何設(shè)計(jì)I2C總線電路

    I2C總線通信原理 I2C(Inter-Integrated Circuit)總線是一種用于集成電路之間進(jìn)行通信的串行通信協(xié)議。它最早由飛利
    的頭像 發(fā)表于 01-31 15:01 ?1599次閱讀

    I2C總線的優(yōu)缺點(diǎn)分析

    設(shè)備之間的通信,這大大減少了所需的引腳數(shù)量,降低了硬件成本。此外,由于其簡單性,I2C總線也易于實(shí)現(xiàn)和維護(hù)。 2. 多主機(jī)和多從機(jī)支持 I2C
    的頭像 發(fā)表于 01-17 15:50 ?1557次閱讀

    I2C總線故障排除技巧

    導(dǎo)致整個(gè)系統(tǒng)的功能受到影響。 1. 檢查硬件連接 1.1 確認(rèn)電源和接地 首先,確保I2C設(shè)備的電源和接地連接正確無誤。不良的電源或接地連接可能導(dǎo)致信號(hào)不穩(wěn)定,從而引發(fā)通信錯(cuò)誤。 1.2 檢查總線線纜 檢查SDA和SCL線是否正
    的頭像 發(fā)表于 01-17 15:20 ?3361次閱讀

    I2C總線設(shè)備地址設(shè)置方法

    通常是一個(gè)7位或10位的數(shù)字,用于標(biāo)識(shí)總線上的每個(gè)設(shè)備。在7位尋址模式下,地址范圍是0x00到0x7F,而在10位尋址模式下,地址范圍是0x
    的頭像 發(fā)表于 01-17 15:17 ?5943次閱讀

    I2C總線應(yīng)用實(shí)例分析

    在現(xiàn)代電子系統(tǒng)中,I2C總線因其簡單、靈活和高效的特點(diǎn)而被廣泛應(yīng)用于各種設(shè)備之間的通信。 I2C總線概述 I2C總線由Philips(現(xiàn)為NXP)在1980年代初期開發(fā),最初用于音頻和
    的頭像 發(fā)表于 01-17 15:09 ?1056次閱讀

    RISC V的I2C操作

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