99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

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

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

STM8S_010_I2C讀寫(xiě)EEPROM (硬件方式)

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

掃碼添加小助手

加入工程師交流群

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

開(kāi)玩笑啦

像我這種人

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

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

寫(xiě)在前面

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

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

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

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

STM8硬件I2C知識(shí)

STM8S的I2C模塊不僅可以接收和發(fā)送數(shù)據(jù),還可以在接收時(shí)將數(shù)據(jù)從串行轉(zhuǎn)換成并行數(shù)據(jù),在發(fā)送時(shí)將數(shù)據(jù)從并行轉(zhuǎn)換成串行數(shù)據(jù)??梢蚤_(kāi)啟或禁止中斷。接口通過(guò)數(shù)據(jù)引腳(SDA)和時(shí)鐘引腳(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)生起始和停止信號(hào)

● I2C從設(shè)備功能

─ 可編程的 I2C 地址檢測(cè)

─ 停止位檢測(cè)

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

● 支持不同的通訊速度

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

─ 快速(最高 400 kHz)

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

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

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

─ 主模式時(shí)的仲裁失敗

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

─ 檢測(cè)到錯(cuò)誤的起始或停止條件

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

● 3種中斷

─ 1 個(gè)通訊中斷

─ 1 個(gè)出錯(cuò)中斷

─ 1 個(gè)喚醒中斷

● 喚醒功能

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

● 可選的時(shí)鐘展寬功能

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

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

● 配置時(shí)鐘控制寄存器

● 配置上升時(shí)間寄存器

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

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

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

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

● 快速模式下為:4MHz

軟件工程源代碼

1.關(guān)于工程

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

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è)備時(shí),這個(gè)地址不起作用。

I2C_DUTYCYCLE_2:快速模式

I2C_ACK_CURR:應(yīng)答

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

16:輸入時(shí)鐘(單位M)

2.EEPROM_WriteByte寫(xiě)一字節(jié)

寫(xiě)一字節(jié)分為5個(gè)步驟:

void EEPROM_WriteByte(uint16_t Addr, uint8_t Data)

{

while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY));

/* 1.開(kāi)始 */

I2C_GenerateSTART(ENABLE);

while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));

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

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.寫(xiě)一字節(jié)數(shù)據(jù) */

I2C_SendData(Data);

while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));

/* 5.停止 */

I2C_GenerateSTOP(ENABLE);

}

3.EEPROM_ReadByte讀一字節(jié)

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

void EEPROM_ReadByte(uint16_t Addr, uint8_t *Data)

{

while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY));

/* 1.開(kāi)始 */

I2C_GenerateSTART(ENABLE);

while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));

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

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.重新開(kāi)始 */

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讀寫(xiě)EEPROM(硬件)):

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

聲明:本文內(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

    瀏覽量

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

    關(guān)注

    28

    文章

    1541

    瀏覽量

    127750
  • STM8S
    +關(guān)注

    關(guān)注

    16

    文章

    149

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    STVD使用STM8S005K6T6C內(nèi)部data eeprom進(jìn)行數(shù)據(jù)寫(xiě)入操作問(wèn)題求解

    1.STVD使用STM8S005K6T6C內(nèi)部data eeprom進(jìn)行數(shù)據(jù)寫(xiě)入操作,使用st-link V2(B2013 21)進(jìn)行仿真調(diào)試,發(fā)現(xiàn)寄存器FLASH_CR2寫(xiě)入1是值仍
    發(fā)表于 06-23 06:29

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

    STM32H7CubeMX配置硬件I2C,讀寫(xiě)失敗什么問(wèn)題呀,同樣的操作F4和F1都能正常使用,應(yīng)該不存在i2c地址錯(cuò)誤,操作都是一樣的,但H7就是用不了。
    發(fā)表于 06-12 06:21

    I2C EEPROM無(wú)法從FX3S USB控制器啟動(dòng)怎么處理?

    在我的設(shè)計(jì)中,我們使用 USB 控制器 FX3S(CYUSB3035-BZXI)和 I2C EEPROM(M24M02-DRMN6/AT24CM02-SSHM),通過(guò) USB 電纜成功進(jìn)行刷新,刷新
    發(fā)表于 05-20 07:47

    Cyusb3014接一塊I2C eeprom的情況下,A0、A1、A2的地址要設(shè)置嗎?

    請(qǐng)問(wèn)一下,Cyusb3014接一塊I2C eeprom的情況下,A0、A1、A2的地址要設(shè)置嗎?我在控制中心以及elf2img中沒(méi)有發(fā)現(xiàn)設(shè)置I2C
    發(fā)表于 05-12 07:19

    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

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

    的存儲(chǔ)器,常用來(lái)存儲(chǔ)一些配置信息,以便系統(tǒng)重新上電的時(shí)候加載。 EEPROM 芯片最常用的通訊方式就是 I2C 協(xié)議,本文將要講解EEPROM讀寫(xiě)
    發(fā)表于 04-28 23:13

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

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

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

    cpu的通信方式是只需要兩條線路的I2C總線,比如在我們的100ask_imx6UL板子中就有eeprom和AP3216兩個(gè)外設(shè),它們?cè)?b class='flag-5'>I2C總線中充當(dāng)?shù)亩际?/div>
    發(fā)表于 12-16 09:45

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

    雖然 EEPROM 相對(duì) Flash 讀寫(xiě)速度更慢,但 EEPROM 一些獨(dú)有特性是 Flash 無(wú)法實(shí)現(xiàn)的,比如字節(jié)讀寫(xiě)操作。 所以,EEPROM
    的頭像 發(fā)表于 11-15 16:31 ?1182次閱讀
    <b class='flag-5'>EEPROM</b>輕量級(jí)的簡(jiǎn)易類(lèi)文件的數(shù)據(jù)<b class='flag-5'>讀寫(xiě)</b>庫(kù):EEPROMFS

    TAS5727信號(hào)輸入( I2C + I2S )正常而沒(méi)有發(fā)聲是怎么回事?

    ,然后。。。程序。。。 I2S的輸入信號(hào)正常,I2C的數(shù)據(jù)可以來(lái)回讀寫(xiě),錯(cuò)誤寄存器讀回來(lái)的數(shù)據(jù)為0x00, 理解為功放IC工作正常的意思,但是聲音一直沒(méi)出來(lái),檢查初始化步驟,跟官方文檔給出的流程出入
    發(fā)表于 10-31 07:36

    TLV320AIC3263 i2c無(wú)法進(jìn)行通信,通過(guò)i2c讀寫(xiě)函數(shù),讀寫(xiě)寄存器失敗怎么解決?

    麻煩幫忙分析下以下問(wèn)題的原因 1、i2c無(wú)法進(jìn)行通信,通過(guò)i2c讀寫(xiě)函數(shù)(系統(tǒng)提供),讀寫(xiě)寄存器失敗: 寫(xiě)寄存器,返回-5: 讀寄存器:都是251
    發(fā)表于 10-28 07:32

    EEPROM讀寫(xiě)程序詳解

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

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

    eeprom存儲(chǔ)原理、存儲(chǔ)結(jié)構(gòu)及讀寫(xiě)操作

    EEPROM(Electrically Erasable Programmable Read-Only Memory,電可擦可編程只讀存儲(chǔ)器)是一種非易失性存儲(chǔ)器,可以在不移除電源的情況下進(jìn)行讀寫(xiě)
    的頭像 發(fā)表于 08-05 17:03 ?5920次閱讀