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

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

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

STM8S_010_I2C讀寫EEPROM (硬件方式)

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

周末需要休息,也需要做事,像我這種,周末也不忘寫文章分享給你們。目的很簡單,就是讓你們不休息。

開玩笑啦

像我這種人

還是希望你們多學(xué)點(diǎn)知識

正所謂學(xué)到老,活到老

寫在前面

相信看過前面那篇文章“更加深入理解 I2C總線、協(xié)議及應(yīng)用”的人,對I2C都有一定的了解了。那篇文章是針對I2C使用單片機(jī)IO模擬I2C方式實(shí)現(xiàn)讀寫操作。

本文將講述硬件I2C讀寫操作,也就是由處理器自身硬件的I2C實(shí)現(xiàn)時鐘、數(shù)據(jù)的傳輸過程。

為方便大家閱讀,本文內(nèi)容已經(jīng)整理成PDF文件:

http://pan.baidu.com/s/1i5uWhJR

STM8硬件I2C知識

STM8S的I2C模塊不僅可以接收和發(fā)送數(shù)據(jù),還可以在接收時將數(shù)據(jù)從串行轉(zhuǎn)換成并行數(shù)據(jù),在發(fā)送時將數(shù)據(jù)從并行轉(zhuǎn)換成串行數(shù)據(jù)??梢蚤_啟或禁止中斷。接口通過數(shù)據(jù)引腳(SDA)和時鐘引腳(SCL)連接到I2C總線。允許連接到標(biāo)準(zhǔn)(最高100kHz)或快速(最高400kHz)的I2C總線。

1.I2C的4種模式

● 從設(shè)備發(fā)送模式

● 從設(shè)備接收模式

● 主設(shè)備發(fā)送模式

● 主設(shè)備接收模式

2.I2C的主要特點(diǎn)

● 并行總線/I2C總線協(xié)議轉(zhuǎn)換器

● 多主機(jī)功能:該模塊既可做主設(shè)備也可做從設(shè)備

● I2C主設(shè)備功能

─ 產(chǎn)生起始和停止信號

● I2C從設(shè)備功能

─ 可編程的 I2C 地址檢測

─ 停止位檢測

● 產(chǎn)生和檢測7位/10位地址和廣播呼叫

● 支持不同的通訊速度

─ 標(biāo)準(zhǔn)速度(最高 100 kHz)

─ 快速(最高 400 kHz)

● 狀態(tài)標(biāo)志:

─ 發(fā)送器/接收器模式標(biāo)志

─ I2C 總線忙標(biāo)志

─ 主模式時的仲裁失敗

─ 地址/數(shù)據(jù)傳輸后的應(yīng)答(ACK)錯誤

─ 檢測到錯誤的起始或停止條件

─ 禁止時鐘展寬功能時數(shù)據(jù)過載或欠載

● 3種中斷

─ 1 個通訊中斷

─ 1 個出錯中斷

─ 1 個喚醒中斷

● 喚醒功能

─ 從模式下如果檢測到地址匹配可以將 MCU 從低功耗模式中喚醒

● 可選的時鐘展寬功能

3.主模式所要求的操作順序

● 在I2C_FREQR寄存器中設(shè)定該模塊的輸入時鐘以產(chǎn)生正確的時序

● 配置時鐘控制寄存器

● 配置上升時間寄存器

● 編程I2C_CR1寄存器啟動外設(shè)

● 置I2C_CR1寄存器中的START位為1,產(chǎn)生起始條件

● I2C模塊的輸入時鐘頻率必須至少是:

● 標(biāo)準(zhǔn)模式下為:1MHz

● 快速模式下為:4MHz

軟件工程源代碼

1.關(guān)于工程

本文提供的工程代碼是基于前面軟件工程“STM8S-A04_UART基本收發(fā)數(shù)據(jù)”增加I2C接口修改而來。讀寫EEPROM的方式和之前“模擬I2C讀寫”的方式不一樣。

2.硬件I2C初始化

void I2C_Initializes(void)

{

CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C, ENABLE);

I2C_Cmd(ENABLE);

I2C_Init(I2C_SPEED, I2C_SLAVE_ADDRESS7, I2C_DUTYCYCLE_2, I2C_ACK_CURR,

I2C_ADDMODE_7BIT, 16);

}

I2C_SPEED:I2C速度,一般是100K - 400K

I2C_SLAVE_ADDRESS7:從設(shè)備地址,作為主設(shè)備時,這個地址不起作用。

I2C_DUTYCYCLE_2:快速模式

I2C_ACK_CURR:應(yīng)答

I2C_ADDMODE_7BIT:設(shè)備地址位數(shù)

16:輸入時鐘(單位M)

2.EEPROM_WriteByte寫一字節(jié)

寫一字節(jié)分為5個步驟:

void EEPROM_WriteByte(uint16_t Addr, uint8_t Data)

{

while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY));

/* 1.開始 */

I2C_GenerateSTART(ENABLE);

while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));

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

I2C_Send7bitAddress(EEPROM_DEV_ADDR, I2C_DIRECTION_TX);

while(!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

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

#if (8 == EEPROM_WORD_ADDR_SIZE)

I2C_SendData((Addr&0x00FF));

while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));

#else

I2C_SendData((uint8_t)(Addr>>8));

while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));

I2C_SendData((uint8_t)(Addr&0x00FF));

while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));

#endif

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

I2C_SendData(Data);

while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));

/* 5.停止 */

I2C_GenerateSTOP(ENABLE);

}

3.EEPROM_ReadByte讀一字節(jié)

讀一字節(jié)比寫一字節(jié)多了2個步驟,原因是讀的時候多寫地址到讀數(shù)據(jù)這個切換過程。

void EEPROM_ReadByte(uint16_t Addr, uint8_t *Data)

{

while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY));

/* 1.開始 */

I2C_GenerateSTART(ENABLE);

while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));

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

I2C_Send7bitAddress(EEPROM_DEV_ADDR, I2C_DIRECTION_TX);

while(!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

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

#if (8 == EEPROM_WORD_ADDR_SIZE)

I2C_SendData((Addr&0x00FF));

while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));

#else

I2C_SendData((uint8_t)(Addr>>8));

while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));

I2C_SendData((uint8_t)(Addr&0x00FF));

while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));

#endif

/* 4.重新開始 */

I2C_GenerateSTART(ENABLE);

while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));

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

I2C_Send7bitAddress(EEPROM_DEV_ADDR, I2C_DIRECTION_RX);

while(!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));

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

I2C_AcknowledgeConfig(I2C_ACK_NONE);

while(I2C_GetFlagStatus(I2C_FLAG_RXNOTEMPTY) == RESET);

*Data = I2C_ReceiveData();

/* 7.停止 */

I2C_GenerateSTOP(ENABLE);

}

下載

STM8S資料

http://pan.baidu.com/s/1o7Tb9Yq

軟件源代碼工程兩版本(STM8S-A10_I2C讀寫EEPROM(硬件)):

http://pan.baidu.com/s/1c2EcRo0

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

    關(guān)注

    9

    文章

    1002

    瀏覽量

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

    關(guān)注

    28

    文章

    1452

    瀏覽量

    122238
  • STM8S
    +關(guān)注

    關(guān)注

    16

    文章

    149

    瀏覽量

    31271
收藏 人收藏

    評論

    相關(guān)推薦

    EEPROM讀寫程序詳解

    EEPROM(Electrically Erasable Programmable Read-Only Memory)讀寫程序的詳解涉及多個方面,包括EEPROM的基本工作原理、讀寫
    的頭像 發(fā)表于 09-05 12:32 ?407次閱讀

    使用C2000 I2C模塊連接EEPROM

    電子發(fā)燒友網(wǎng)站提供《使用C2000 I2C模塊連接EEPROM.pdf》資料免費(fèi)下載
    發(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 編程失敗的錯誤信息 當(dāng)我嘗試使用 RAM 時,編程成功。 PMODE 引腳連接至
    發(fā)表于 07-11 06:12

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

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

    STM8S003F調(diào)試硬件I2C遇到的疑問求解?

    最近新使用STM8S003F芯片,在調(diào)試硬件I2C的遇到了一個奇怪的問題:示波器僅僅能夠量到起始信號,然后一直保持低電平,直到超時。我的理解:不管Slave地址正不正確,SCL應(yīng)該能夠得輸出吧,可是
    發(fā)表于 04-24 06:50

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

    用STM8S207 硬件I2C調(diào)試用輪詢的方式發(fā)現(xiàn)如果不加入其它中斷可以正常運(yùn)行,一旦加入中斷,I2C的時序就出現(xiàn)了問題,比如用定時器如果設(shè)
    發(fā)表于 04-19 07:49

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

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

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

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

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

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

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

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

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

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

    CW32單片機(jī)I2C接口讀寫EEPROM芯片介紹

    CW32單片機(jī)I2C接口讀寫EEPROM芯片介紹
    的頭像 發(fā)表于 11-09 17:42 ?871次閱讀
    CW32單片機(jī)<b class='flag-5'>I2C</b>接口<b class='flag-5'>讀寫</b><b class='flag-5'>EEPROM</b>芯片介紹

    基于STCl2C5A60S2單片機(jī)的SD卡讀寫

    電子發(fā)燒友網(wǎng)站提供《基于STCl2C5A60S2單片機(jī)的SD卡讀寫.pdf》資料免費(fèi)下載
    發(fā)表于 10-10 09:34 ?8次下載
    基于STCl<b class='flag-5'>2C5A60S2</b>單片機(jī)的SD卡<b class='flag-5'>讀寫</b>

    I2C總線介紹 I2C讀寫時序介紹

    作為嵌入式開發(fā)人員,無論是硬件還是軟件工程師,或多或少都會接觸過I2C接口的外設(shè)。諸如常用的存儲器EEPROM等皆是I2C接口進(jìn)行通信。
    發(fā)表于 10-01 16:57 ?2112次閱讀
    <b class='flag-5'>I2C</b>總線介紹 <b class='flag-5'>I2C</b><b class='flag-5'>讀寫</b>時序介紹

    I2C讀寫時序分析和實(shí)現(xiàn)思路

    上篇推文對I2C總線的特性進(jìn)行了介紹和描述。對于開發(fā)者而言,最重要的是編碼I2C讀寫時序驅(qū)動。本篇推文主要總結(jié)和分享I2C總線主機(jī)端通信的編程實(shí)現(xiàn)思路,并不對應(yīng)特定MCU的
    發(fā)表于 10-01 16:54 ?1357次閱讀
    <b class='flag-5'>I2C</b><b class='flag-5'>讀寫</b>時序分析和實(shí)現(xiàn)思路