一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

STM8S_010_I2C讀寫EEPROM (硬件方式)

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

掃碼添加小助手

加入工程師交流群

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

開玩笑啦

像我這種人

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

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

寫在前面

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

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

為方便大家閱讀,本文內(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ù)??梢蚤_啟或禁止中斷。接口通過數(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ù)過載或欠載

● 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接口修改而來。讀寫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è)備時(shí),這個(gè)地址不起作用。

I2C_DUTYCYCLE_2:快速模式

I2C_ACK_CURR:應(yīng)答

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

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

2.EEPROM_WriteByte寫一字節(jié)

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

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個(gè)步驟,原因是讀的時(shí)候多寫地址到讀數(shù)據(jù)這個(gè)切換過程。

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)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • EEPROM
    +關(guān)注

    關(guān)注

    9

    文章

    1086

    瀏覽量

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

    關(guān)注

    28

    文章

    1541

    瀏覽量

    127799
  • STM8S
    +關(guān)注

    關(guān)注

    16

    文章

    149

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    關(guān)于cyusb3014燒寫I2C EEPROM的問題求解

    你好,我最終要實(shí)現(xiàn)每次上電只從EEPROM引導(dǎo)img,并且能夠識(shí)別到設(shè)備,不過現(xiàn)在遇到了一些問題。在使用cyusb3014芯片通過I2C燒寫EEPROM(型號(hào)為AT24C
    發(fā)表于 07-16 07:38

    STM32H7CubeMX配置硬件I2C讀寫失敗是什么問題呀?

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

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

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

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

    請(qǐng)問一下,Cyusb3014接一塊I2C eeprom的情況下,A0、A1、A2的地址要設(shè)置嗎?我在控制中心以及elf2img中沒有發(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開發(fā)板評(píng)測(cè)】I2C讀取EEPROM(二)

    6 I2C讀寫EEPROM 6.1 RA Smart Configurator配置I2C 打開RA Smart Configurator,根據(jù)硬件
    發(fā)表于 04-28 23:14

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

    的存儲(chǔ)器,常用來存儲(chǔ)一些配置信息,以便系統(tǒng)重新上電的時(shí)候加載。 EEPROM 芯片最常用的通訊方式就是 I2C 協(xié)議,本文將要講解EEPROM讀寫
    發(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 ?1198次閱讀
    基于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è)備開發(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)易類文件的數(shù)據(jù)讀寫庫:EEPROMFS

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

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

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

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

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

    EEPROM讀寫程序詳解

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

    使用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)及讀寫操作

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