一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

STM32F10x _硬件I2C讀寫(xiě)EEPROM(標(biāo)準(zhǔn)外設(shè)庫(kù)版本)

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

掃碼添加小助手

加入工程師交流群

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

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

1、多字節(jié)讀寫(xiě):任意地址(66), 寫(xiě)入任意長(zhǎng)度(129)、讀取并打印出來(lái)

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


實(shí)驗(yàn)說(shuō)明:

1.多字節(jié)讀寫(xiě)

實(shí)驗(yàn)為什么是從66地址寫(xiě)? 為什么是寫(xiě)入129字節(jié)?

答案:驗(yàn)證對(duì)EEPROM多字節(jié)“非標(biāo)準(zhǔn)地址、長(zhǎng)度”讀寫(xiě)的準(zhǔn)確性。

我是使用AT24C128芯片,頁(yè)大小是64字節(jié),我從66地址,就是驗(yàn)證非標(biāo)準(zhǔn)地址(如:0、64、128等)開(kāi)始讀寫(xiě); 寫(xiě)入長(zhǎng)度129字節(jié)也是驗(yàn)證非標(biāo)準(zhǔn)長(zhǎng)度(如:64、128、256等)的讀寫(xiě)。

2.單字節(jié)讀寫(xiě)

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

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

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

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

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

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

STM32F10x_硬件I2C讀寫(xiě)EEPROM(標(biāo)準(zhǔn)外設(shè)庫(kù)版本)實(shí)例源代碼工程:

http://yunpan.cn/c6b8d4mCTPpCj訪問(wèn)密碼 a371

STM32F107VC_硬件I2C讀寫(xiě)EEPROM(標(biāo)準(zhǔn)外設(shè)庫(kù)版本)實(shí)例源代碼工程:

http://yunpan.cn/c6b8HGnAGG4Mf訪問(wèn)密碼 2a18

I2C EEPROM(AT24xx)資料:

https://yunpan.cn/c667rIDPgvwTf訪問(wèn)密碼 1099

STM32F1資料:

https://yunpan.cn/crBUdUGdYKam2訪問(wèn)密碼 ca90

Ⅲ、硬件I2C配置

硬件I2C的配置其實(shí)很簡(jiǎn)單,RCC時(shí)鐘、GPIO、I2C配置等。筆者以F1標(biāo)準(zhǔn)外設(shè)庫(kù)(同時(shí)也建議初學(xué)者使用官方的標(biāo)準(zhǔn)外設(shè)庫(kù))為基礎(chǔ)建立的工程,主要以庫(kù)的方式來(lái)講述(若您的F1芯片與提供工程不一樣,可微信回復(fù)“修改型號(hào)”)。

1.RCC時(shí)鐘源


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

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

重點(diǎn)注意:

A.外設(shè)RCC時(shí)鐘的配置要在其外設(shè)初始化的前面;

B.匹配對(duì)應(yīng)時(shí)鐘。

比如:RCC_APB2外設(shè)不要配置在RCC_APB1時(shí)鐘里面

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

2.I2C引腳配置


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

1.使用硬件I2C:GPIO_Mode_AF_OD復(fù)用開(kāi)漏模式

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

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

3.I2C配置


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

這個(gè)函數(shù)才是本文的重點(diǎn):

1.I2C模式:I2C_Mode = I2C_Mode_I2C;

硬件有多種模式:

I2C_Mode_I2C: I2C模式

I2C_Mode_SMBusDevice: SMBus設(shè)備(叢機(jī))模式

I2C_Mode_SMBusHost: 主機(jī)模式

2.I2C占空比:I2C_DutyCycle = I2C_DutyCycle_2;

這個(gè)參數(shù)在快速I(mǎi)2C模式下有效,也就是速度大于100KHz。

I2C_DutyCycle_2:2比1占空比

I2C_DutyCycle_16_9:16比9占空比

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

3.I2C設(shè)備地址:I2C_OwnAddress1 = EEPROM_DEV_ADDR;

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

4.I2C應(yīng)答:I2C_Ack = I2C_Ack_Enable;

這個(gè)參數(shù)的含義請(qǐng)結(jié)合上一篇文章“I2C協(xié)議”來(lái)理解。

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

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

6.I2C速度:I2C_ClockSpeed = I2C_SPEED;

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

Ⅳ、硬件I2C讀寫(xiě)EEPROM配置

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

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

在對(duì)EEPROM(AT24Cxx)讀寫(xiě)操作之前需要理解兩個(gè)參數(shù)(可見(jiàn)源代碼i2c_ee.h文件):

A.“數(shù)據(jù)字”地址長(zhǎng)度:也就是存數(shù)據(jù)的地址有多少位。具體分類(lèi)(見(jiàn)數(shù)據(jù)手冊(cè))如下:

8位: AT24C01、AT24C02

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

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

8字節(jié): AT24C01、AT24C02

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

32字節(jié): AT24C32、AT24C64

64字節(jié): AT24C128、AT24C256

128字節(jié): AT24C512

1.單字節(jié)寫(xiě)

時(shí)序圖:


截圖來(lái)自“AT24C128C數(shù)據(jù)手冊(cè)”,單字節(jié)寫(xiě)主要分5個(gè)步驟:

1.開(kāi)始

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

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

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

5.停止

源程序:


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

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

時(shí)序圖:


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

1.開(kāi)始

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

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

4.重新開(kāi)始

5.設(shè)備地址/讀

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

7.停止

源程序:


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

3.頁(yè)寫(xiě)

時(shí)序圖:


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

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

【芯片頁(yè)的大小根據(jù)芯片不同而不同,見(jiàn)本章開(kāi)頭描述】

源程序:


寫(xiě)最后一字節(jié)獨(dú)立出來(lái)是有原因的:防止HardFault_Handler。

4.多字節(jié)寫(xiě)

源程序:


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

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

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

5.多字節(jié)讀

時(shí)序圖:


截圖來(lái)自“AT24C128C數(shù)據(jù)手冊(cè)”,多字節(jié)讀需要注意應(yīng)答。

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

源程序:


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

Ⅴ、ST官方I2C讀寫(xiě)問(wèn)題

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

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

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

1.官方標(biāo)準(zhǔn)外設(shè)庫(kù)例程介紹

標(biāo)準(zhǔn)庫(kù)例程關(guān)于I2C讀寫(xiě)EEPROM0的例程很多都一樣或類(lèi)似(F1、F2、F4等),感興趣的可以下載查看。但是,都存在不規(guī)范的地方。

2.標(biāo)準(zhǔn)庫(kù)I2C例程介紹

我大概說(shuō)一下這個(gè)標(biāo)準(zhǔn)庫(kù)I2C例程中讀寫(xiě)相關(guān)函數(shù)吧。

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

stm32_eval_i2c_ee.c

A.sEE_ReadBuffer讀函數(shù)

A1.同樣注釋?zhuān)煌Z(yǔ)句,寫(xiě)地址之后的標(biāo)志處理;(見(jiàn)265行處)


這個(gè)地方其實(shí)是處理一下標(biāo)志位,我也測(cè)試過(guò),使用兩種語(yǔ)句都可以通過(guò)的。只是提出來(lái)以下是,我個(gè)人舉得更應(yīng)該使用“I2C_EVENT_MASTER_BYTE_TRANSMITTED”(在我的例程中也是使用這個(gè))。

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


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

