精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

STM32F10x _硬件I2C讀寫EEPROM(標準外設庫版本)

黃工的嵌入式技術圈 ? 來源:黃工的嵌入式技術圈 ? 2020-03-25 11:11 ? 次閱讀

本文主要內容:STM32硬件I2C詳細配置、EEPROM(AT24Xxx)多字節(jié)讀寫操作、ST官方I2C存在問題。

實例實驗效果:

1、多字節(jié)讀寫:任意地址(66), 寫入任意長度(129)、讀取并打印出來

2、單字節(jié)讀寫:任意地址(0),寫入1字節(jié)數(shù)據(jù)、 讀取并打印出來


實驗說明:

1.多字節(jié)讀寫

實驗為什么是從66地址寫? 為什么是寫入129字節(jié)?

答案:驗證對EEPROM多字節(jié)“非標準地址、長度”讀寫的準確性。

我是使用AT24C128芯片,頁大小是64字節(jié),我從66地址,就是驗證非標準地址(如:0、64、128等)開始讀寫; 寫入長度129字節(jié)也是驗證非標準長度(如:64、128、256等)的讀寫。

2.單字節(jié)讀寫

我這樣實驗的目的,相信大家都能理解。驗證每一次寫入字節(jié)數(shù)據(jù) 和讀出的數(shù)據(jù)是都一致。

關于本文的更多詳情請往下看。

Ⅱ、實例工程下載

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

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

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

STM32F10x_硬件I2C讀寫EEPROM(標準外設庫版本)實例源代碼工程:

http://yunpan.cn/c6b8d4mCTPpCj訪問密碼 a371

STM32F107VC_硬件I2C讀寫EEPROM(標準外設庫版本)實例源代碼工程:

http://yunpan.cn/c6b8HGnAGG4Mf訪問密碼 2a18

I2C EEPROM(AT24xx)資料:

https://yunpan.cn/c667rIDPgvwTf訪問密碼 1099

STM32F1資料:

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

Ⅲ、硬件I2C配置

硬件I2C的配置其實很簡單,RCC時鐘、GPIO、I2C配置等。筆者以F1標準外設庫(同時也建議初學者使用官方的標準外設庫)為基礎建立的工程,主要以庫的方式來講述(若您的F1芯片與提供工程不一樣,可微信回復“修改型號”)。

1.RCC時鐘源


該函數(shù)位于bsp.c文件下面;

RCC是很多初學者,甚至已經(jīng)工作的朋友容易遺漏的地方,有很多朋友覺得它使用的外設不正常,很大部分是沒有配置RCC導致的。

重點注意:

A.外設RCC時鐘的配置要在其外設初始化的前面;

B.匹配對應時鐘。

比如:RCC_APB2外設不要配置在RCC_APB1時鐘里面

【如:RCC_APB1PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);這樣能編譯通過,但這是錯誤的代碼】

2.I2C引腳配置


該函數(shù)位于i2c_ee.c文件下面;

1.使用硬件I2C:GPIO_Mode_AF_OD復用開漏模式

2.由于使用硬件I2C,不像使用模擬I2C使用IO操作,所以這里引腳定義的比較“死”GPIO_Pin_6 | GPIO_Pin_7。

如果你使用I2C2或者引腳映射,這里的引腳也要跟著改變。

3.I2C配置


該函數(shù)位于i2c_ee.c文件下面;

這個函數(shù)才是本文的重點:

1.I2C模式:I2C_Mode = I2C_Mode_I2C;

硬件有多種模式:

I2C_Mode_I2C: I2C模式

I2C_Mode_SMBusDevice: SMBus設備(叢機)模式

I2C_Mode_SMBusHost: 主機模式

2.I2C占空比:I2C_DutyCycle = I2C_DutyCycle_2;

這個參數(shù)在快速I2C模式下有效,也就是速度大于100KHz。

I2C_DutyCycle_2:2比1占空比

I2C_DutyCycle_16_9:16比9占空比

感興趣的朋友可以把時鐘配置高于100KHz(如:400KHz),用示波器測一下SCL引腳,可以看得出來占空比不一樣。

