STM32硬件IIC

发布者:创新火花最新更新时间:2020-09-21 来源: eefocus关键字:STM32  硬件IIC  指针 手机看文章 扫描二维码
随时随地手机看文章

 1 /**

 2   * @brief   写一个字节到I2C设备中

 3   * @param   

 4   *        @arg pBuffer:缓冲区指针

 5   *        @arg WriteAddr:写地址 

 6   * @retval  正常返回1,异常返回0

 7   */

 8 uint8_t I2C_ByteWrite(u8 pBuffer, u8 WriteAddr)

 9 {

10   /* Send STRAT condition */

11   I2C_GenerateSTART(macI2Cx, ENABLE);

12     

13     I2CTimeout = I2CT_FLAG_TIMEOUT;

14 

15 

16  /* Test on EV5 and clear it */

17 //启动信号发出之后要等待状态寄存器SR1的位0(SB=1),状态寄存器SR2的位1(BUSY=1)和位0(MSL=1),此时表明主模式下,起始条件已发送,总线处于忙状态;确保IIC通讯正确

18   while(!I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_MODE_SELECT))

19   {

20     if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback();

21   } 

22 

23   /* Send slave address for write */

24   I2C_Send7bitAddress(macI2Cx, MPU6050_SLAVE_ADDRESS, I2C_Direction_Transmitter);//7bit slave address + read/write (0write,1 read)

25   

26     I2CTimeout = I2CT_FLAG_TIMEOUT;

27     

28   /* Test on EV6 and clear it */

29     //从机地址发出之后,等待 BUSY, MSL, ADDR, TXE and TRA flags标志位

30      while(!I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) 

31     {

32     if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback();

33   }  

34       

35   /* Send the slave's internal address to write to */

36   I2C_SendData(macI2Cx, WriteAddr);

37   

38     I2CTimeout = I2CT_FLAG_TIMEOUT;

39   /* Test on EV8 and clear it */

40     /* TRA, BUSY, MSL, TXE and BTF flags */

41   while(!I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED))

42     {

43     if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback();

44   } 

45 

46   /* Send the byte to be written */

47   I2C_SendData(macI2Cx, pBuffer); 

48     

49     I2CTimeout = I2CT_FLAG_TIMEOUT;

50    

51   /* Test on EV8 and clear it */

52     /* TRA, BUSY, MSL, TXE and BTF flags */

53   while(!I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED))    

54     {

55     if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback();

56   } 

57     

58   /* Send STOP condition */

59   I2C_GenerateSTOP(macI2Cx, ENABLE);

60     

61     return 1; //正常返回1

62 }


IIC事件检测:498页。STM32的硬件IIC通信非常严格,每一步都要检测相应的标志位是否正确,确保通信不会出错。


  1 /**

  2   * @brief   从I2C设备里面读取一块数据 

  3   * @param   

  4   *        @arg pBuffer:存放从slave读取的数据的缓冲区指针

  5   *        @arg WriteAddr:接收数据的从设备的地址

  6   *     @arg NumByteToWrite:要从从设备读取的字节数

  7   * @retval  正常返回1,异常返回0

  8   */

  9 uint8_t I2C_BufferRead(u8* pBuffer, u8 ReadAddr, u16 NumByteToRead)

 10 {  

 11   I2CTimeout = I2CT_LONG_TIMEOUT;

 12     

 13   while(I2C_GetFlagStatus(macI2Cx, I2C_FLAG_BUSY)) // Added by Najoua 27/08/2008    

 14   {

 15     if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback();

 16    }

 17     

 18   I2C_GenerateSTART(macI2Cx, ENABLE);

 19   

 20     I2CTimeout = I2CT_FLAG_TIMEOUT;

 21      

 22   /* Test on EV5 and clear it */

 23   while(!I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_MODE_SELECT))

 24     {

 25     if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback();

 26    }

 27     

 28   /* Send slave address for write */

 29   I2C_Send7bitAddress(macI2Cx, MPU6050_SLAVE_ADDRESS, I2C_Direction_Transmitter);

 30 

 31     I2CTimeout = I2CT_FLAG_TIMEOUT;

 32      

 33   /* Test on EV6 and clear it */

 34   while(!I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) 

 35     {

 36     if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback();

 37    }

 38     

 39   /* Clear EV6 by setting again the PE bit */

 40   I2C_Cmd(macI2Cx, ENABLE);

 41 

 42   /* Send the slave's internal address to write to */

 43   I2C_SendData(macI2Cx, ReadAddr);  

 44 

 45     I2CTimeout = I2CT_FLAG_TIMEOUT;

 46      

 47   /* Test on EV8 and clear it */

 48   while(!I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED))

 49     {

 50     if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback();

 51    }

 52     

 53   /* Send STRAT condition a second time */  

 54   I2C_GenerateSTART(macI2Cx, ENABLE);

 55   

 56     I2CTimeout = I2CT_FLAG_TIMEOUT;

 57   /* Test on EV5 and clear it */

 58   while(!I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_MODE_SELECT))

 59     {

 60     if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback();

 61    }

 62         

 63   /* Send slave address for read */

 64   I2C_Send7bitAddress(macI2Cx, MPU6050_SLAVE_ADDRESS, I2C_Direction_Receiver);

 65   

 66     I2CTimeout = I2CT_FLAG_TIMEOUT;

 67      

 68   /* Test on EV6 and clear it */

 69   while(!I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))

 70     {

 71     if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback();

 72    }

 73   

 74   /* While there is data to be read */

 75   while(NumByteToRead)  

 76   {

 77     if(NumByteToRead == 1)

 78     {

 79       /* Disable Acknowledgement */

 80       I2C_AcknowledgeConfig(macI2Cx, DISABLE);

 81       

 82       /* Send STOP Condition */

 83       I2C_GenerateSTOP(macI2Cx, ENABLE);

 84     }

 85 

 86     /* Test on EV7 and clear it */

 87     if(I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED))  

 88     {      

 89       /* Read a byte from the slave */

 90       *pBuffer = I2C_ReceiveData(macI2Cx);

 91 

 92       /* Point to the next location where the byte read will be saved */

 93       pBuffer++; 

 94       

 95       /* Decrement the read bytes counter */

 96       NumByteToRead--;        

 97     }   

 98   }

 99 

