STM8S_010_I2C读写EEPROM(硬件方式)

2019-11-09来源: eefocus关键字:STM8S  I2C读写  EEPROM  硬件方式

Ⅰ、写在前面


相信看过前面那篇文章“更加深入理解I2C总线、协议及应用”的人对I2C都有一定的了解了。那篇文章是针对I2C,使用单片机IO模拟I2C方式实现读写操作。


本文将讲述硬件I2C读写操作,也就是由处理器自身硬件的I2C实现时钟、数据的传输过程。


Ⅱ、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)


3.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);


}


 


4.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



提示:如果网盘链接失效,可以微信公众号“底部菜单”查看更新链接。



关键字:STM8S  I2C读写  EEPROM  硬件方式 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic479530.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:I2C总线浅谈之(四)--STM8的IIC驱动文件示例
下一篇:STM8 I/O口模拟I2C

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

PCF8563 时钟芯片驱动程序 (STM8S/STM8L)
模拟I2C读取时钟芯片PCF8563中的日期时间 #define SCLK_Clr() GPIO_ResetBits(GPIOD, GPIO_PIN_1)//SDA IIC接口的时钟信号#define SCLK_Set() GPIO_SetBits(GPIOD, GPIO_PIN_1)#define SDIN_Clr() GPIO_ResetBits(GPIOD, GPIO_PIN_2)//SCL IIC接口的数据信号#define SDIN_Set() GPIO_SetBits(GPIOD, GPIO_PIN_2)u8 buf[7];void SDA_IN(u8 in) {  if(in) 
发表于 2019-11-13
STM8S的HALT模式与AWU唤醒
/************************************************************************************************************************************ Name    : STM8S的HALT模式与AWU唤醒* Author  : MingMing* Release : 2014/1/2* Update  : 2014/1/2* E-mail  : clint.wang@foxmail.com
发表于 2019-11-13
STM8S003的GPIO模拟I2C切换输入输出的解决办法
刚开始学STM8,很多东西刚了解,正在做一个温湿度显示小板,就是使用I2C驱动SHT20传感器,并显示到数码管,数码管用的四位一体共阴数码管,STM8管脚有限,添加了一片TM1650做驱动,不过SHT20和TM1650都是用的I2C接口,由于对STM8硬件I2C还不了解,先打算用软件模拟,这就涉及到需要对GPIO做输入输出切换处理来检测ACK响应,刚开始,直接操作DDR寄存器,但是出现从输出切换到输入就会出现单片机死机,不解,查资料,得到一个解决办法,在输出状态时,可以不用切换到输入,我使用管脚D4,D5这两个管脚,这两个管脚比较特殊,就是真正开漏,在管脚描述为T,其它描述为HS(高吸收电流)。解决办法,将IO设置为开漏输出,外部
发表于 2019-11-11
STM8S103之IO复用
一、简介本文以STM8S103F3P6编程为例,介绍STM8S103F3P6如何引脚复用。二、实验平台电脑平台:Windows7 64位旗舰编译软件:IAR硬件平台:STM8S103F3P6三、版权声明四、实验前提1、在进行本文步骤前,请先安装IAR  EWSTM8-EV-1311版本;准备好STM8S103F3P6硬件平台。五、基础知识暂无六、源码地址暂无七、实验内容1.先阅读STM8S103F数据手册2.操作步骤以STM8S103F3P6的IO“PC6”为定时器1PWM输出为例:1)、配置定时器1为PWM输出void Init_Timer1(void){  GPIO_Init(GPIOC
发表于 2019-11-11
STM8S103之IO复用
stm8s105调试I2C记录
最近由于AR项目中调试LCOS需要用到STM8S105的mcu,本次主要是使用模拟I2C。1.IIC协议简介 IIC协议这里只做简要介绍,详细介绍可以百度了解,协议相对简单,主要有开始位,停止位,应答位,非应答位。开始位:当时钟为高,数据线由高变低停止位:当时钟位高,数据线由低变高。应答位:第9个时钟到来时,数据线为低。(这里第9个时钟,发送完一个字节,紧接着就是第9个时钟到来)非应答位,第9个时钟到来时,数据线为高。2.LCOS协议:1.发送数据:单数据发送: 开始位:写地址位(8bit):寄存器地址(16bit):数据(8bit):停止位多字节发送:开始位:写地址(8bit):寄存器地址(16bit):数据(8bit
发表于 2019-11-09
stm8s105调试I2C记录
2440 I2C存储卡读写实验 AT24c08a
,让IIC状态改为开始状态,准备下一次读写操作。    指定内存读函数,首先配置设备为发送模式,写入要读的设备地址,写入要读的设备内存,设置为主机接收模式,发送接收设备地址,此后从设备会返回一个要读的内存地址,读取该地址抛弃后,连续读取指定内存数据,读到最后一个数据不再产生应答,停止接收,改为准备状态。    AT24C08 的地址格式为: 1 0 1 0 A2 P1 P0 W/R    A2为设备地址位、P1,P0为片内页寻址  LSB=0 写    LSB=1 读其中mini2440读写位为自动标记无需配置。/*51实验24: I2C
发表于 2019-10-21
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved