stm8的I2C库的使用

2019-11-09来源: eefocus关键字:stm8  I2C库  低功耗

一.前言


stm8是一款低功耗的MCU芯片,它具备stm32库函数和资源丰富的优势。也同时具有价格便宜,低功耗的特点。在一些项目中,能起到很好的作用。下面我介绍一下stm8的IIC硬件库函数驱动代码及实现。


二.IIC基本操作


iic基本操作分为读操作和写操作,这两个操作就可以对设备进行一些基本的操作了。还要知道设备的地址就ok了,具体的IIC时序大家可以上网看看。


三.实现代码


1.先要启动IIC的时钟,保证可以正常工作。 CLK_PeripheralClockConfig (CLK_Peripheral_I2C1,ENABLE);//开启IIC1时钟


2.再对IIC进行初始化的操作


 void Init(void)   

 {  

I2C_DeInit();  

I2C_Init(I2C_Speed, 0x88, I2C_DUTYCYCLE_2, I2C_ACK_CURR, I2C_ADDMODE_7BIT, 16);

  I2C_Cmd(ENABLE);  

 } 

可以用来对IIC的通信时间和主机地址以及从机地址等参数进行设置。IICSPEED最好不要超过400K,会造成通信的不稳定,最好在100K左右就可以了,host_address是主机的地址,可以自己设定。


3.IIC的写操作


/****************************************************************************

* 名称:I2C_WriteByte(uint8_t addr,uint8_t data)

* 功能:进行IIC的写操作。

* 入口参数: uint8_t addr 寄存器的地址

* uint8_t data 写入的数据 

* 出口参数:无

* 说明:对触摸屏的寄存器进行写入操作,变量都是16进制

****************************************************************************/


void I2C_WriteByte(uint8_t addr,uint8_t data)  

{  

  

while(I2C_GetFlagStatus( I2C_FLAG_BUSBUSY));

  

I2C_GenerateSTART( ENABLE);//开启I2C1  

while(!I2C_CheckEvent( I2C_EVENT_MASTER_MODE_SELECT));/*EV5,主模式*/  

  

I2C_Send7bitAddress( I2C1_WRITE_ADDRESS7, I2C_DIRECTION_TX );//器件地址 -- 默认0xD0  

while(!I2C_CheckEvent( I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));  

  

I2C_SendData( addr);//寄存器地址  

while (!I2C_CheckEvent( I2C_EVENT_MASTER_BYTE_TRANSMITTED));  

  

I2C_SendData( data);//发送数据  

while (!I2C_CheckEvent( I2C_EVENT_MASTER_BYTE_TRANSMITTED));  

I2C_AcknowledgeConfig(ENABLE);  

  

I2C_GenerateSTOP( ENABLE);//关闭I2C1总线  

}


上面的代码是IIC的写函数,可以对设备的寄存器进行写操作。I2C1_WRITE_ADDRESS7代表设备IIC的写入地址,根据器件地址的不同改变就可以。每一步都是调用的IIC的库函数,如果进行单步调试,地址寄存器都对的话,就可以看见每操作一步从机都会有一个应答信号。


4.IIC的读操作


uint8_t I2C_ReadByte(uint8_t addr)  

{  

uint8_t i;  

  

while(I2C_GetFlagStatus( I2C_FLAG_BUSBUSY));  

  

I2C_GenerateSTART( ENABLE);//开启I2C1  

while(!I2C_CheckEvent( I2C_EVENT_MASTER_MODE_SELECT));/*EV5,主模式*/  

  

I2C_Send7bitAddress( I2C1_WRITE_ADDRESS7, I2C_DIRECTION_TX );//器件地址 -- 默认0xD0  

while(!I2C_CheckEvent( I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));  

  

I2C_SendData( addr);//寄存器地址  

while (!I2C_CheckEvent( I2C_EVENT_MASTER_BYTE_TRANSMITTED));  

  

  

  

I2C_GenerateSTART( ENABLE);//开启I2C1  

while(!I2C_CheckEvent( I2C_EVENT_MASTER_MODE_SELECT));/*EV5,主模式*/  

  

I2C_Send7bitAddress( I2C1_READ_ADDRESS7, I2C_DIRECTION_RX );//器件地址 -- 默认0xD1  

while(!I2C_CheckEvent( I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));  

  

  

while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED));  

  

i=I2C_ReceiveData();//读取数据  

  

I2C_AcknowledgeConfig(DISABLE);  

  

I2C_GenerateSTOP( ENABLE);//关闭I2C1总线  

  

  

return i;  

  


IIC的读操作,跟写操作不同的是.读操作首先要先进行写操作,写一下要读的寄存器地址,当然地址也要发送写入的地址。然后再写入器件读取地址,要读取的寄存器地址,把数据读取出来。I2C1_READ_ADDRESS7为器件的读取地址,写操作和读操作两个操作的应答变量也不一样,这个要注意一下。


四.总结


硬件IIC的库函数实现通信,代码实现量小,调通以后的稳定性高,速度快。缺点是可能会占一部分内存空间,调试不方便,因为都是用的库函数,不容易找问题。

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