100   /* Enable Acknowledgement to be ready for another reception */

101   I2C_AcknowledgeConfig(macI2Cx, ENABLE);

102     

103     return 1; //正常,返回1

104 }


关键字:STM32  硬件IIC  指针 引用地址:STM32硬件IIC

上一篇:keil中for循环变量递减,无法跳出循环的问题
下一篇:STM32的IO口灌入电流和输出驱动电流最大是多少?

推荐阅读最新更新时间:2024-11-07 18:07

STM32 上电后的启动过程
微控制器(单片机)上电后,是如何寻找到并执行main函数的呢?很显然微控制器无法从硬件上定位main函数的入口地址,因为使用C语言作为开发语言后,变量/函数的地址便由编译器在编译时自行分配,这样一来main函数的入口地址在微控制器的内部存储空间中不再是绝对不变的。相信读者都可以回答这个问题,答案也许大同小异,但肯定都有个关键词,叫“启动文件”,用英文单词来描述是“Bootloader”。 无论性能高下,结构简繁,价格贵贱,每一种微控制器(处理器)都必须有启动文件,启动文件的作用便是负责执行微控制器从“复位”到“开始执行main函数”中间这段时间(称为启动过程)所必须进行的工作。最为常见的51,AVR或MSP430等微控制器当然
[单片机]
STM32的中断系统
STM32具有十分强大的中断系统,将中断分为了两个类型:内核异常和外部中断。并将所有中断通过一个表编排起来,下面是stm32中断向量表的部分内容: 上图-3到6这个区域被标黑了,这个区域就是内核异常。内核异常不能够被打断,不能被设置优先级(也就是说优先级是凌驾于外部中断之上的)。常见的内核异常有以下几种:复位(reset),不可屏蔽中断(NMI),硬错误(Hardfault),其他的也可以在表上找到。 从第7个开始,后面所有的中断都是外部中断。外部中断是我们必须学习掌握的知识,包含线中断,定时器中断,IIC,SPI等所有的外设中断,可配置优先级。外部中断的优先级分为两种:抢占优先级和响应优先级。 什么是抢占优先级?
[单片机]
<font color='red'>STM32</font>的中断系统
STM32的DMA控制器
  DMA(直接存储器存取)用来提供在外设和存储器之间或者存储器与存储器之间的高速数据传输。无须CPU干预,这就可以节省CPU的资源来做其它操作。   两个DMA控制器有12个通道(DMA1有7通道,DMA2有5通道),还有一个仲裁器协调各个DMA请求的估先权。   有关DMA控制器的特性、框图、寄存器地址及含义等参考STN32资料手册,在此就不多说了,只讲述具体的设置应用。   结构体(DMA_InitTypeDef)说明:   PeripheralBaseAddr:外设地址 CPAR   MemoryBaseAddr: 存储器地址 CMAR   DIR:        传输方向(从外设读/从存储器读)   Buffe
