STM32F207上I2C作为从机的硬件中断实现的代码及注释

发布者:玉米哥哥最新更新时间:2018-11-26 来源: eefocus关键字:STM32F207  I2C  硬件中断 手机看文章 扫描二维码
随时随地手机看文章

人家都说,写驱动简单,一般网上都有参考程序,或者官网有demo,可是要是看不懂例程代码,怎么办?确实也没什么好办法,只能硬着头皮,自己花时间研究研究喽。


一般看懂代码最起码知道其中的原理,才能推测出每一行代码的作用。今天要写的是I2C作为从机的硬件实现,原理在我上一篇日志中基本上讲得非常清楚了。今天直接上代码。


/*****************首先三个函数为初始化函数****************************/



/*!


 * @brief 配置I2C1的GPIO

 * @param none


 * @return NONE


 * @note PB6-SCL,PB7-SDA


 * @note 注意函数中的 GPIO_PinSource6 与 GPIO_Pin_6 不是同一个宏定义,


 */


void I2C1_GPIO_Init(void)


{


GPIO_InitTypeDef  GPIO_InitStructure;


RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); //!SR1 &= 0x00FF;             //!<清除错误标志


}


}


/*!


 * @brief I2C1接收和发送中断


 * @param none


 * @return NONE


 * @note PB6-SCL,PB7-SDA I2C1_EV_IRQHandler


 * @note 作为从机的I2C中断处理函数


 * @note 这里只涉及到五种事件


 */


void I2C1_EV_IRQHandler(void)


