STM32硬件IIC

发布者:EtherealGlow最新更新时间:2016-12-16 来源: 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

上一篇:stm32中的数据类型定义
下一篇:stm32时钟设置函数

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

用qt编写上位机与stm32通信
好的文章 1、Qt5.5.1实现通用串口程序https://www.2cto.com/kf/201607/524028.html 2、QT实现串口通信 https://www.2cto.com/kf/201610/558768.html 资源下载:https://download.csdn.net/download/hellybobo/9950904?web=web 本文采用的的开发环境是VS2010+Qt5.5.1版本,所有程序不是通过Qt Creator编译的,如果有需要可以介绍VS2010和Qt环境的搭建和简单的使用。 QSerialPort QSerialPort这个类是从QT5.1开始引入的,之前都是通过
[单片机]
用qt编写上位机与<font color='red'>stm32</font>通信
STM32(Cortex-M3) 中NVIC(嵌套向量中断控制)的理解
一、STM32 (Cortex-M3) 中的优先级概念 STM32(Cortex-M3)中有两个优先级的概念:抢占式优先级和响应优先级,也把响应优先级称作 亚优先级 或 副优先级 ,每个中断源都需要被指定这两种优先级。 1. 何为占先式优先级(pre-emption priority) 高占先式优先级的中断事件会打断当前的主程序/中断程序运行 抢断式优先响应,俗称中断嵌套。 2. 何为副优先级(subpriority) 在占先式优先级相同的情况下,高副优先级的中断优先被响应; 在占先式优先级相同的情况下,如果有低副优先级中断正在执行, 高副优先级的中断要等待已被响应的低副优先级中断执行结束后才能得到响应 非抢断式
[单片机]
STM32DAC讲解及代码示例
DAC转换 STM32的DAC模块主要特点有: ① 2个DAC转换器:每个转换器对应1个输出通道 ② 8位或者12位单调输出 ③ 12位模式下数据左对齐或者右对齐 ④ 同步更新功能 ⑤ 噪声波形生成 ⑥ 三角波形生成 ⑦ 双DAC通道同时或者分别转换 ⑧ 每个通道都有DMA功能 DAC_OUT1 - PA4 DAC_OUT2 - PA5 DAC配置步骤 程序代码示例: //DAC通道1输出初始化 void Dac1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; DAC_InitTypeDef DAC_InitType; RCC_APB2PeriphClockCm
[单片机]
STM32DAC讲解及代码示例
STM32实例-待机唤醒实验
本文我们来学习下STM32的待机唤醒功能。要实现的功能是:系统运行时 D1 指示灯闪烁,5 秒后进入待机模式,D1 指示灯熄灭,同时串口 printf输出相关提示信息,可通过 K_UP 按键实现唤醒。学习本内容可以参考《STM32F10x中文参考手册》-4 电源控制器(PWR)章节。 STM32 低功耗模式介绍 很多单片机具有低功耗模式,比如 MSP430、STM8L等。我们的STM32也不例外。默认情况下,系统复位或上电复位后,微控制器进入运行模式。在运行模式下,HCLK 为 CPU 提供时钟,并执行程序代码。当 CPU 不需继续运行(例如等待外部事件)时,可以利用多种低功耗模式来节省功耗。用户需要根据最低电源消耗、最快速启
[单片机]
<font color='red'>STM32</font>实例-待机唤醒实验
不用库函数自己动手配置STM32中的DMA
今天调试的STM32的DMA部分,第一次接触这部分,8位的单片机没有这部分的功能,一开始感觉这东西很神秘,所以怀着敬畏的心情来学习它。慢慢的发现这确实是个好东西,功能强大,可以分担CPU的任务。但它没有想象中那么棘手。 DMA英文全称是Direct Memory Access,意思是直接存储器访问。他的作用就是不需要经过CUP进行数据传输,也就是替CPU分担点事情做,什么事情?数据传输方面的事情。也就是说,你只要使能并配置好了DMA,DMA就可以将一批数据从源地址搬运到目的地址去而不经过CPU的干预,这样可以为CPU节省好多精力去干更重要的事情很人性化。就像我们人一样,我们平常习惯性的动作是不用经过大脑思考的,比如说眨眼睛,呼吸等。
[单片机]
STM32之三标准外设版USB驱动库详解(架构+文件+函数+使用说明
写在前面 目前,ST的USB驱动有两套,一套是早期的独立版USB驱动,官方培训文档中称为Legacy library;一套为针对其Cube 系列的驱动,根据芯片不同可能有区别,具体见对应芯片的Cube驱动包,官方培训文档中称为Cube library。 本文使用的为Legacy library USB 驱动。更详细的各驱动库版本,请参考博文STM32 之 USB IP(USB模块) 详解。 本文多出自于ST的官方文档 及 2016~2017的培训文档,读者也可以直接去ST官网查阅相关文档。 稍有涉及USB 2.0 规范的内容,关于USB规范去官网或自行Google。也可以参考: USB之USB2.0 规范详解 第一部分 USB之U
[单片机]
<font color='red'>STM32</font>之三标准外设版USB驱动库详解(架构+文件+函数+使用说明
STM32中关于GPIO口的介绍
一、什么是GPIO? GPIO的英文全称是General-Purpose IO ports,也就是通用输入输出口。 在嵌入式系统中,经常需要控制许多结构简单的外部设备或者电路,这些设备有的需要通过CPU控制,有的需要CPU提供输入信号。并且,许多设备或电路只要求有开/关两种状体就够了,比如LED的亮与灭。对这些设备的控制,使用传统的串口或者并口就显得比较复杂,所以,在嵌入式微处理器上通常提供了一种“通用可编程I/O端口”,也就是GPIO。 一个GPIO端口至少需要两个寄存器,一个做控制用的“通用IO端口控制寄存器”,还有一个是存放数据的“通用I/O端口数据寄存器”。数据寄存器的每一位是和GPIO的硬件引脚对应的,而数据的传递方向是
[单片机]
<font color='red'>STM32</font>中关于GPIO口的介绍
STM32开发中的位带操作机制
为了像51单片机一样能够对某个管脚单独操作,引入了位带操作这样的操作机制。 如下图,位带(Bit band)区就是就是你想单独操作的IO的区域,比如PA1、PA2。而位带别名区就是你给每一位重新起了个名字的那一片地址区域。可以看下表,M3内核存储器映射表,你能看到1M内存的BitBand区,还有与之对应的32M内存的BitBand别名区,因为你将每一位膨胀成为了一个32位的地址,所以相应的别名区的内存也会是位带区的32倍。 想进行位带操作,应该先去找该位对应的别名区的地址,找到了这个地址,对这个地址进行操作,那么实际上也就是对该位进行操作了。 官方给出了如下相应的计算公式: AliasAddr=0x42000000+((A‐0
[单片机]
<font color='red'>STM32</font>开发中的位带操作机制
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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