B.sEE_WriteBuffer寫(xiě)函數(shù)

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


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

    關(guān)注

    9

    文章

    1086

    瀏覽量

    83769
  • STM32F10x
    +關(guān)注

    關(guān)注

    1

    文章

    81

    瀏覽量

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

    關(guān)注

    28

    文章

    1541

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    關(guān)于cyusb3014燒寫(xiě)I2C EEPROM的問(wèn)題求解

    你好,我最終要實(shí)現(xiàn)每次上電只從EEPROM引導(dǎo)img,并且能夠識(shí)別到設(shè)備,不過(guò)現(xiàn)在遇到了一些問(wèn)題。在使用cyusb3014芯片通過(guò)I2C燒寫(xiě)EEPROM(型號(hào)為AT24C
    發(fā)表于 07-16 07:38

    STM32H7CubeMX配置硬件I2C讀寫(xiě)失敗是什么問(wèn)題呀?

    STM32H7CubeMX配置硬件I2C,讀寫(xiě)失敗什么問(wèn)題呀,同樣的操作F4和F1都能正常使用,
    發(fā)表于 06-12 06:21

    SPC574s如何使用SPC5Studio自帶的I2C庫(kù)實(shí)現(xiàn)I2C通信?

    SPC574s并沒(méi)有硬件I2C外設(shè),可以使用SPC5Studio自帶的SW I2C庫(kù)來(lái)實(shí)現(xiàn),但是由于SPC5Studio軟件資料太少,
    發(fā)表于 06-09 06:22

    STM32F4標(biāo)準(zhǔn)外設(shè)庫(kù)資料

    stm32f4xx.h,標(biāo)準(zhǔn)外設(shè)庫(kù)
    發(fā)表于 06-08 09:49 ?0次下載

    SPC574s如何使用SPC5Studio自帶的I2C庫(kù)實(shí)現(xiàn)I2C通信?

    SPC574s并沒(méi)有硬件I2C外設(shè),可以使用SPC5Studio自帶的SW I2C庫(kù)來(lái)實(shí)現(xiàn),但是由于SPC5Studio軟件資料太少,
    發(fā)表于 06-05 08:17

    SPC574s如何使用SPC5Studio自帶的I2C庫(kù)實(shí)現(xiàn)I2C通信?

    SPC574s并沒(méi)有硬件I2C外設(shè),可以使用SPC5Studio自帶的SW I2C庫(kù)來(lái)實(shí)現(xiàn),但是由于SPC5Studio軟件資料太少,
    發(fā)表于 05-14 07:10

    I2C EEPROM編程失敗的原因?

    我嘗試使用 Cy Control Center 實(shí)用程序?qū)⒐碳螺d到我的 EVM 中, 第一天,我嘗試了很多次,但都失敗了,比如下面的錯(cuò)誤, I2C EEPROM 編程失敗。 我搜索了英飛凌社區(qū)
    發(fā)表于 05-06 07:25

    【RA-Eco-RA4M2開(kāi)發(fā)板評(píng)測(cè)】I2C讀取EEPROM(二)

    6 I2C讀寫(xiě)EEPROM 6.1 RA Smart Configurator配置I2C 打開(kāi)RA Smart Configurator,根據(jù)硬件
    發(fā)表于 04-28 23:14

    基于APM32F407如何制作I2C EEPROM(AT24C02型號(hào))的MDK-Keil下載算法

    基于APM32F407如何制作I2C EEPROM(AT24C02型號(hào))的Keil下載算法,這樣在我們下載代碼時(shí)可以一鍵把數(shù)據(jù)燒錄到EEPROM
    的頭像 發(fā)表于 04-11 11:06 ?1213次閱讀
    基于APM32<b class='flag-5'>F</b>407如何制作<b class='flag-5'>I2C</b> <b class='flag-5'>EEPROM</b>(AT24<b class='flag-5'>C</b>02型號(hào))的MDK-Keil下載算法

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

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

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

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

    全志模塊設(shè)備開(kāi)發(fā)之I2C編程基礎(chǔ)介紹

    50(eeprom)的外設(shè)芯片。 ?第三,查詢(xún)I2C總線1 (I2C -1)的功能,命令為i2cdetect -
    發(fā)表于 12-16 09:45

    EEPROM輕量級(jí)的簡(jiǎn)易類(lèi)文件的數(shù)據(jù)讀寫(xiě)庫(kù):EEPROMFS

    小。 這里就給大家分享一款EEPROM輕量級(jí)的簡(jiǎn)易類(lèi)文件的數(shù)據(jù)讀寫(xiě)庫(kù):EEPROMFS 1 關(guān)于EEPROMFS EEPROMFS,基于EEPROM的簡(jiǎn)易類(lèi)文件的數(shù)據(jù)
    的頭像 發(fā)表于 11-15 16:31 ?1193次閱讀
    <b class='flag-5'>EEPROM</b>輕量級(jí)的簡(jiǎn)易類(lèi)文件的數(shù)據(jù)<b class='flag-5'>讀寫(xiě)</b><b class='flag-5'>庫(kù)</b>:EEPROMFS

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

    GD32F30x 系列 MCU 是基于 Arm? Cortex?-M4 處理器的 32 位通用微控制器,與 STM32F10x 系列 MCU 保持高度兼容。本文主要從以下三個(gè)方面進(jìn)行介紹:硬件資源
    的頭像 發(fā)表于 09-07 09:57 ?1975次閱讀
    【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èi)下載
    發(fā)表于 08-27 09:53 ?1次下載
    使用<b class='flag-5'>C</b>2000 <b class='flag-5'>I2C</b>模塊連接<b class='flag-5'>EEPROM</b>