www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]Ⅰ、寫在前面上一篇文章是“STM32F10x_模擬I2C讀寫EEPROM”,講述使用IO口模擬I2C總線通信,對EEPROM(AT24Xxx)進(jìn)行讀寫操作的過程。上一篇文章主要內(nèi)容:I2C協(xié)議、模擬I2C底層驅(qū)動、EEPROM(AT24Xxx)單字節(jié)讀寫操作。

Ⅰ、寫在前面

上一篇文章是“STM32F10x_模擬I2C讀寫EEPROM”,講述使用IO口模擬I2C總線通信,對EEPROM(AT24Xxx)進(jìn)行讀寫操作的過程。

上一篇文章主要內(nèi)容:I2C協(xié)議、模擬I2C底層驅(qū)動、EEPROM(AT24Xxx)單字節(jié)讀寫操作。

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

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

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

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

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

1.多字節(jié)讀寫

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

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

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

2.單字節(jié)讀寫

我這樣實(shí)驗(yàn)的目的,相信大家都能理解。驗(yàn)證每一次寫入字節(jié)數(shù)據(jù) 和讀出的數(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讀寫EEPROM(標(biāo)準(zhǔn)外設(shè)庫版本)實(shí)例源代碼工程:

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

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

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

I2C EEPROM(AT24xx)資料:

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

STM32F1資料:

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

Ⅲ、硬件I2C配置

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

1.RCC時鐘源

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

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

重點(diǎn)注意:

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

B.匹配對應(yīng)時鐘。

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

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

2.I2C引腳配置

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

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

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

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

3.I2C配置

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

這個函數(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;

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

I2C_DutyCycle_2:2比1占空比

I2C_DutyCycle_16_9:16比9占空比

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

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

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

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

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

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

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

6.I2C速度:I2C_ClockSpeed = I2C_SPEED;

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

Ⅳ、硬件I2C讀寫EEPROM配置

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

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

在對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.頁長度:在進(jìn)行連續(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.設(shè)備地址/寫

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

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

5.停止

源程序:

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

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

時序圖:

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

1.開始

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

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

4.重新開始

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

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

7.停止

源程序:

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

3.頁寫

時序圖:

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

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

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

源程序:

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

4.多字節(jié)寫

源程序:

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

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

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

5.多字節(jié)讀

時序圖:

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

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

源程序:

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

Ⅴ、ST官方I2C讀寫問題

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

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

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

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

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

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

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

位置位于STM32F10x_StdPeriph_Lib_V3.5.0UtilitiesSTM32_EVALCommon:

stm32_eval_i2c_ee.c

A.sEE_ReadBuffer讀函數(shù)

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

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

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

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

B.sEE_WriteBuffer寫函數(shù)

寫頁函數(shù)暫時還沒有發(fā)現(xiàn)什么問題,

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

一、在STM32中,有5個時鐘源,為HSI,HSE,LSI,LSE,PLL.①HSI是高速內(nèi)部時鐘,RC振蕩器,頻率為8MHz;②HSE--高速外部時鐘,可接石英或者陶瓷諧振器,或者外部時鐘源,頻率范圍4MHz--15M...

關(guān)鍵字: STM32 stm32f10x 時鐘配置

;******************** (C) COPYRIGHT 2010 STMicroelectronics ********************;* File Name: startup_stm32f10...

關(guān)鍵字: stm32f10x 啟動代碼

環(huán)境:STM32F10x 3.5固件庫。下載地址http://www.st.com/internet/com/SOFTWARE_RESOURCES/SW_COMPONENT/FIRMWARE/stm32f10x_stdp...

關(guān)鍵字: stm32f10x 新建工程

USB速度慢的原因有以下幾種可能:1、協(xié)議問題 全速的USB設(shè)備,最大速度12Mb/s,但是如果跑的是HID之類慢速設(shè)備的協(xié)議,那么速度就沒有那么快了,理論上只有1.5Mb/s。2、配置問題 USB配置描述符中有關(guān)于接收...

關(guān)鍵字: stm32f10x usb速度慢

Ⅰ、概述RTC(Real Time Clock)是實(shí)時時鐘的意思,它其實(shí)和TIM有點(diǎn)類似,也是利用計(jì)數(shù)的原理,選擇RTC時鐘源,再進(jìn)行分頻,到達(dá)計(jì)數(shù)的目的。該文主要講述關(guān)于RTC的秒中斷功能,這個功能類似SysTick系...

關(guān)鍵字: rtc stm32f10x 秒中斷

先從最簡單的問題開始,用STM32外部中斷的方法實(shí)現(xiàn)PB.0按鍵控制PA.0LED燈:先總的說下實(shí)現(xiàn)中斷的步驟:1,配置NVIC寄存器(函數(shù)),設(shè)置中斷為第幾組,占先優(yōu)先級和次優(yōu)先級; 函數(shù)方法: void NVIC_C...

關(guān)鍵字: gpio stm32f10x 外部中斷

? ? ? ? stm32是自帶硬件I2C,相比于軟件模擬I2c,硬件I2c效率更高。但是據(jù)說不穩(wěn)定,這個我倒暫時還沒有體會到。? ? ? ? 在最開始使用硬件I2c的時候,程序總是卡死,要不從一開始

關(guān)鍵字: i2c STM32 stm32f10x

SysTick定時器被集成在NVIC中。因此,只要是Cortex-M3內(nèi)核的單片機(jī),就都有它。這個學(xué)習(xí)筆記就用SysTick定時器來實(shí)現(xiàn)走馬燈的功能。SysTick定時器非常簡答,只有四個寄存器。這四個寄存器的含義在《C...

關(guān)鍵字: stm32f10x systick 定時器

Ⅰ、概述接著上一篇文章來講述關(guān)于RTC的計(jì)數(shù)功能,我們以實(shí)例RTC日歷(讀寫年、月、日、星期、時、分、秒)來講述該章節(jié)。STM32F1系列芯片的RTC功能和其他系列(F0、F2、F4等)相比來說,功能要弱一點(diǎn),原因在于F...

關(guān)鍵字: stm32f10x rtc日歷

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

關(guān)鍵字: stm32f10x 中斷接收 主從通信 硬件i2c 輪詢發(fā)送
關(guān)閉