3.I2C設備地址:I2C_OwnAddress1 = EEPROM_DEV_ADDR;

這個參數(shù)是第一個設備(從機)的地址,EEPROM_DEV_ADDR是我們自己宏定義的設備地址。

4.I2C應答:I2C_Ack = I2C_Ack_Enable;

這個參數(shù)的含義請結合上一篇文章“I2C協(xié)議”來理解。

5.地址位數(shù):I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;

這個參數(shù)就是設備地址位數(shù),需要和后面函數(shù)“I2C_Send7bitAddress”一致。

6.I2C速度:I2C_ClockSpeed = I2C_SPEED;

這個參數(shù)很好理解,I2C_SPEED是我們宏定義的值“100000”,也就是100KHz的意思。

Ⅳ、硬件I2C讀寫EEPROM配置

上一篇文章簡單提及了一下EEPROM單字節(jié)的讀寫,提供了多字節(jié)讀寫實例,但沒有具體描述多字節(jié)的具體操作。

下面將詳細描述一下單字節(jié)讀寫和多字節(jié)讀寫的操作。請下載“I2C EEPROM資料”和“實例工程”作為參考。

在對EEPROM(AT24Cxx)讀寫操作之前需要理解兩個參數(shù)(可見源代碼i2c_ee.h文件):

A.“數(shù)據(jù)字”地址長度:也就是存數(shù)據(jù)的地址有多少位。具體分類(見數(shù)據(jù)手冊)如下:

8位: AT24C01、AT24C02

16位: AT24C04、AT24C08、AT24C16、AT24C32、AT24C64、AT24C128、AT24C256、AT24C512

B.頁長度:在進行連續(xù)寫的時候,最長可寫一頁,寫完這一頁之后需要指定下一頁地址才行,否則會在上一頁循環(huán)寫。具體分類(見數(shù)據(jù)手冊)如下:

8字節(jié): AT24C01、AT24C02

16字節(jié): AT24C04、AT24C08、AT24C16

32字節(jié): AT24C32、AT24C64

64字節(jié): AT24C128、AT24C256

128字節(jié): AT24C512

1.單字節(jié)寫

時序圖:


截圖來自“AT24C128C數(shù)據(jù)手冊”,單字節(jié)寫主要分5個步驟:

1.開始

2.設備地址/寫

3.數(shù)據(jù)地址

4.寫一字節(jié)數(shù)據(jù)

5.停止

源程序:


在操作硬件I2之前需要檢測I2C是否處于“忙”狀態(tài)。數(shù)據(jù)地址根據(jù)長度不同而寫入的不同。

2.單字節(jié)讀(隨機)

時序圖:


截圖來自“AT24C128C數(shù)據(jù)手冊”,單字節(jié)讀(也是隨機讀)主要分7個步驟:

1.開始

2.設備地址/寫

3.數(shù)據(jù)地址

4.重新開始

5.設備地址/讀

6.讀一字節(jié)數(shù)據(jù)

7.停止

源程序:


這里就提醒一點,單字節(jié)讀和多字節(jié)讀的應答位,由于不連續(xù)讀,這里產生非應答。

3.頁寫

時序圖:


截圖來自“AT24C128C數(shù)據(jù)手冊”,頁寫和單字節(jié)寫的區(qū)別在于“連續(xù)寫”。

注意:這里頁寫的意思是在指向地址的頁寫數(shù)據(jù),也就是EEPROM內部“地址指針”指向的地址所在頁。每次寫之前我們都要將“地址指針”指向一個地址(見下面源程序),寫的過程中,一旦寫到最后一個字節(jié),將會回到該頁首地址繼續(xù)寫下去,因此,寫完該頁,我們需要重新將“地址指針”指向下一頁首地址。

【芯片頁的大小根據(jù)芯片不同而不同,見本章開頭描述】

源程序:


寫最后一字節(jié)獨立出來是有原因的:防止HardFault_Handler。

4.多字節(jié)寫

源程序:


“多字節(jié)寫”是基于“頁寫”的基礎上寫的,從上面頁寫的描述(寫到該頁最后一字節(jié)會回到該頁首地址)可以知道多字節(jié)寫是要考慮很多情況的,否則會破壞其他數(shù)據(jù)。

