历史上的今天
返回首页

历史上的今天

今天是:2024年09月21日(星期六)

2020年09月21日 | STM32硬件IIC

2020-09-21 来源:eefocus

 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 }


推荐阅读

史海拾趣

Dau Semiconductor Inc公司的发展小趣事

Dau Semiconductor Inc公司成立于XXXX年,由几位在半导体行业拥有多年经验的工程师创立。当时,他们意识到在快速发展的电子行业中,高性能、低功耗的半导体芯片有着巨大的市场需求。于是,他们决定依托自己在半导体设计和制造方面的技术积累,创办Dau Semiconductor Inc公司,专注于研发和生产高性能的半导体芯片。

芯邦(Chipsbank)公司的发展小趣事

近年来,芯邦科技的营收规模逐渐增大,从2020年到2022年,公司的营业收入分别达到了0.99亿元、1.75亿元和1.92亿元。尽管增速呈现下降趋势,但芯邦科技在电子行业中依然保持着稳健的市场表现。同时,公司也注重研发投入,不断提升产品的技术水平和市场适应性。

台湾晶豪(ESMT)公司的发展小趣事

在成功建立DRAM产品线后,晶豪科技又进一步进军闪存市场。公司成功完成了多种容量及接口类型的NOR Flash及NAND Flash的开发,满足了各种特定应用系统的需求。特别是NOR Flash产品,以其更快的速度、更高的安全性、低功耗高存储密度和不断降低的成本等优质特性,在市场上取得了显著成果。

Ferroperm公司的发展小趣事

Ferroperm公司非常重视产品的品质管理。他们建立了严格的质量管理体系,从原材料采购到产品生产、检测等各个环节都实行严格的质量控制。同时,Ferroperm还注重持续改进,不断引进先进的生产设备和检测技术,提高产品的质量和性能。这种对品质的执着追求使得Ferroperm的产品在市场上获得了良好的口碑和信誉。

长江连接器(CJT)公司的发展小趣事

为了进一步拓展市场和提升竞争力,长江连接器开始实施全球化战略。公司积极在海外设立生产基地和研发中心,加强与国际知名企业的合作和交流。通过引进国际先进的生产技术和管理经验,长江连接器不断提升自身的生产能力和管理水平。同时,公司还积极参与国际竞争和合作,与全球各地的客户建立了长期稳定的合作关系。

Elite Semiconductor Products Inc公司的发展小趣事

Elite Semiconductor Products Inc(以下简称Elite)自创立之初,就坚持以技术创新为核心竞争力。公司创始人是一位经验丰富的半导体工程师,他深知在电子行业,技术的领先意味着市场的领先。因此,Elite投入大量资源进行研发,不断推出具有领先性能的半导体产品。其中,一款高性能的芯片产品因其卓越的功耗控制和计算能力,在行业内引起了广泛关注。这款产品不仅帮助Elite打开了市场,也为公司后续的技术创新奠定了坚实的基础。

问答坊 | AI 解惑

嵌入式

嵌入式系统的好资料…

查看全部问答>

三角波参数测试仪——09年四川

本帖最后由 paulhyde 于 2014-9-15 04:14 编辑 [local]2[/local]“TI”杯时我们三人的作品。 三角波参数测试仪。  …

查看全部问答>

【藏书阁】电路分析 (面向21世纪课程教材)

目录: 第一章 线性电路的复数解法 1.1 电源与元件的概念 1.2 常参量线性电路的复数解法 1.3 一阶RC滤波器 1.4 二级LC滤波器 思考题 习题 第二章 线性电路的s域解法 2.1 拉普拉斯变换 2.2 线性电路的s域解法 2.3 卷积 附录2 拉氏变换 ...…

查看全部问答>

关于可视对讲,一直疑惑的问题

做了这么多年的门禁和可视对讲,做过了好多的产品,现在市场上的产品真的是五花八门, 国内到底谁家, 才是工程商的不二选择......…

查看全部问答>

cycloneIII_3c25的原装开发板到手了-发资料

整快板子上的外设不是很多,但是存储器资源丰富。并预留了一个HSMC接口,可以用来扩展。有三张光盘,一张是介绍开发板的使用,例程,入门指导,另两张是Quartus2的软件,常用库,NIOS2开发资料。先简单介绍到这里,把开发板的资料传上来共享(全部 ...…

查看全部问答>

DSP2407在转速测定中的应用

DSP2407在转速测定中的应用…

查看全部问答>

通过MR16谈谈自己对LED行业的想法--antsin

本人一直在一家电源IC原厂华东区做FAE,07年公司从linear挖了一个团队进入LED驱动行业,我随之也开始进入这个行业。在勤勤勉勉的耕耘3年中,我从学习到与客户分享我的学习经验,很多客户都会跟我讲,王工,从你身上我学到了很多。但这时我告诫自己 ...…

查看全部问答>

如何设置vxworks(主机)的IP地址,和网关?如果设置成功,我能否在windows下 用ping 命令对运行中的vxworks进行网络连接??能ping通吗

如何设置vxworks(主机)的IP地址,和网关????????? 如果设置成功,我能否在windows下 用ping 命令对运行中的vxworks进行网络连接??能ping通吗?? …

查看全部问答>

【MSP430共享】MSP430 电容单触式传感器设计指南

MSP430 电容单触式传感器设计指南,这是官网应用手册,很权威的。 [ 本帖最后由 鑫海宝贝 于 2011-10-12 09:35 编辑 ]…

查看全部问答>

LCD液晶显示

LCD1604驱动模块 /*备注一:LCD1604只含有ASCII码表内字符的字库,无汉字字库,不能自行打点,不便画曲线*/ /*本模板功能一:在任意位置显示阿拉伯数字 */ /*本模板功能二:在任意位置显示字符及字符串 */ #include #include \"lcd1604.h\" /* ...…

查看全部问答>