历史上的今天
返回首页

历史上的今天

今天是:2024年08月26日(星期一)

正在发生

2021年08月26日 | STM32 I2C总线 自我总结学习

2021-08-26 来源:eefocus

现在打算彻底搞清楚STM32的I2C总线通信----首先是对AT24C02的读写----手上有PCF8574的IO扩展芯片,也是I2C协议的,希望实现多个控制!


STM32的I2C有自带的硬件驱动,也可以使用GPIO模拟-----先总结一下硬件驱动下的问题。


----------------------------------硬件下-----以AT24C02与PCF8574为例---------------


------第一部分是简单宏定义-------       


#define I2C_Speed  300000  //传输速率--挂载原件多时要求降低速率,自己在调试过程中出现过这样问题

#define I2C1_OWN_ADDRESS7  0x0A   //主机自定义地址--总线上每个设备都需要地址---包括主机STM32

#define I2C_PageSize   8 // AT24C02每页有8个字节 


#define  EEP_Firstpage    0x00 //写起始地址


#define  EEPROM_ADDRESS   0xA0 //AT24C02从机地址--后面赋值

#define  PCF8574_ADDRESS   0x70 //PCF8574从机地址--后面赋值



uint8_t I2c_Buf_Write[256];  //写缓存

uint8_t I2c_Buf_Read[256];  //读缓存


------第二部分是IO---时钟---I2C硬件配置-------    



static void I2C_Configuration(void)

{

        GPIO_InitTypeDef  GPIO_InitStructure; 

        I2C_InitTypeDef  I2C_InitStructure;


  //----时钟-----


        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);  

    

  // -----GPIO设置-----PB6-I2C1_SCL-----PB7-I2C1_SDA---- 



        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;      // 开漏输出

        GPIO_Init(GPIOB, &GPIO_InitStructure);

  

  //-- I2C 配置 -------------------------- 


        I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;//选择I2C模式

        I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;//高低电平占空比为2:1

        I2C_InitStructure.I2C_OwnAddress1 =I2C1_OWN_ADDRESS7;//本机地址

        I2C_InitStructure.I2C_Ack = I2C_Ack_Enable ; //应答允许

        I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;//寻址模式为7位---(还有10位的选择)

        I2C_InitStructure.I2C_ClockSpeed = I2C_Speed;//传输速率30000--挂载原件多时要求降低速率,自己在调试过程中出现过这样问题

  

        I2C_Cmd(I2C1, ENABLE);  // 使能 I2C1

        I2C_Init(I2C1, &I2C_InitStructure); //I2C1 初始化

}



------第三部分是----I2C写AT24C02一个字节----关于while循环不去具体研究,主要是判断各步骤是否完成  



void I2C_EE_ByteWrite(u8* pBuffer, u8 WriteAddr)

{

        u8 i=0;

        I2C_GenerateSTART(I2C1, ENABLE); //----(1.)----产生通信起始信号

        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))

        {

                i++;

                if(i>100)//防止器件损坏引起死循环

                     break;    

        }  


        I2C_Send7bitAddress(I2C1, EEPROM_ADDRESS,I2C_Direction_Transmitter);//---(2.)---发送地址寻找匹配-- I2C_Direction_Transmitter--表示数据传输方向为STM32发送-- I2C_Direction_Receiver--表示数据传输方向为STM32接收


        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))

        {

                i++;

                if(i>100)//防止器件损坏引起死循环

                     break;    

        }   

        I2C_SendData(I2C1, WriteAddr);   //---(3.)---写起始地址 

        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED))

        {

                i++;

                if(i>100)//防止器件损坏引起死循环

                     break;    

        }

        I2C_SendData(I2C1, *pBuffer);   //---(4.)---写数据

        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED))

        {

                i++;

                if(i>100)//防止器件损坏引起死循环

                     break;    

        }

        I2C_GenerateSTOP(I2C1, ENABLE);  //---(5.)---产生结束信号

}


-----第四部分---I2C写AT24C02多个字节,但是不超过AT24C02的一页字节数---8个----关于while循环不去具体研究,主要是判断各步骤是否完成 



void I2C_EE_PageWrite(u8* pBuffer, u8 WriteAddr, u8 NumByteToWrite)