上面源程序截取了簡單的一部分:開始寫的地址剛好位于該頁首地址這種情況。在頁首地址開始寫數(shù)據(jù)情況下,要判斷需要寫的數(shù)據(jù)的大小是否有多頁。

【上面這種情況是比較簡單的一種,還有其他情況,我不在這里講述,希望初學的你多去理解一下,這也是參考ST官方的思路,而且有利于你們編程的思想】

5.多字節(jié)讀

時序圖:


截圖來自“AT24C128C數(shù)據(jù)手冊”,多字節(jié)讀需要注意應答。

在多字節(jié)讀到最后一位數(shù)據(jù)之前,必須產生應答位,而最后一位產生非應答位。請結合下面源程序理解。

源程序:


和單字節(jié)讀比:前面第1步到第5步都是一樣的,重點請看第6步,這里產生的應答需要注意。

Ⅴ、ST官方I2C讀寫問題

說到ST的I2C這個問題,網(wǎng)上有很多人說也存在嚴重的I2C問題,我個人倒不覺得存在太大問題(或許是我研究的還不夠)。

我從開始至今,使用ST芯片I2C也做過幾個項目(控制EEPROM、時鐘芯片、溫度傳感器、觸摸芯片),項目中也使用多個中斷,我至今還沒有發(fā)現(xiàn)它的問題。我只知道ST提供的標準外設庫例程有些地方不嚴謹或不規(guī)范,我也從沒使用ST官方的例程(當然,我自己寫的例程很多思路是參考ST的)。

我個人觀點:有問題比不可怕,可怕的是不知道如何去解決問題。由于我沒有真正的發(fā)現(xiàn)I2C硬件真實存在的問題,可以參考一下官方提到是資料,可以下載(第二節(jié))我整理的STM32F1資料 “STM32F10xxCDE勘誤手冊V14(英文)2015-11”查看。

1.官方標準外設庫例程介紹

標準庫例程關于I2C讀寫EEPROM0的例程很多都一樣或類似(F1、F2、F4等),感興趣的可以下載查看。但是,都存在不規(guī)范的地方。

2.標準庫I2C例程介紹

我大概說一下這個標準庫I2C例程中讀寫相關函數(shù)吧。

位置位于STM32F10x_StdPeriph_Lib_V3.5.0\Utilities\STM32_EVAL\Common:

stm32_eval_i2c_ee.c

A.sEE_ReadBuffer讀函數(shù)

A1.同樣注釋,不同語句,寫地址之后的標志處理;(見265行處)


這個地方其實是處理一下標志位,我也測試過,使用兩種語句都可以通過的。只是提出來以下是,我個人舉得更應該使用“I2C_EVENT_MASTER_BYTE_TRANSMITTED”(在我的例程中也是使用這個)。

A2.讀數(shù)據(jù)之前,發(fā)送停止條件;(見316行處)


這個地方經(jīng)過我反復測試,沒有測試通過(也就是在讀之前發(fā)送停止條件)。 我個人覺得這是程序上的一個BUG.

B.sEE_WriteBuffer寫函數(shù)

寫頁函數(shù)暫時還沒有發(fā)現(xiàn)什么問題,但在綜合的寫函數(shù)(多字節(jié)寫)中發(fā)現(xiàn)了一個問題(如下圖),這個地方的count永遠都不可能等于0,而這里加了一個判斷條件。


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

    關注

    9

    文章

    1010

    瀏覽量

    81406
  • STM32F10x
    +關注

    關注

    1

    文章

    81

    瀏覽量

    20658
  • I2C
    I2C
    +關注

    關注

    28

    文章

    1481

    瀏覽量

    123297