[单片机]
STM32的FSMC仿真可运行
调试了几天STM32的FSMC驱动液晶的程序,原先在MDK上编译下载后可以运行的程序,移植到IAR上后就出现了问题,(以下描述的是在从新上电复位后运行的现象,但在jlink调试过程中运行都是正常的) 问题是这样的:程序运行完 *(__IO uint16_t *) (Bank1_LCD_C)= index; 后就不在往下运行了,反复实验了N次,只有一次进入了Hardfault, 而剩下的情况都是mcu不运行了。查了很多资料终于在一片《STM32F103 FSMC 同步模式 学习笔记2》文章中找到了答案,原因是在FSMC初始化过程中出现的,我们初学者编程序都有以个缺点,就是定义申请的变量后都不进行变量初始化操作(特别是定义了一些较为复
[单片机]
STM32STM32时钟系统和SystemInit函数解读
时钟系统就是CPU的脉搏,像人的心跳一样,重要性不言而喻。由于STM32本身十分复杂,外设非常多,但并不是所有的外设都需要系统时钟那么高的频率,比如看门狗以及RTC只需要几十k的时钟即可。并且,同一个电路,时钟越快功耗越快,同时抗电磁干扰能力也就越弱,所以较为复杂的MCU都是采用多时钟源的方法来解决这些问题。 STM32F1xx官方资料: 《STM32中文参考手册V10》-第六章 复位和时钟控制 RCC STM32的时钟系统 STM32的时钟系统图 上图是STM32的时钟系统图。STM32 有5个时钟源:HSI、HSE、LSI、LSE、PLL,在图中有红色方框标记的位置。从时钟频率来分可以分成高速时钟源和低速时钟
[单片机]
【<font color='red'>STM32</font>】<font color='red'>STM32</font>时钟系统和SystemInit函数解读
STM32关于USB的相关寄存器
这里要贴上STM32 USB相关的寄存器的具体设置,对学习STM32的USB很有帮助。对于涉及到寄存部分的代码,参考这些寄存器的说明,就可以差不多都懂了。由于网页贴不上表格,所以就截屏成图片贴上来,如果看不清楚,就下载图片去看 1.编程好习惯之变量定义: 定义变量时总是按变量类型所占空间大小来排序是最好的! 如果是只有某个函数使用些变量,而且你又需要在函数让函数退出时不被销毁,那么就使用static吧 2.编程好习惯之函数定义: 如果我们定义的C函数仅在此C文件中被调用那么加上static吧(适用于多文件编程) 如果我们想躲避C函数参数的类型检查,那 么K&R的函数定义声明方式还
[单片机]
<font color='red'>STM32</font>关于USB的相关寄存器
基于STM32之OLED菜单界面框架搭建
随着科技的不断发展,嵌入式系统在各个领域中得到了广泛的应用。而STM32是一款在嵌入式系统中应用较为广泛的芯片。它的主频高、功耗低、性能稳定,以及强大的外设功能都使得它成为了许多开发者的首选。本文将介绍如何基于STM32搭建一个OLED菜单界面框架。 首先,我们需要准备以下材料: 1. STM32F103C8T6主控制板 2. 0.96寸OLED显示屏模块 3. dupont线若干 接下来就可以开始搭建了。 步骤1:连接硬件 先将OLED模块通过dupont线连接至STM32主控制板。具体连接方式可以参考如下: OLED模块 | STM32主控制板 VCC | 3.3V GND | GND SCL | B6
[单片机]
英蓓特积极推动ARM Cortex-M3高校普及计划
全球领先的嵌入式软硬件供应商深圳市英蓓特信息技术有限公司日前宣布, 时至英蓓特大学计划实施5周年之庆,为积极推动国内cortex-M3 技术的普及, 特举办” ARM Cortex-M3高校普及计划” 活动,积极促进中国嵌入式教育行业发展及嵌入式人才培养! Cortex-M3是ARM公司推出的最新的针对微控制器应用的内核,提供业界领先的高性能和低成本的解决方案,将成为MCU应用的热点和主流。英蓓特此次举办的” ARM Cortex-M3高校普及计划” 旨在全国各区范围内严格甄选20所较具实力的院校作为赠送对象,每所院校赠送10套Cortex-M3教学实验平台,无偿帮助受赠高校成立嵌入式联合实验室,同时也会提供专业的师
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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