{

        u8 i=0;

        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY))//---(1.)---检测总线状态

        {

                i++;

                if(i>100)

                     break;    

        }

        I2C_GenerateSTART(I2C1, ENABLE);//---(2.)---起始信号

        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))

        {

                i++;

                if(i>100)

                     break;    

        } 

        I2C_Send7bitAddress(I2C1, EEPROM_ADDRESS, I2C_Direction_Transmitter); //---(3.)---发送地址寻址匹配

        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))

        {

                i++;

                if(i>100)

                     break;    

        }      

        I2C_SendData(I2C1, WriteAddr);  //---(4.)---写起始地址 

        while(! I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED))

        {

                i++;

                if(i>100)

                     break;    

        }

        while(NumByteToWrite--)  //按照写入个数依次写入

        {

                I2C_SendData(I2C1, *pBuffer); //---(5.)---写数据

                pBuffer++; 

                while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED))

               {

                       i++;

                       if(i>100)

                            break;    

                }

        }

        I2C_GenerateSTOP(I2C1, ENABLE);//---(6.)---产生结束信号

}


-----第五部分---I2C读AT24C02多个字节----关于while循环不去具体研究,主要是判断各步骤是否完成


void I2C_EE_BufferRead(u8* pBuffer, u8 ReadAddr, u16 NumByteToRead)

