色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    文章

    1021

    瀏覽量

    81655
  • I2C
    I2C
    +關注

    關注

    28

    文章

    1489

    瀏覽量

    123890
  • STM8S
    +關注

    關注

    16

    文章

    149

    瀏覽量

    31438
收藏 人收藏

    評論

    相關推薦

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

    雖然 EEPROM 相對 Flash 讀寫速度更慢,但 EEPROM 一些獨有特性是 Flash 無法實現的,比如字節讀寫操作。 所以,EEPROM
    的頭像 發表于 11-15 16:31 ?475次閱讀
    <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 ?2236次閱讀

    使用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

    硬件IIC卡死在while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY));的原因?

    先謝謝各位,我用的是STM8S105C6T6,寫了一個硬件IIC程序,軟件仿真時候發現程序一直死在 while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY))
    發表于 05-17 08:02

    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 ?2804次閱讀
    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>驅動如何做到穩得一批
    主站蜘蛛池模板: 久久精品成人免费网站| 国产超嫩一线天在线播放 | 97精品国产自产在线观看永久| 国产精品色吧国产精品| 日本激情在线| www.精品视频| 青青久在线| 国产精品国产三级国产an| 免费三级网址| 在线色av| 久久精品AV无码亚洲色欲| 亚洲伊人国产| 久久草福利自拍视频在线观看| 亚洲男人在线观看| 国产一区二区三区乱码在线观看| 无套内射纹身女视频| 国产高清在线a视频大全| 色综合久久中文色婷婷| 古风H啪肉NP文| 污污内射久久一区二区欧美日韩| 国产成人精品免费青青草原app| 揉抓捏打抽插射免费视频| 高H内射NP古文| 天堂无码人妻精品AV一区| 国产精品视频大全| 亚洲精品久久久久久久蜜臀老牛| 狠狠色狠狠色综合日日92| 亚洲无线观看国产| 恋孩癖网站大全在线观看| av天堂电影网| 色中色入口2015| 国内卡一卡二卡三免费网站| 伊人久久大香线蕉综合99| 美女激清床上戏大全| www.x日本| 無码一区中文字幕少妇熟女H| 国模沟沟一区二区三区| 制服国产欧美亚洲日韩| 青青草原亚洲| 国产一区二区波多野结衣| 中国女人精69xxxxxx视频|