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

    文章

    1129

    浏览量

    85509
  • I2C
    I2C
    +关注

    关注

    28

    文章

    1547

    浏览量

    130446
  • STM8S
    +关注

    关注

    16

    文章

    149

    浏览量

    32519
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    基于CW32 MCU的I2C接口优化稳定读写EEPROM关键技术

    问题,实现多个EEPROM设备的稳定读写操作。 通过这些优化技术,能够有效提升CW32 MCU在I2C通信中的稳定性和可靠性,确保在复杂环境下的数据传输安全和稳定。
    发表于 12-03 07:29

    探索CAT34C02:2-Kb I²C EEPROM的卓越性能与应用

    专为DDR2 DIMM SPD(串行存在检测)应用设计的2-Kb I²C EEPROM,它具有众多出色的特性和功能,能为工程师们的设计带来诸
    的头像 发表于 11-27 11:18 159次阅读
    探索CAT34<b class='flag-5'>C</b>02:<b class='flag-5'>2</b>-Kb <b class='flag-5'>I</b>²<b class='flag-5'>C</b> <b class='flag-5'>EEPROM</b>的卓越性能与应用

    ‌CAT24C64 64Kb I²C CMOS串行EEPROM技术深度解析

    安森美 (onsemi) CAT24C64 64Kb I^2^C CMOS串行EEPROM在内部为每个8
    的头像 发表于 11-25 10:14 188次阅读
    ‌CAT24<b class='flag-5'>C</b>64 64Kb <b class='flag-5'>I</b>²<b class='flag-5'>C</b> CMOS串行<b class='flag-5'>EEPROM</b>技术深度解析

    把CW32L010用FLASH模拟EEPROM

    文件 eeprom.c,添加到项目中去,下面是和别的程序怎么配合: #include \"CW32L010.h\" #include \"eeprom.h\"
    发表于 11-24 07:40

    ‌STMicroelectronics M24C64-U 64-Kbit串行I²C总线EEPROM技术解析

    STMicroelectronics M24C64-U 64-Kbit串行^I2C^总线EEPROM专为高效可靠的数据存储而设计。该STMicroelectronics EEPROM
    的头像 发表于 10-15 17:27 483次阅读
    ‌STMicroelectronics M24<b class='flag-5'>C</b>64-U 64-Kbit串行<b class='flag-5'>I</b>²<b class='flag-5'>C</b>总线<b class='flag-5'>EEPROM</b>技术解析

    【沁恒CH585开发板免费试用体验】I2C 读写EEPROM (三)

    字节,高7bit是地址,bit0是读写控制位,0表示写,1表示读 */ I2C_SendByte(EEPROM_DEV_ADDR | I2C_RD); /* 此处是读指令 */
    发表于 08-05 22:25

    【沁恒CH585开发板免费试用体验】I2C 读写EEPROM (二)

    _EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); /* Send the EEPROM\'s internal address to write to */ I2C_SendData(W
    发表于 08-05 22:13

    【沁恒CH585开发板免费试用体验】I2C 读写EEPROM (一)

    10100000(0xa0),读设备地址为10100001(0xa1)。 3 硬件设计及连接 本文是使用I2C协议对EEPROM进行读写操作,具体的
    发表于 08-05 22:09

    STM32H7CubeMX配置硬件I2C读写失败是什么问题呀?

    STM32H7CubeMX配置硬件I2C读写失败什么问题呀,同样的操作F4和F1都能正常使用,应该不存在i2c地址错误,操作都是一样的,但H7就是用不了。
    发表于 06-12 06:21

    I2C EEPROM无法从FX3S USB控制器启动怎么处理?

    在我的设计中,我们使用 USB 控制器 FX3S(CYUSB3035-BZXI)和 I2C EEPROM(M24M02-DRMN6/AT24CM02-SSHM),通过 USB 电缆成功进行刷新,刷新
    发表于 05-20 07:47

    Cyusb3014接一块I2C eeprom的情况下,A0、A1、A2的地址要设置吗?

    请问一下,Cyusb3014接一块I2C eeprom的情况下,A0、A1、A2的地址要设置吗?我在控制中心以及elf2img中没有发现设置I2C
    发表于 05-12 07:19

    I2C EEPROM编程失败的原因?

    我尝试使用 Cy Control Center 实用程序将固件下载到我的 EVM 中, 第一天,我尝试了很多次,但都失败了,比如下面的错误, I2C EEPROM 编程失败。 我搜索了英飞凌社区
    发表于 05-06 07:25

    【RA-Eco-RA4M2开发板评测】I2C读取EEPROM(二)

    6 I2C读写EEPROM 6.1 RA Smart Configurator配置I2C 打开RA Smart Configurator,根据硬件
    发表于 04-28 23:14

    【RA-Eco-RA4M2开发板评测】I2C读取EEPROM(一)

    的存储器,常用来存储一些配置信息,以便系统重新上电的时候加载。 EEPROM 芯片最常用的通讯方式就是 I2C 协议,本文将要讲解EEPROM读写
    发表于 04-28 23:13

    基于APM32F407如何制作I2C EEPROM(AT24C02型号)的MDK-Keil下载算法

    基于APM32F407如何制作I2C EEPROM(AT24C02型号)的Keil下载算法,这样在我们下载代码时可以一键把数据烧录到EEPROM中。
    的头像 发表于 04-11 11:06 1752次阅读
    基于APM32F407如何制作<b class='flag-5'>I2C</b> <b class='flag-5'>EEPROM</b>(AT24<b class='flag-5'>C</b>02型号)的MDK-Keil下载算法