作者:卢老师,华清远见嵌入式学院讲师。

在大多情况下,我们使用MCU控制传感器,节点以及相关从设备,但在较为复杂的系统中,有时候也会使用MCU做为从设备。

下面是关于stm32f051的从模式实现方法,主要思路为从设备从中断里面接受 IIC主设备发送的数据,并加以处理。

下图为STM32F051的最小系统:

IIC从模式 GPIO的配置

根据原理图查ST32F051的datasheet

配置引脚:

void I2C_GPIO_Configuration(void)
        {
                GPIO_InitTypeDefGPIO_InitStruct;
        
                /* Enable GPIOA clock */
                RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
                /*!< sEE_I2C Periph clock enable */
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1 , ENABLE);
                /*!< GPIO configuration */
                /*!< Configure sEE_I2C pins: SCL */
                GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;
                GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;//GPIO_Mode_IN
                GPIO_InitStruct.GPIO_Speed = GPIO_Speed_Level_3;
                GPIO_InitStruct.GPIO_OType = GPIO_OType_OD;//open-drain
                GPIO_Init(GPIOB , &GPIO_InitStruct);
        
                /*!< Configure sEE_I2C pins: SDA */
                GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
                GPIO_Init(GPIOB , &GPIO_InitStruct);
        
                /* Connect PXx to I2C_SCL*/
                GPIO_PinAFConfig( GPIOB , GPIO_PinSource8, GPIO_AF_1);
                /* Connect PXx to I2C_SDA*/
                GPIO_PinAFConfig( GPIOB ,GPIO_PinSource9, GPIO_AF_1);
        }

IIC从模式配置,在配置时,需要设置地址,在这里设置为0XA0,而从设备的时钟属于被动模式,有IIC的主端确定。

void I2C_Configuration(void)
        {
                I2C_InitTypeDef I2C_InitStruct;
        
                /* I2C configuration */
                I2C_InitStruct.I2C_Mode = I2C_Mode_I2C;
                I2C_InitStruct.I2C_AnalogFilter = I2C_AnalogFilter_Enable;
                I2C_InitStruct.I2C_DigitalFilter = 0x00;
                I2C_InitStruct.I2C_OwnAddress1 =0xA0;
                I2C_InitStruct.I2C_Ack = I2C_Ack_Enable;
                I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
                I2C_InitStruct.I2C_Timing = 0xb0420f13;//100Kbits
                /* I2C Peripheral Enable */
                I2C_Cmd(I2C1, ENABLE);
                /* Apply I2C configuration after enabling it */
                I2C_Init(I2C1, &I2C_InitStruct);
        }

下面是IIC中断函数的实现

void I2C1_IRQHandler(void)
        {
                I2C_ClearITPendingBit(I2C1, I2C_ISR_ADDR|I2C_ISR_STOPF );
                if(I2C_GetITStatus( I2C1, I2C_IT_RXNE));
                {
                        I2Cbuf[I2C_IT_FLAG++]=I2C_ReceiveData(I2C1);
                }
        }

中断函数里面,清中断为2种,一种为IIC从地址校验成功,一种是数据传输过程中停止。对于从设备,接受数据中断才是我们最需要的,这里我们将IIC接受的数据存入定义好的数组中,这样以备后用,同是,在读取接受数据时,硬件已经将接受数据的中断清楚掉。

文章来源:华清远见嵌入式学院原文地址:http://www.embedu.org/Column/Column912.htm

更多相关嵌入式免费资料查看华清远见讲师博文>>