上一篇:STM8S103之GPIO
下一篇:stm8s105调试I2C记录

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

推荐阅读

stm8s 低功耗模式
因为用干电池供电,又需要超长待机了,成本又限制不能使用stm8l,所以开启低功耗之旅1.元器件选型挑选低功耗的元器件,一定要关注工作电流led 一定要高电平导通,不然的话,默认状态拉高很费电元器件尽量选择共阴解法,更省电2.主时钟频率频率和功耗是成正比的,选择试用的最低晶振能不开的功能尽量不开下面是对应的功耗表ADC最费电3.合理使用低功耗模式主要有一下几种等待模式活跃停机模式停机模式下面是对比等待模式使用asm(“WFI”)进入会被各种中断激活活跃停机模式AWU是用来当MCU进入低功耗的活跃停机(Active Halt)模式时提供一个内部的唤醒时间基准。该时间基准的时钟是由内部的低速RC振荡器时钟(LSI)或者通过预分频的HSE
发表于 2019-11-20
stm8s 低功耗模式
简单介绍下关于STM8S的几种低功耗模式
STM8S105的低功耗模式总的来说有四种:分别是等待模式,停机模式,快速活跃停机模式和慢速活跃停机模式1、等待模式:可执行指令wif()进入等待模式,该模式下主CPU停止工作,但其外设不停,严格来说只能算是降低功耗而不能算低功耗,该模式可由AMU或外部中断唤醒2、停机模式:可执行指令half()进入停机模式,该模式下主cpu和外设全部停止,达到最低功耗,只能由外部中断进行唤醒。3、快速活跃停机模式:在执行指令half()之前,如果你使能了AMU功能,则进入快速活跃停机模式,该模式下由于主电压调节器打开,在受到AMU或外部中断触发时,可快速唤醒。4、慢速活跃停机模式:在快速活跃停机模式下,如果设置内部时钟寄存器CLK_ICKR
发表于 2019-11-20
简单介绍下关于STM8S的几种低功耗模式
Atomthreads关于STM8S低功耗的思考
2000mA手机供电,理论上也最多能坚持46天,才一个月多点。这个记录太差了。STM8还有一个HALT模式,这是该芯片的最低功耗模式,电流是uA级别。但是该模式有诸多限制,进入该模式系统几乎所有的clock都停止,你的timer,adc,uart等等全部停止,除了AWU。atomthreads如果你在idle直接进入HALT,因为基本只有外部中断可以唤醒退出这个模式,当系统醒来了,请你想想,你的系统心跳还准么?你的应用线程如果使用了定时器,本来希望1秒钟后调用某个CALLBACK,结果HALT睡了5分钟,那还是定时器API本身参数的意义么?对datasheet熟悉的读者可能,可能立刻想到了AWU,似乎可以解决这个问题。在idle进入
发表于 2019-11-20
Atomthreads关于STM8S低功耗的思考
STM8L051之低功耗停机配置问题
在做stm8L的小一个项目,由电池供电,当按键长按关机,系统进入停机模式,虽然系统运行的时候有十几毫安的电流消耗(还没使用RTC定时唤醒),但是在停机模式下电流消耗竟然还有1.33ma的电流,花了半天的时间找资料,看文档,在网上看到不少大牛能做到0.4ua,自己无论如何设置IO,外设都无补于事,停机模式下电流最低还有1ma。 最后只能将开机初始化的外设函数一个一个注释掉,包括ADC,DMA,beep,以及TIM4,最后发现只注释掉ADC的初始化函数,再进入停机模式,果然电流接近0,5ua,也就是说可能ADC模块在进入停机模式前的关闭设置不正确,之前的是这样的:void PerCLK_OFF(){   C
发表于 2019-11-20
STM8S 自动唤醒AWU配置
简介AWU是用来当MCU进入低功耗的活跃停机(Active Halt)模式时提供一个内部的唤醒时间基准。 该时间基准的时钟是由内部的低速RC振荡器时钟(LSI)或者通过预分频的HSE晶振时钟来提供 的。校准LSILSI 时钟测量 在使用LSI低速内部时钟时,为了确保好的精度,它的频率可以通过TIMX的输入捕捉1来测定。将AWU_CSR的MSR位置1来把LSI的内部时钟连接到TIMX定时器的ICAP1;通过定时器的输入捕捉中断来测量LSI的时钟频率;到向AWU_APR的 APR [5:0] 位写入一个适当的值来调整AWU定时间隔到期望的时间间隔。AWUTB[3:0]位可以被更改来选择不同的时间间隔。 LSI的时钟频率测量方法也可以被用
发表于 2019-11-20
STM32初学笔记---延时函数及u16、u32、u8
在编写流水灯程序时发现,和对之前用的51单片机所用的普通软件延时函数有所不同,51的普通软件延时函数我们一般是这样编写的:#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charvoid delayms(uint xms){uint i,j;for(i=xms;i>0;i--) for(j=110;j>0;j--);}然而我们在对STM32利用库函数进行编程时采用此延时函数则完全行不通,而是采用下面的延时函数#include "
发表于 2019-11-19
小广播
何立民专栏 单片机及嵌入式宝典

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

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