收藏 人收藏

    評論

    相關推薦

    【GD32 MCU 移植教程】9、從 STM32F10x 系列移植到 GD32F30x 系列

    GD32F30x 系列 MCU 是基于 Arm? Cortex?-M4 處理器的 32 位通用微控制器,與 STM32F10x 系列 MCU 保持高度兼容。本文主要從以下三個方面進行介紹:硬件資源
    的頭像 發(fā)表于 09-07 09:57 ?521次閱讀
    【GD32 MCU 移植教程】9、從 <b class='flag-5'>STM32F10x</b> 系列移植到 GD32<b class='flag-5'>F30x</b> 系列

    使用C2000 I2C模塊連接EEPROM

    電子發(fā)燒友網(wǎng)站提供《使用C2000 I2C模塊連接EEPROM.pdf》資料免費下載
    發(fā)表于 08-27 09:53 ?0次下載
    使用<b class='flag-5'>C</b>2000 <b class='flag-5'>I2C</b>模塊連接<b class='flag-5'>EEPROM</b>

    CYUSB3014通過I2C EEPROM啟動時,收到了I2C EEPROM編程失敗的錯誤信息怎么解決?

    我使用的是 CYUSB3014。 在通過 I2C EEPROM 啟動時,我收到了 I2C EEPROM 編程失敗的錯誤信息 當我嘗試使用 RAM 時,編程成功。 PMODE 引腳連接至
    發(fā)表于 07-11 06:12

    STM32F10x標準外設參考手冊

    STM32F10x標準外設參考手冊
    發(fā)表于 06-24 09:26 ?11次下載

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

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

    求助,關于STM32F412 I2C從模式HAL使用方法的疑問求解

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

    通過STM32F103的I2C讀寫24LC024,超過16個以后讀回來的地址上的數(shù)不對是怎么回事?

    通過STM32F103的I2C讀寫24LC024,現(xiàn)在問題是一次讀寫16個及以內的數(shù)據(jù)完全正常 ,超過16個以后讀回來的地址上的數(shù)不對,想問問讀寫
    發(fā)表于 04-18 06:37

    stm32l051 hal如何使用硬件i2c從機?

    stm32l051 hal如何使用硬件i2c從機,有沒有相關參考程序。現(xiàn)在調試過程中一直進入AF錯誤,是什么原因導致的?
    發(fā)表于 03-27 08:24

    STM32F103利用I2C讀寫EEPROM時,利用頁寫入時,讀回的數(shù)據(jù)和寫入的數(shù)據(jù)不一致,為什么?

    STM32F103芯片中,利用I2C讀寫EEPROM時,單字節(jié)寫入,讀回的數(shù)據(jù)和寫入的一致;但是當利用頁寫入時,讀回的數(shù)據(jù)和寫入的數(shù)據(jù)不一致,這是什么原因導致的?
    發(fā)表于 03-20 07:01

    利用軟件模擬i2c讀寫EEPROM,超過256個字節(jié)就讀寫不了了的原因?如何處理?

    利用野火的軟件模擬i2c讀寫EEPROMEEPROM的芯片型號為AT24C512,讀寫256個
    發(fā)表于 03-20 06:42

    STM32F103利用軟件模擬I2C讀寫EEPROM,超過385個字節(jié)就讀寫不了的原因?

    STM32F103的芯片中,利用軟件模擬I2C讀寫EEPROM,在使用頁寫入的方式進行讀寫時,能夠讀寫
    發(fā)表于 03-19 07:45

    stm32f4軟件模擬I2C讀寫EEPROM無器件響應是什么原因造成的?

    利用STM32F4軟件模擬I2C讀寫EEPROM時,在檢測I2C總線設備時,在等待應答階段,CPU讀取SDA線口狀態(tài)值為1(GPIO_Rea
    發(fā)表于 03-19 06:36

    STM32H7使用硬件I2C進行讀寫操作失敗的原因?

    我想使用硬件I2C實現(xiàn)如下操作: 寫入設備地址(8位寫地址)——寫入寄存器地址(不產生STOP)——寫入設備地址(8位從地址)——讀取多個寄存器 使用F4系列單片機時,可以通過
    發(fā)表于 03-11 08:12

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

    在一個評論中,看到網(wǎng)友對硬件I2C的討論,硬件I2C Busy找不到原因、軟件I2C穩(wěn)得一批。
    的頭像 發(fā)表于 02-23 09:37 ?2705次閱讀
    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>驅動如何做到穩(wěn)得一批

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

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