基于华清远见STM32f051的 IIC从模式实现方法的更多相关文章

  1. 热烈庆祝华清远见2014嵌入式系统(Linux&Android)开发就业培训课程全面升级

    近日,华清远见公开宣布:2014嵌入式系统 (Linux&Android)开发就业培训课程再次升级!据悉,华清远见如今已经持续10年,一直保持课程每年2次的更新的频率.华清远见的每 次课程更新 ...

  2. 热烈祝贺华清远见《ARM处理器开发详解》第2版正式出版

    2014年6月,由华清远见研发中心组织多名业 内顶尖讲师编写的<ARM处理器开发详解>一书正式出版.本书以S5PV210处理器为平台,详细介绍了嵌入式系统开发的各个主要环节,并注重实践,辅 ...

  3. [华清远见]FPGA公益培训

    本套视频教程为华清远见 网络公益培训活动,主讲人:姚远老师,华清远见高级讲师. ------------------------------------------------------------ ...

  4. 华清远见Linux设备驱动(每章小结)

    1.  linux设备驱动是以内核模块的方式而存在的,在具体的驱动开发中将驱动编译为模块具有很到的工程意义.因为如果将正在开发中的驱动编译如内核,而开发过程中会不断修改驱动代码,则需要不断的编译和重启 ...

  5. ARM大学计划全球经理到访华清远见,深入交流教育合作

    来源:华清远见嵌入式学院 10月20日,ARM大学计划全球经理Khaled Benkrid,高级内容主编洪川博士在ARM大学计划亚太经理陈炜博士的陪同下到访华清远见,就最新嵌入式技术.ARM处理器在教 ...

  6. 2021夏季学期华清大学EE数算OJ2:难缠的店长

    2021年夏季学期华清大学电子系数算oj2题解 某知名oier锐评蒟蒻的oj1题解: 话不多说,进入oj2题解: 难缠的oj 之 难缠的店长 当时读完我已经因为无良甲方的行为出离愤怒了!但是做题还是要 ...

  7. C#基于SQLiteHelper类似SqlHelper类实现存取Sqlite数据库的方法

    本文实例讲述了C#基于SQLiteHelper类似SqlHelper类实现存取Sqlite数据库的方法.分享给大家供大家参考.具体如下: 这个类不是我实现的,英文原文地址为http://www.egg ...

  8. 分享基于EF6、Unitwork、Autofac的Repository模式设计

    目录 分享基于EF6.Unitwork.Autofac的Repository模式设计 一.实现的思路和结构图 二.Repository设计具体的实现代码 三.Repository设计的具体的使用 四. ...

  9. 基于点云的3ds Max快速精细三维建模方法及系统的制作方法 插件开发

                                 基于点云的3ds Max快速精细三维建模方法及系统的制作方法[技术领域][0001]本发明涉及数字城市三维建模领域,尤其涉及一种基于点云的3d ...

随机推荐

  1. Twemproxy 缓存代理服务器

    Twemproxy 缓存代理服务器 Twemproxy 概述 Twemproxy(又称为nutcracker)是一个轻量级的Redis和Memcached代理,主要用来减少对后端缓存服务器的连接数.T ...

  2. Hbase过滤器Filter的使用心得(爬坑经验)

    Hbase 的过滤器是个好东西.. 给这种非关系型数据库本来不能复杂查询的情况得到了很好的扩展..提供了很多的帮助.. 但是Filter的种类何其之多..让人眼花缭乱.. 譬如..分页类型的PageF ...

  3. DTD总结

    DTD 可以检测 XNM 文档的结构是否正确,就好像文章中用来保证结构正确的语法规则一样. 引入 DTD 1.引入私有的 DTD 文件,URI 可以使相对地址或绝对地址 <!DOCTYPE 根元 ...

  4. LNMP环境搭建笔记

    说明:前面尝试的在ubuntu12.04上搭建的LAMP环境由于开发的需要需要对php的版本进行升级,然而通过apt-get库安装的php的版本是5.3.10,不能满足开发需要.此笔记安装的php的 ...

  5. ZOJ 3696 Alien's Organ

    泊松分布.... Alien's Organ Time Limit: 2 Seconds      Memory Limit: 65536 KB There's an alien whose name ...

  6. 【bzoj3531】 [SDOI2014]旅行

    题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰.为了方便,我们 ...

  7. PHP中静态(static)调用非静态方法详解

    1.PHP中可以静态调用非静态方法么? 今天我被问到PHP中可不可以使用 className::methodName() 的方法来调用一个没有声明static的方法.在我的印象中,我好像是见过这种用法 ...

  8. java基础知识(一)数据类型(下)

    前面介绍了java的8种基本数据类型,包括boolean, byte, char, short,  int, long, float, double.同时,java也提供了这些类型的封装类,分别为Bo ...

  9. Android 双击 Back 键退出程序

    双击退出程序的原理无非就是设置一个退出标识(询问是否退出),如果改变了这个标识(确认退出),则再次点击时立马退出,如果短时间内没有退出,则延时重置这个标识(不退出). ================ ...

  10. sql server 2008 数据的行转列

    create table tb(id int, value varchar(10)) insert into tb values(1,'aa') insert into tb values(1,'bb ...