基于使用STM8单片机I2C方式实现读写操作

2020-05-23来源: eefocus关键字:STM8  单片机  I2C方式  读写操作

STM8硬件I2C知识

STM8S的I2C模块不仅可以接收和发送数据,还可以在接收时将数据从串行转换成并行数据,在发送时将数据从并行转换成串行数据。可以开启或禁止中断。接口通过数据引脚(SDA)和时钟引脚(SCL)连接到I2C总线。允许连接到标准(最高100kHz)或快速(最高400kHz)的I2C总线。

基于使用STM8单片机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);

}

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

上一篇:STM8学习笔记---串口printf函数的实现
下一篇:最后一页

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

推荐阅读

STM8S配置位 OptionByte
 1.什么是STM8S 的配置字 OptionByte2.Option Byt Byte 里面的位都表示什么3.如何编程Option Byte一 选项字节(OptionByte )STM8S 的配置字类似于AVR 的Fuse 熔丝位。用于配置端口的复用功能和读保护等操作。不同于AVR 的熔丝位,STM8S 的时钟配置并不在Option Byte 中,不会出现写完STM8S 后芯片直接锁死的尴尬。选项字节用于配置硬件特性和存储器保护状态,这些字节位于同一页的特定存储器阵列中。选项字节可以在ICP/SWIM模式中或IAP模式中修改, 也就是可以通过STlink 写配置字,或者是通过程序写选项字。举例:STM8S 的有一个
发表于 2020-04-27
STM8S配置位 OptionByte
STM8 IAR新建寄存器工程
.2.3.4.添加头文件目录转化为相对目录5.设置输出文件目录6.设置仿真工具
发表于 2020-04-27
STM8 IAR新建寄存器工程
stm8l151低功耗程序架构,调试心得
最近帮医院做了一款体温记录仪,整个硬件方案资源是:stm8L151 + NTC*2 + EEPROM + 锂电池充电保护电路 + 18mAh纽扣电池;软件逻辑是,每隔一分钟,采样两路温度并保存在EEP里;通过USB转TTL,上位机能够读取,展示温度曲线,最大最小平均值等简单的运算;整个方案很简单,但也走了不少弯路......单片机程序框架之伪代码:void main(void){    CLK_Config();    GPIO_Config();    ADC_Config();    USART_Config();   
发表于 2020-04-27
STM8设计几点需要注意的地方
1>、STM8的PC0、PC1两个引脚输出只有OD开漏输出,没有PP输出,如下图所示:如果想要使用PC0和PC1输出高电平,硬件设计的时候需要进行上拉,这两个端口无法进行软件上拉,只能靠硬件上拉。2>、使用STM8库函数的时候,函数GPIO_ReadInputDataBit()无法读取引脚的高电平,需要对库函数做修改
发表于 2020-04-25
STM8设计几点需要注意的地方
STM8SF103----ADC采集电压值
){ u16 u16_adc1_value; Init_ADC();//初始化ADC1 while(1) { ADC1_StartConversion();//ADC开始转换      u16_adc1_value = ADC1_GetConversionValue();//保存转换值 }}
发表于 2020-04-25
STM8使用STVD开发环境问题
1、编译时出现.ubsct size overflow--http://blog.sina.com.cn/s/blog_817a5eb601018186.html----------- Project roewe - STM8 Cosmic - Configuration Debug -------------Running Linkerclnk -l"C:Program FilesCOSMICCXSTM8Lib"  -o Debugroewe.sm8 -mDebugroewe.map Debugroewe.lkf#error clnk Debugroewe.lkf:1 segment .ubsct
发表于 2020-04-25
小广播
何立民专栏 单片机及嵌入式宝典

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

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