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

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

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

3天內不再提示

STM8S_010_I2C讀寫EEPROM (硬件方式)

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

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

開玩笑啦

像我這種人

還是希望你們多學點知識

正所謂學到老,活到老

寫在前面

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

本文將講述硬件I2C讀寫操作,也就是由處理器自身硬件的I2C實現時鐘、數據的傳輸過程。

為方便大家閱讀,本文內容已經整理成PDF文件:

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

STM8硬件I2C知識

STM8S的I2C模塊不僅可以接收和發送數據,還可以在接收時將數據從串行轉換成并行數據,在發送時將數據從并行轉換成串行數據。可以開啟或禁止中斷。接口通過數據引腳(SDA)和時鐘引腳(SCL)連接到I2C總線。允許連接到標準(最高100kHz)或快速(最高400kHz)的I2C總線。

1.I2C的4種模式

● 從設備發送模式

● 從設備接收模式

● 主設備發送模式

● 主設備接收模式

2.I2C的主要特點

● 并行總線/I2C總線協議轉換器

● 多主機功能:該模塊既可做主設備也可做從設備

● I2C主設備功能

─ 產生起始和停止信號

● I2C從設備功能

─ 可編程的 I2C 地址檢測

─ 停止位檢測

● 產生和檢測7位/10位地址和廣播呼叫

● 支持不同的通訊速度

─ 標準速度(最高 100 kHz)

─ 快速(最高 400 kHz)

● 狀態標志:

─ 發送器/接收器模式標志

─ I2C 總線忙標志

─ 主模式時的仲裁失敗

─ 地址/數據傳輸后的應答(ACK)錯誤

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

─ 禁止時鐘展寬功能時數據過載或欠載

● 3種中斷

─ 1 個通訊中斷

─ 1 個出錯中斷

─ 1 個喚醒中斷

● 喚醒功能

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

● 可選的時鐘展寬功能

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

● 在I2C_FREQR寄存器中設定該模塊的輸入時鐘以產生正確的時序

● 配置時鐘控制寄存器

● 配置上升時間寄存器

● 編程I2C_CR1寄存器啟動外設

● 置I2C_CR1寄存器中的START位為1,產生起始條件

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

● 標準模式下為:1MHz

● 快速模式下為:4MHz

軟件工程源代碼

1.關于工程

本文提供的工程代碼是基于前面軟件工程“STM8S-A04_UART基本收發數據”增加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:從設備地址,作為主設備時,這個地址不起作用。

I2C_DUTYCYCLE_2:快速模式

I2C_ACK_CURR:應答

I2C_ADDMODE_7BIT:設備地址位數

16:輸入時鐘(單位M)

2.EEPROM_WriteByte寫一字節

寫一字節分為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.設備地址/寫 */

I2C_Send7bitAddress(EEPROM_DEV_ADDR, I2C_DIRECTION_TX);

while(!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

/* 3.數據地址 */

#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_SendData(Data);

while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));

/* 5.停止 */

I2C_GenerateSTOP(ENABLE);

}

3.EEPROM_ReadByte讀一字節

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

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.設備地址/寫 */

I2C_Send7bitAddress(EEPROM_DEV_ADDR, I2C_DIRECTION_TX);

while(!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

/* 3.數據地址 */

#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.設備地址/讀 */

I2C_Send7bitAddress(EEPROM_DEV_ADDR, I2C_DIRECTION_RX);

while(!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));

/* 6.讀一字節數據 */

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

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

    關注

    9

    文章

    1010

    瀏覽量

    81416
  • I2C
    I2C
    +關注

    關注

    28

    文章

    1482

    瀏覽量

    123364
  • STM8S
    +關注

    關注

    16

    文章

    149

    瀏覽量

    31369
收藏 人收藏

    評論

    相關推薦

    EEPROM輕量級的簡易類文件的數據讀寫庫:EEPROMFS

    雖然 EEPROM 相對 Flash 讀寫速度更慢,但 EEPROM 一些獨有特性是 Flash 無法實現的,比如字節讀寫操作。 所以,EEPROM
    的頭像 發表于 11-15 16:31 ?310次閱讀
    <b class='flag-5'>EEPROM</b>輕量級的簡易類文件的數據<b class='flag-5'>讀寫</b>庫:EEPROMFS

    TAS5727信號輸入( I2C + I2S )正常而沒有發聲是怎么回事?

    ,然后。。。程序。。。 I2S的輸入信號正常,I2C的數據可以來回讀寫,錯誤寄存器讀回來的數據為0x00, 理解為功放IC工作正常的意思,但是聲音一直沒出來,檢查初始化步驟,跟官方文檔給出的流程出入
    發表于 10-31 07:36

    EEPROM讀寫程序詳解

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

    使用C2000 I2C模塊連接EEPROM

    電子發燒友網站提供《使用C2000 I2C模塊連接EEPROM.pdf》資料免費下載
    發表于 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 引腳連接至
    發表于 07-11 06:12

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

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

    STM8S003F調試硬件I2C遇到的疑問求解?

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

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

    用STM8S207 硬件I2C調試用輪詢的方式發現如果不加入其它中斷可以正常運行,一旦加入中斷,I2C的時序就出現了問題,比如用定時器如果設
    發表于 04-19 07:49

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

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

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

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

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

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

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

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

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

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

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

    在一個評論中,看到網友對硬件I2C的討論,硬件I2C Busy找不到原因、軟件I2C穩得一批。
    的頭像 發表于 02-23 09:37 ?2716次閱讀
    GD32 MCU<b class='flag-5'>硬件</b><b class='flag-5'>I2C</b>不可靠不如軟件<b class='flag-5'>I2C</b>?來看看紅楓派開發版的<b class='flag-5'>硬件</b><b class='flag-5'>I2C</b>驅動如何做到穩得一批

    海思Hi3566V100 I2C硬件設計要點

    上一期我們介紹了 【基于深度學習 2D 人臉識別的NXP i.MX 8M Shark 方案】,本期將給大家推出海思硬件設計系列:Hi3566V100
    的頭像 發表于 12-04 11:38 ?1489次閱讀
    海思Hi3566V100 <b class='flag-5'>I2C</b><b class='flag-5'>硬件</b>設計要點