STM32 I2C从机发送数据_中断方式

发布者:Blissful567最新更新时间:2018-11-26 来源: eefocus关键字:STM32  I2C  发送数据  中断方式 手机看文章 扫描二维码
随时随地手机看文章

在调试stm32 I2C中断方式发送数据时,发现上篇介绍的内容有很多不足之处,对I2C时序也有了新的认识。




上篇文章介绍在数据发送完成后,发送NACK和STOP,然后向从机DR寄存器写了一个没用的数据,目的是为了清楚传输完成事件。其实文档中说的很明白,再倒数第二个数之后发送NACK和STOP,当时没有理解,现在看来确实是这样。


利用中断方法时,对发送NACK及STOP要求比较严格,调试时在多个位置都测试了下,发现只有在读取寄存器最后一个数据之前发送NACK和STOP,但要在主机接收事件之后,逻辑代码如下:


   //这段代码顺序不能改变,否则无法终止总线


   {


    /*检测主机接收数据完成事件*/


       while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED));


         I2C_AcknowledgeConfig(I2C1,DISABLE);


       /*Send I2C1 STOP Condition */


       I2C_GenerateSTOP(I2C1,ENABLE);                 


    /* Store received data on I2C1 */


    I2C_Buffer_Rx[RxIdx++] =I2C_ReceiveData(I2C1);


         }


关键字:STM32  I2C  发送数据  中断方式 引用地址:STM32 I2C从机发送数据_中断方式

上一篇:stm32的I2C主从模式
下一篇:【STM32 IIC详解】stm32 IIC从机模式(中断方式收发数据)

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

不用晶振,STM32内部HSI时钟的倍频使用
博主最近用STM32F1系列单片机做一个触摸屏USB鼠标,考虑不用外部晶振而使用STM32内部8MHz HSI RC作为时钟源。由于USB协议规定了48MHz 的USB时钟,故必须对HIS作PLL倍频处理后得到PLLCLK作为STSCLK时钟。时钟关系见如下STM32F1时钟树: 类比正点原子STM32F1寄存器版本使用外部晶振的时钟初始化函数,改动得到使用HSI作为时钟源,SYSCLK为48MHz的初始化代码: void Stm32_Clock_Init(u8 PLL) { unsigned char temp=0; MYRCC_DeInit(); //复位并配置向量表 RCC- CR|=0x00
[单片机]
不用晶振,<font color='red'>STM32</font>内部HSI时钟的倍频使用
stm32低功耗设计经验
只看帖不发帖是不好的,我也来发发帖子吧,写的不好谅解啊。 前两个月在公司做了一个低功耗项目,现在功耗最低10uA不到,平均功耗40uA左右,算是达标了。因为是公司产品,就不方便贴代码、原理图了,该产品是一个小模块,可以方便的嵌入到各种系统里面。跟原子哥他们卖的NRF2401类似,是一个读卡器。 做这个项目中间也请了技术支持,因为外围电路芯片的功耗一直降不下来,经过与对方的反复交流,对方提供了低功耗的测试结果、硬件方案、软件方案,经过修改测试,最终成为我们的产品,功耗比较满意。 硬件方案选择的是STM32,外加某公司的读卡芯片。前期完成了读卡等功能的开发,最后一项开发内容是最艰巨也是最困难的---低
[单片机]
关于stm32的正交解码
关于正交解码,我先解释何为正交解码,,,,其实名字挺高大上的,,,,还是先说编码器吧 看一下我用过的一种编码器 编码器的 线 数 ,是说编码器转一圈输出多少个脉冲,,,如果一个编码器是500线,,,说明这个编码器转一圈对应的信号线会输出500个脉冲,,,,为什么说是对应的,,,对于上面的编码器而言是这样的,,,,但是有的编码器里面有好多线,,,有的信号线是转一圈就输出对应多少线的脉冲,,,有的信号线是转一圈就输出一个脉冲,,,,这就要看编码器的资料了...... 看我上面用过的这个编码器,,使用A,B,VCC,GND这四根线,, 编码器转一圈A信号线会输出500个脉冲,,,,B信号线也会输出500个脉冲,,不过 正转的时
[单片机]
关于<font color='red'>stm32</font>的正交解码
ARM-Linux驱动--ADC驱动(中断方式
硬件平台:FL2440 内核版本:2.6.28 主机平台:Ubuntu 11.04 内核版本:2.6.39 原创作品,转载请标明出处:http://blog.csdn.net/yming0221/archive/2011/06/26/6568937.aspx 这个驱动写了好久,因为原来的Linux内核编译的时候将触摸屏驱动编译进内核了,而触摸屏驱动里的ADC中断在注册的时候类型选择的是 IRQF_SAMPLE_RANDOM,不是共享类型,所以,自己写的ADC驱动在每次open的时候,总提示ADC中断注册失败。 解决方案: 重新配置内核,选择触摸屏驱动以模块的形式编译,而不是直接编译进内核,这样Linux在启
[单片机]
ARM-Linux驱动--ADC驱动(<font color='red'>中断</font><font color='red'>方式</font>)
揭秘STM32的心电采集仪电路原理
  心血管类疾病已经成为威胁人类身体健康的重要疾病之一,而清晰有效的心电图为诊断这类疾病提供了依据,心电采集电路是心电采集仪的关键部分,心电信号属于微弱信号,其频率范围在0.03~100 Hz 之间,幅度在0~5 mV 之间,同时心电信号还掺杂有大量的干扰信号,因此,设计良好的滤波电路和选择合适的控制器是得到有效心电信号的关键。基于此,本文设计了以STM32 为控制核心,AD620 和OP07 为模拟前端的心电采集仪,本设计简单实用,噪声干扰得到了有效抑制。   主控模块电路设计   主控模块的STM32F103VET 单片机是控制器的核心,该单片机是ST 意法半导体公司生产的32 位高性能、低成本和低功耗的增强型单片机,其内
[单片机]
揭秘<font color='red'>STM32</font>的心电采集仪电路原理
STM32的ADC用法
AD采样在电路中是一种比较常见的功能,可以用于电池电压检测、传感器值读取、信号采集等。STM32的ADC,由于引入了DMA,以及多种触发源,功能自然强大,用法也多种多样。今天,我们简单说说在单通道情况下,AD采样的几种用法。 1、AD单次转换+软件启动 最基本的用法,通过程序启动AD,AD采集一次,我们就去读一次。这种情况,建议开启AD转换完成中断,在中断中读出AD值并做处理。 这种方式的优点是配置简单,缺点么,太T么简单~ 初始化的时候,启动一次。然后在主循环里,每隔一秒启动一次。 在中断回调函数里,进行相关处理: 电脑输出如下: 2、连续转换+软件启动 在方法1的基础上做调整,从单次转换,变成连续转换。
[单片机]
<font color='red'>STM32</font>的ADC用法
STM32 keil 添加.h文件方法
新建并添加.h文件,文件名称命名与引用相同。 即如引用led.h,则保存的.h文件也应命名为led.h 例如: 在main函数中,引用
[单片机]
<font color='red'>STM32</font> keil 添加.h文件方法
STM32单片机半主机模式的应用
在keil中编程时常会遇到__use_no_semihosting_swi的警告,这时你就是进入了半主机模式。 在嵌入式的编程中你是避免不了使用printf、fopen、fclose等函数的但是因为嵌入式的程序中并没有对这些函数的底层实现,使得设备运行时会进入软件中断BAEB处,这时就需要__use_no_semihosting_swi这 个声明,使程序遇到这些文件操作函数时不停在此中断处,具体操作如下,将下列程序加入你的工程中: #pragmaimport(__use_no_semihosting_swi)#pragmaimport(_main_redirection)constchar__stdin_name[150]
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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