0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM8S_010_I2C读写EEPROM (硬件方式)

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 2020-03-14 14:54 次阅读

周末需要休息,也需要做事,像我这种,周末也不忘写文章分享给你们。目的很简单,就是让你们不休息。

开玩笑啦

像我这种人

还是希望你们多学点知识

正所谓学到老,活到老

写在前面

相信看过前面那篇文章“更加深入理解I2C总线、协议及应用”的人,对I2C都有一定的了解了。那篇文章是针对I2C使用单片机IOvwin 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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • EEPROM
    +关注

    关注

    9

    文章

    984

    浏览量

    80970
  • I2C
    I2C
    +关注

    关注

    28

    文章

    1438

    浏览量

    122006
  • STM8S
    +关注

    关注

    16

    文章

    149

    浏览量

    31255
收藏 人收藏

    评论

    相关推荐

    使用C2000I2C模块连接EEPROM

    德赢Vwin官网 网站提供《使用 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通过I2CEEPROM启动时,收到了I2CEEPROM编程失败的错误信息怎么解决?

    我使用的是 CYUSB3014。 在通过 I2C EEPROM启动时,我收到了 I2C EEPROM编程失败的错误信息 当我尝试使用 RAM 时,编程成功。 PMODE 引脚连接至
    发表于07-11 06:12

    stm32f030的硬件i2c中断方式读写数据,为什么调试不出来?

    有没有哪位大神用过stm32f030的 硬件 i2c中断 方式 读写数据的?看文档感觉可以用的,但是怎么就是调试不出来呢。
    发表于05-11 08:02

    STM8S003F调试硬件I2C遇到的疑问求解?

    最近新使用STM 8S003F芯片,在调试 硬件 I2C的遇到了一个奇怪的问题:示波器仅仅能够量到起始信号,然后一直保持低电平,直到超时。我的理解:不管Slave地址正不正确,SCL应该能够得输出吧,可是
    发表于04-24 06:50

    用STM8S207硬件I2C调试用轮询的方式,一旦加入中断,I2C的时序就出现了问题,为什么?

    用STM 8S207 硬件 I2C调试用轮询的 方式发现如果不加入其它中断可以正常运行,一旦加入中断, I2C的时序就出现了问题,比如用定时器如果设
    发表于04-19 07:49

    STM32F103利用I2C读写EEPROM时,利用页写入时,读回的数据和写入的数据不一致,为什么?

    在STM32F103芯片中,利用 I2C 读写 EEPROM时,单字节写入,读回的数据和写入的一致;但是当利用页写入时,读回的数据和写入的数据不一致,这是什么原因导致的?
    发表于03-20 07:01

    利用软件模拟i2c读写EEPROM,超过256个字节就读写不了了的原因?如何处理?

    利用野火的软件模拟 i2c 读写 EEPROMEEPROM的芯片型号为AT24 C512, 读写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

    GD32 MCU硬件I2C不可靠不如软件I2C?来看看红枫派开发版的硬件I2C驱动如何做到稳得一批

    在一个评论中,看到网友对 硬件 I2C的讨论, 硬件 I2CBusy找不到原因、软件 I2C稳得一批。
    的头像 发表于02-23 09:37 2075次阅读
    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>驱动如何做到稳得一批

    CW32单片机I2C接口读写EEPROM芯片介绍

    CW32单片机 I2C接口 读写 EEPROM芯片介绍
    的头像 发表于11-09 17:42 840次阅读
    CW32单片机<b class='flag-5'>I2C</b>接口<b class='flag-5'>读写</b><b class='flag-5'>EEPROM</b>芯片介绍

    基于STCl2C5A60S2单片机的SD卡读写

    德赢Vwin官网 网站提供《基于STCl 2C5A60S2单片机的SD卡 读写.pdf》资料免费下载
    发表于10-10 09:34 8次下载
    基于STCl<b class='flag-5'>2C5A60S2</b>单片机的SD卡<b class='flag-5'>读写</b>

    I2C总线介绍I2C读写时序介绍

    作为嵌入式开发人员,无论是 硬件还是软件工程师,或多或少都会接触过 I2C接口的外设。诸如常用的存储器 EEPROM等皆是 I2C接口进行通信。
    发表于10-01 16:57 1794次阅读
    <b class='flag-5'>I2C</b>总线介绍 <b class='flag-5'>I2C</b><b class='flag-5'>读写</b>时序介绍

    I2C读写时序分析和实现思路

    上篇推文对 I2C总线的特性进行了介绍和描述。对于开发者而言,最重要的是编码 I2C读写时序驱动。本篇推文主要总结和分享 I2C总线主机端通信的编程实现思路,并不对应特定MCU的
    发表于10-01 16:54 1203次阅读
    <b class='flag-5'>I2C</b><b class='flag-5'>读写</b>时序分析和实现思路

    基于51单片机的I2C-EEPROM实验

    标准。 它是同步通信的一种特殊形式,具有接口线少,控制 方式简单,器件封装形式小,通信速率较高等优点。 I2C总线只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。 由于其管脚少, 硬件实现简单,可扩展性强等特点,因此被广
    的头像 发表于09-11 10:37 925次阅读
    基于51单片机的<b class='flag-5'>I2C-EEPROM</b>实验