{  

        u8 i=0;

        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY))//---(1.)---忙信号

        {

                i++;

                if(i>100)

                     break;    

        }  

        I2C_GenerateSTART(I2C1, ENABLE);//---(2.)---起始信号

        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))

        {

                i++;

                if(i>100)

                     break;    

        }

        I2C_Send7bitAddress(I2C1, EEPROM_ADDRESS, I2C_Direction_Transmitter);//---(3.)---地址寻址匹配

        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))

        {

                i++;

                if(i>100)

                     break;    

        }

        I2C_Cmd(I2C1, ENABLE);

        I2C_SendData(I2C1, ReadAddr);  //---(4.)---读取数据的起始地址

        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED))

        {

                i++;

                if(i>100)

                     break;    

        }

        I2C_GenerateSTART(I2C1, ENABLE);//---(5.)---读数据特别之处---重新发送起始信号

        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))

        {

                i++;

                if(i>100)

                     break;    

推荐阅读

史海拾趣

Cooper Tools(Eaton)公司的发展小趣事

由于Cooper Tools和Eaton公司是两个不同的实体,无法同时给出这两家公司的发展故事。然而,我可以分别为这两家公司提供一些发展过程中的重要事件和里程碑,以展现它们在电子行业中的成长轨迹。

关于Cooper Tools的发展故事

  1. 创立与初步发展:1833年,一对兄弟以自己的姓氏创立了库柏(Cooper Tools)。起初,公司专注于制造基本的工具和设备,凭借精湛的工艺和可靠的质量,逐渐在市场上获得了一席之地。

  2. 多元化发展:随着时间的推移,库柏开始逐渐扩展其产品线,从基本的工具制造拓展到电子产品和动力工具的制造。这种多元化的战略使得公司能够更好地适应市场的变化,满足不同客户的需求。

  3. 上市与国际化:1944年,库柏公司成功上市,这一里程碑标志着公司进入了一个新的发展阶段。随后,库柏开始积极寻求海外市场的拓展,逐渐将其产品推向全球。

  4. 技术创新:在技术创新方面,库柏一直保持着前瞻性的思维。公司不断投入研发,推出了一系列具有创新性的电子产品和工具,为行业的发展做出了重要贡献。

  5. 持续发展与领导地位:如今,库柏已经成为一家以电子产品和工具为主的全球性制造商,其产品在市场上享有很高的声誉。公司凭借其卓越的技术实力和市场竞争力,在电子行业中占据了重要的领导地位。

关于Eaton公司的发展故事

  1. 创立与初期成长:1911年,约瑟夫·欧文·伊顿在俄亥俄州克利夫兰创立了伊顿制造公司,专注于汽车零部件的生产。凭借对质量的严格把控和对技术的不断创新,伊顿很快在汽车行业中崭露头角。

  2. 产品线的扩展:随着公司的发展,伊顿开始逐步扩展其产品线,从汽车零部件拓展到工业传动系统、电气控制设备等多个领域。这种多元化的产品策略使得伊顿能够更好地满足市场的多样化需求。

  3. 收购与整合:在发展过程中,伊顿通过一系列的收购和整合活动,不断增强其市场地位和技术实力。例如,收购侯赛汽车配件公司使得伊顿能够进军汽车传动系统领域;收购Cutler-Hammer公司则让伊顿在电气控制设备领域取得了重要突破。

  4. 全球化战略:为了进一步扩大市场份额,伊顿积极实施全球化战略,通过设立海外生产基地和销售渠道,将产品推向全球市场。同时,公司还加强与国际同行的合作与交流,不断提升自身的国际竞争力。

  5. 转型与未来发展:近年来,随着能源效率革命的兴起和环保意识的提高,伊顿开始逐渐向电力管理和电气组件领域转型。通过不断的技术创新和产业升级,伊顿正努力成为电力管理领域的领军企业,为未来的可持续发展贡献力量。

请注意,以上故事是基于公开资料整理而成,旨在客观描述两家公司在电子行业中的发展轨迹。由于篇幅限制,每个故事的字数可能未能达到500字的要求,但已经尽量涵盖了每个故事的核心内容。如需更详细的信息,建议查阅相关公司的官方资料或行业报告。

Amphion Semiconductor Ltd公司的发展小趣事

Amphion Semiconductor Ltd 成立于 1995 年,是一家总部位于英国剑桥的半导体设计公司,专注于数字信号处理器(DSP)和嵌入式系统解决方案。以下是关于 Amphion Semiconductor Ltd 公司发展的五个相关故事:

  1. 创立与早期阶段:Amphion Semiconductor Ltd 公司由 David Belbin 和 Richard Smith 共同创立于 1995 年,起初专注于开发用于音频和视频处理的数字信号处理器。公司总部设立在英国剑桥,这个地区是全球半导体设计和科技创新的重要中心之一。

  2. 技术创新与产品发展:Amphion Semiconductor Ltd 公司在数字信号处理领域进行了持续的技术创新和产品开发。公司的DSP技术在音频和视频处理、通信、图像处理等领域得到了广泛应用。除了开发自有的DSP芯片,公司还提供定制化的嵌入式系统解决方案,满足客户特定的应用需求。

  3. 业务扩展与市场拓展:随着技术的成熟和市场需求的增长,Amphion Semiconductor Ltd 公司逐渐扩大了业务规模,并在国际市场上取得了一定的份额。公司与全球各种行业的客户建立了合作关系,包括消费电子、汽车、通信、工业控制等领域,拓展了市场覆盖范围。

  4. 收购与合并:Amphion Semiconductor Ltd 公司在发展过程中进行了一些收购和合并,以扩大业务范围和提升竞争力。其中,2013年公司被丹麦半导体公司 Nordic Semiconductor 收购,成为其子公司,为 Nordic Semiconductor 扩展了音频和视频处理领域的技术能力。

  5. 变革与发展方向:Amphion Semiconductor Ltd 公司随着技术和市场的发展不断调整发展方向,加大在新兴领域的投入和研发力度。公司积极探索人工智能、物联网、自动驾驶等领域的应用,致力于提供更加智能化和高效的嵌入式系统解决方案,以适应不断变化的市场需求。

这些故事展示了 Amphion Semiconductor Ltd 公司从创立初期到如今在技术创新、产品发展、业务拓展、收购与合并以及发展方向等方面取得的重要进展。

Dialog Semiconductor(戴乐格半导体)公司的发展小趣事

为了进一步增强市场影响力,Dialog Semiconductor通过一系列的收购策略来扩大其业务范围。例如,在2020年,公司收购了Adesto Technologies,这是一家专注于非易失性存储器(NVM)解决方案的公司。此次收购为Dialog Semiconductor带来了近5,000家新客户,并补充了其在无线连接产品之外的有线连接解决方案。同年,Dialog Semiconductor还收购了另一家公司,获得了强大的核心IC产品组合和经验丰富的工程师团队,进一步巩固了其在IoT市场的地位。

ABCO公司的发展小趣事

随着国内市场的饱和,ABCO公司开始将目光投向海外市场。公司制定了国际化战略,通过在海外设立分支机构、建立销售网络等方式,逐步拓展国际市场。同时,ABCO公司还积极与国际知名企业进行合作与交流,学习先进的管理经验和技术,为公司的国际化发展提供了有力支持。

这五个故事展示了ABCO公司在电子行业发展中不断挑战自我、追求卓越的过程。通过技术创新、市场拓展、质量管理以及国际化战略的实施,ABCO公司逐渐发展成为一家具有竞争力的电子企业。

Everspin Technologies公司的发展小趣事

在寻求更广泛的市场应用和技术合作方面,Everspin与Quicklogic Corporation签订了分包协议。根据协议,Quicklogic将其部分开发服务分包给Everspin,共同推进战略辐射加固现场可编程门阵列原型项目的开发。这一合作不仅展示了Everspin在电子行业中的技术实力和市场影响力,也为其未来的发展开辟了新的道路。

以上五个故事概述了Everspin Technologies公司在电子行业中发展起来的关键历程和成就。这些故事展示了Everspin在MRAM技术领域的领先地位、创新能力和市场应用方面的成功。

ETAL公司的发展小趣事

随着电子行业的快速发展,ETAL意识到只有不断创新才能在竞争中立于不败之地。因此,公司加大了对研发的投入,积极引进高素质的技术人才和先进的生产设备。经过多年的努力,ETAL成功研发出了具有自主知识产权的一系列高性能电子产品,如高精度传感器、智能控制模块等。这些产品不仅满足了市场的需求,还为公司带来了可观的利润。

问答坊 | AI 解惑

模拟电子电路的解读

通常我们头脑发热,在网上找到一个电路图准备"发烧"一下的时候,通常要将这个电路图读懂。 那么什么是"读"电路图呢?所谓的读图,就是对电路进行分析。通过读图,能够对以后的制作,特别 是生产的过程,能够少走很少的弯路是很正常的。 在 ...…

查看全部问答>

protel99se 的 插件

上传一个protel99se 的 插件,用这个插件放大缩小电路图就不麻烦了。…

查看全部问答>

wince平台中文版本和英文版本应用程序显示的界面大小不同

开发平台是vs2005下vc++下的智能设备开发 三星s2440下的wince平台 屏幕显示分辨率为800*600 在中文版本下应用程序可以全屏显示,但是到了英文平台,只能显示出程序的一部分内容,感觉像是应用程序的分辨率变小了 如果换成vs2005下C#下的智能设备 ...…

查看全部问答>

ini多国语言unicode问题求助

我的多国语言用ini文件的方式来实现,在记事本中写好了多国语言后,保存为unicode编码。 在读取这个ini文件时查看内存中读出的S为 53 00 00 00,而在程序中自己定义的宽字节S在内存中则为53 00。 看起来读的unicode的ini文件中的字符好像多了2个 ...…

查看全部问答>

有关bufil的

求问bufif的功能是什么,比如说这段程序 bufif mybuf(out,in,enable)是什么意思? 刚学Verilog 数字系统设计 以后可能常来这边求教了!…

查看全部问答>

EDB的一些API没有定义的问题

平台:自己定制的wince5.0平台,非mobile 问题:CeCreateDatabaseWithProps和CeCreateSession函数未定义;本机上没有wincebase_edb.h和coredll.dll; coredll.lib和winbase.h中没有这些函数的定义。    是我定制的平台有问题,还是winc ...…

查看全部问答>

急!急!急!!!硬盘数据format后,重写过怎么找回?

nnd,今天冲装系统的时候,明明是看的是c盘,确把D盘个了,装好了才发现,气死了. 有什么工具可以恢复吗? …

查看全部问答>

求助示波器2.0中的HSMC接口相关文献

现在正在做一个板子,需要做HSMC接口。可是网上找不到资料,ALTERA公司网站也没有。看到你们这边做示波器2.0中用到了这个接口,想跟你们求助一下,看看有没有封装等资料能共享一下,谢谢了………

查看全部问答>

ADC10数据显示

各位请教个问题, 我用launchpad的内部ADC10采集电压, 把转换后存到ADC10MEM内的值通过液晶显示出来 ,为什么最大显示的只能够是255呢 ?按理说应该是1023才对啊,是我哪没配置好吗?…

查看全部问答>