{


switch (I2C_GetLastEvent(I2C1)){//!<获取I2C事件


/*从机发送中断*/


case I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED:     //!


/********************接下来是中断处理函数**************************/


/*!


 * @brief I2C1错误中断


 * @param none


 * @return NONE


 * @note PB6-SCL,PB7-SDA


 */


void I2C1_ER_IRQHandler(void)


{


if ((I2C_ReadRegister(I2C1, I2C_Register_SR1) & 0xFF00) != 0x00){ //!<读状态寄存器,获取I2C错误


I2C1->SR1 &= 0x00FF; //!<清除错误标志


}


}

 

/*!


 * @brief I2C1接收和发送中断


 * @param none


 * @return NONE


 * @note PB6-SCL,PB7-SDA I2C1_EV_IRQHandler


 * @note 作为从机的I2C中断处理函数

 

* @note 这里只涉及到五种事件


 */


void I2C1_EV_IRQHandler(void)


{


switch (I2C_GetLastEvent(I2C1)){//!<获取I2C事件


/*从机发送中断*/


case I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED: //!


I2C_SendData(I2C1, data[num++]); //!<向主机发送数据


I2C_ITConfig(I2C1, I2C_IT_BUF , ENABLE); //!<做一个使能操作


break;


case I2C_EVENT_SLAVE_BYTE_TRANSMITTING: //!


case I2C_EVENT_SLAVE_BYTE_TRANSMITTED: //!<并且检测到主机发送过来的ACK后产生中断


I2C_SendData(I2C1, data[num++]); //!<继续向主机发送数据


break;


/*从机接收中断*/ 


case I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED: //!


num= 0; //!<发送字节数清零


break;


case I2C_EVENT_SLAVE_BYTE_RECEIVED: //!


case (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_SR1_BTF):  


num = I2C_ReceiveData(I2C1);


break;


case I2C_EVENT_SLAVE_STOP_DETECTED: //!


I2C_GetFlagStatus(I2C1, I2C_FLAG_STOPF);


I2C_Cmd(I2C1, ENABLE);


num= 0;


break;


default:


break;




关键字:STM32F207  I2C  硬件中断 引用地址:STM32F207上I2C作为从机的硬件中断实现的代码及注释

上一篇:STM32L151 I2C从机实现
下一篇:STM32之I2C例程(24C02)

推荐阅读最新更新时间:2024-03-16 16:18

AT91SAM7X256的I2C控制器TWI接口的使用方法
1 前 言 I2C(Inter-Integrated Circuit)总线是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。是微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊形式,具有接口线少,控制方式简单,器件封装形式小,通信速率较高等优点。AT91SAM7X256是Atmel公司于2005年推出的基于ARM7的工业级芯片,他以体积小、功耗低、连接方式广泛、处理资源丰富、控制灵活等特点受到嵌入式领域开发人员的重视。本文介绍AT91SAM7X256的I2C控制器TWI接口(two-wired interface)的使用方法,并以I2C设备E2PROM和日历时钟芯片为例,实现AT91S
[单片机]
AT91SAM7X256的<font color='red'>I2C</font>控制器TWI接口的使用方法
基于LTC4310设计的绝缘双向I2C总线通信技术
LTC4310是绝缘的双向I2C 总线 通信器件,每个器件可把I2C逻辑状态编码成信号,通过绝缘层传输到另一个器件.接收器件解码,并 驱动 I2C 总线 到适当的确逻辑状态.主要用在绝缘的I2C, SMBus和PMBus 接口 ,绝缘 电源 ,以太网供电和正到负 电源 通信.本文介绍了LTC4310主要特性,典型应用以及多种应用 电路 框图. The LTC®4310 provides bidirectional I2C communications between two I2C buses whose grounds are isolated from one another. Each LTC4310 encodes I2
[模拟电子]
STM8L驱动I2C类型的12864
原理 之前没有操作过12864这种类型的屏,但是,操作过其他类型的,原理都是相通的。12864是拥有128x64像素点这类屏幕的称号吧。屏幕有64行,128列;每个汉字是16x16,所以一个这样的屏,最多可以显示4x8的汉字或者8x16的字符。 我使用的是不带字库的I2C接口的屏幕,主芯片是ST7656。这样的屏,只能写,不能读。先配置屏幕,然后通过字模制作软件制作出待显示内容的像素数字,最后,通过数据线传送给屏幕显示。了解了原理后,接下来就根据主芯片的数据手册进行配置屏幕就好了。 硬件连线 CS:片选 RST: 复位 RS:数据或命令选择 SDA:I2C数据线 SCL:I2C时钟线 I2C采用的是软件模拟的 底层写操
[单片机]
基于I2C接口控制方式的LED驱动器的实现
无论是手持设备、游戏机、霓虹灯、广告牌等,LED无疑都是当前最热的应用。眩目的色彩及高质的光亮,总能第一时间吸引人的眼球。在当前众多的LED控制器面前,如何选择一款功能丰富且性价比又高的产品来迎合自己的设计,无疑是摆在每个设计师面前的问题。   最简单的LED驱动,我们可以用普通的I/O来实现。但I/O控制只能实现LED的ON与OFF,无法用来进行混光、闪烁等功能,而且每个LED都需要占用一个单独的I/O资源,无疑性价比很低。我们也可以用专用的大电流LED控制器来设计,但昂贵的成本首先会成为问题,而且设计复杂,程度也会跟着各种干扰的出现相应地提高。基于这些,恩智浦(NXP)推出一系列使用I2C接口的LED驱动器,它可以通过I2C
[电源管理]
基于<font color='red'>I2C</font>接口控制方式的LED驱动器的实现
STM32 I2C 硬件中断方式实现方法
流程图如下: I2C 中断处理函数如下: /** * @brief This function handles I2C1 Event interrupt request, tx, rx * buffer and number of bytes will be changed. * @param None * @retval None */ void I2C1_EV_IRQHandler(void) { #ifdef ARC_I2C_IRQ uint32_t i2cEvent; I2C_param_struct __IO *pI2C_param; pI2C_param = ARC_get_
[单片机]
STM32 <font color='red'>I2C</font> <font color='red'>硬件</font><font color='red'>中断</font>方式实现方法
I2C总线学习—查缺补漏—S3C2440的I2C控制器
学习了IIC总线协议的理论部分,觉得应该学习具体操作2440的IIC控制器,毕竟最终都是为了学习S3C2440,所以就把这一部分补上。 S3C2440的I2C接口有四种工作模式:主机发送器、主机接收器、从机发送器、从机接收机。其内部结构如下图所示。 从上图可以看出,S3C2440提供4个寄存器来完成所有的IIC操作。SDA线上的数据从IICDS寄存器经过移位寄存器发出,或通过移位寄存器传入IICDS寄存器;IICADD寄存器中保存S3C2440当做从机时的地址;IICCON、IICSTAT两个寄存器用来控制或标识各种状态,比如选择工作工作模式,发出S信号、P信号,决定是否发出ACK信号,检测是否
[单片机]
<font color='red'>I2C</font>总线学习—查缺补漏—S3C2440的<font color='red'>I2C</font>控制器
S3C2440 I2C实现
/***************************************************** *说 明:S3C2440 I2C实现 *****************************************************/ 1:I2C原理 总线的构成及信号类型 I2C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,最高传送速率100kbps。各种被控制电路均并联在这条总线上,但就像电话机一样只有拨通各自的号码才能工作,所以每个电路和模块都有唯一的地址,在信息的传输过程中,I2C总线上并接的每一模块电路既是主控器
[单片机]
S3C2440 <font color='red'>I2C</font>实现
PIC的I2C读写程序
**************************************** * PIC的I2C读写程序 * **************************************** TITLE " TWO WIRE/I2C BUS INTERFACE WITH PIC16C5x " ; LIST P=16C54 ; ;***************************************************************************** ;** Two wire/I2C Bus READ/WRITE Sample Routines of
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved