历史上的今天
返回首页

历史上的今天

今天是:2025年04月25日(星期五)

正在发生

2020年04月25日 | Stm32 iic初始化介绍

2020-04-25 来源:eefocus

1.iic介绍:


iic (Inter_Integrated Circuit)集成电路总线,是一种二线制的同步串行总线,一共有着SCL(时钟线)和SDA(数据线)


2.配置步骤:


<1>:iic的初始化


按照对GPIO口的设置来配置iic相关的端口(这里以Stm32F103rc为例)


注:可以使用定义的方法先定义相应端口


//IO方向设置

#define SDA_IN()  {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=8<<12;}//1000 上拉输入

#define SDA_OUT() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=3<<12;}//0011 推挽输出(50MHZ)

//IO操作函数  

#define IIC_SCL    PCout(12) //SCL

#define IIC_SDA    PCout(11) //SDA  

#define READ_SDA   PCin(11)  //输入SDA 


void IIC_Init(void)

{      

GPIO_InitTypeDef GPIO_InitStructure;

//RCC->APB2ENR|=1<<4;//先使能外设IO PORTC时钟 

RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE ); //使能GPIOC时钟

//IIC SCL(PC12)IIC SDA(PC11)   

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_11;//change the channel

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOC, &GPIO_InitStructure);

 

IIC_SCL=1;//初始化拉高SCL

IIC_SDA=1;//初始化拉高SDA

}

在初始化的时候,SDA和SCL都置为1,表示拉高闲置状态


<2>:产生起始信号

先将SDA和SCL置高,然后在SDA拉低时进行延时,然后将SCL拉低


void IIC_Start(void)

{

SDA_OUT();     //sda线输出 0011 

IIC_SDA=1;     

IIC_SCL=1;

delay_us(4);//保持SCL稳定

  IIC_SDA=0;// SDA开始从高向低跳变

delay_us(4);

IIC_SCL=0;//钳住I2C总线,准备发送或接收数据 

}   


<3>产生终止信号


先确定SCL SDA为拉低状态,然后在SCL拉高的期间实现SDA的拉高


void IIC_Stop(void)

{

SDA_OUT();//sda线输出

IIC_SCL=0;

IIC_SDA=0;//准备进行跳变

  delay_us(4);

IIC_SCL=1; 

delay_us(4);

IIC_SDA=1;//发送I2C总线结束信号

   

}


<4>:等待信号


设置等待时间 如果超过该时间则发送失败;


实现SCL=0 便于下一次数据的传输

//等待应答信号到来,将SCL SDA拉高 等待应答

//返回值:1,接收应答失败

//        0,接收应答成功

u8 IIC_Wait_Ack(void)//等待跳变值

{

u8 ucErrTime=0;

SDA_IN();      //SDA设置为输入  

IIC_SDA=1;delay_us(1);    

IIC_SCL=1;delay_us(1);  

//SCL SDA拉高 等待接收器返回应答信号

while(READ_SDA) 

{

ucErrTime++;

if(ucErrTime>250)//如果大于250,说明数据无效

{

IIC_Stop();//停止

return 1;//返回,超过相应的时间 接收失败

}

}

IIC_SCL=0;//钳位 方便下一次传输    

return 0;  


<5>:ACK应答(拉低SDA产生应答 主机反馈信号)(升高SDA则不产生应答 ))


void IIC_Ack(void)

{

IIC_SCL=0;

SDA_OUT();//主机接收应答信号,相当于反馈信号

IIC_SDA=0;

delay_us(2);

IIC_SCL=1;

delay_us(2);

IIC_SCL=0;

//保证SDA为低的时候产生应答

}

void IIC_NAck(void)

{

IIC_SCL=0;

SDA_OUT();

IIC_SDA=1;

delay_us(2);

IIC_SCL=1;

delay_us(2);

IIC_SCL=0;

//保证SDA为高的时候不产生应答

}


<6>发送字节(使用循环发送8字节,拉低SCL位实现字节的传输)

//IIC发送一个字节

//返回从机有无应答

//1,有应答

//0,无应答

//SCL在高电平的时候 无法改变SDA的数据 

//SCL为低电平的时候 可以改变SDA的数据   

void IIC_Send_Byte(u8 txd)

{                        

    u8 t;   

SDA_OUT();     

    IIC_SCL=0;//拉低时钟开始数据传输

    for(t=0;t<8;t++)

    {              

        IIC_SDA=(txd&0x80)>>7;//获取最高位 然后移七位到达最低位

        txd<<=1;   

delay_us(2);   //对TEA5767这三个延时都是必须的

IIC_SCL=1;

delay_us(2); 

IIC_SCL=0; //等待下一次数据发送

delay_us(2);

    }  

}     

<7>:读取字节,通过标志位主机是否应答(SCL=1开始读字节)


//读1个字节,ack=1时,发送ACK,ack=0,发送nACK   

u8 IIC_Read_Byte(unsigned char ack)

{

unsigned char i,receive=0;

SDA_IN();//SDA设置为输入

    for(i=0;i<8;i++ )

{

        IIC_SCL=0; 

        delay_us(2);

IIC_SCL=1;//SCL为高电平的时候开始读取信号

        receive<<=1;

        if(READ_SDA)receive++; //最低位+1;

delay_us(1); 

    }  

    if (!ack)

        IIC_NAck();//发送nACK

    else

        IIC_Ack(); //发送ACK   

    return receive;

}


时序图还是很重要的!!!

推荐阅读

史海拾趣

Fremont_Micro_Devices_USA公司的发展小趣事

Fremont Micro Devices USA公司的发展故事

故事一:初创与成长

Fremont Micro Devices USA(简称FMD或弗里蒙特微)的故事始于对高性能模拟及数模混合信号集成电路设计的执着追求。公司于多年前在加利福尼亚成立,起初是一家小型但充满活力的初创企业,专注于非易失性存储芯片、MCU芯片和电源管理芯片的研发。凭借其创始团队在半导体行业的深厚背景和技术专长,FMD迅速在消费电子、便携设备和通讯/网络领域崭露头角。通过持续的技术创新和产品研发,FMD逐渐积累了市场声誉,吸引了多家国际知名风险投资公司的关注和支持,为公司的快速发展奠定了坚实的基础。

故事二:技术突破与市场拓展

在FMD的发展历程中,技术突破是推动其不断前进的重要动力。公司研发团队拥有国内外顶尖半导体企业的工作经验,他们致力于全定制和半定制的数模混合芯片设计,不断提升产品的性能和可靠性。通过不断的技术积累和创新,FMD在Memory、MCU和PMIC等领域取得了显著的技术突破,拥有了业界领先的技术基础和IP积累。这些技术成果不仅提升了公司的市场竞争力,也为其在消费类、智能硬件、IOT和工控安防等应用领域的市场拓展提供了有力支持。

故事三:全球化布局与供应链管理

随着业务的不断扩张,FMD开始布局全球化市场。公司在美国本土建立了完善的研发和生产体系,同时在中国深圳设立了总部,并在香港设立了办事处,以便更好地服务亚太地区的客户。此外,FMD还积极与全球知名的电子元器件分销商合作,建立了稳定的供应链体系。通过优化供应链管理,FMD确保了产品的质量和交付速度,进一步提升了客户满意度和市场竞争力。

故事四:应对行业挑战与危机

在电子行业的发展过程中,FMD也面临着诸多挑战和危机。例如,全球半导体市场的周期性波动、国际贸易环境的变化以及新冠疫情的爆发等都对公司的运营和发展产生了一定的影响。然而,FMD凭借其强大的技术实力和市场敏锐度,积极应对这些挑战和危机。公司通过加强研发创新、优化产品结构、拓展新兴市场等方式,保持了业绩的稳定增长,并在逆境中实现了新的发展。

故事五:上市规划与未来发展

近年来,FMD在资本市场也取得了重要进展。公司已完成与中信证券的上市辅导协议签署,并在深圳证监局备案,拟在A股市场挂牌上市。这一举措不仅将为FMD带来更多的资金支持和发展动力,也将进一步提升公司的品牌影响力和市场竞争力。展望未来,FMD将继续秉承高性能、高可靠性和低成本的理念,加大在研发创新和市场拓展方面的投入力度,为客户提供更加优质的产品和服务,推动公司向更高层次的发展迈进。

Alcatel-Lucent公司的发展小趣事
  1. Alcatel-Lucent 的起源可以追溯到 19 世纪末的法国。1880 年,一家名为 Compagnie Générale d'Électricité (CGE) 的公司在法国成立,主要从事电信和电气设备的制造和销售。这家公司后来成为了 Alcatel-Lucent 的前身之一。

  2. 20 世纪初,CGE 开始涉足电信领域,并开始在法国和国际市场上发展。该公司逐渐成为了一家领先的电信设备制造商,并参与了许多重要的电信基础设施项目。

  3. 2006 年,法国的 Alcatel 和美国的 Lucent Technologies 公司宣布合并,成立了 Alcatel-Lucent 公司。这次合并创造了一个综合性的电信设备制造商,覆盖了通信网络、软件和服务等多个领域。

  4. 合并后,Alcatel-Lucent 成为了全球领先的电信设备供应商之一,为全球各地的电信运营商提供了广泛的产品和解决方案,包括固定和移动网络、光纤通信、宽带接入和数据中心等领域。

  5. 在成立后的几年里,Alcatel-Lucent 继续推出创新的产品和技术,包括下一代移动通信技术 LTE、IP/MPLS 网络和云计算解决方案等,为数字化时代的通信基础设施发展做出了重要贡献。

成都芯进(CrossChip)公司的发展小趣事

成都芯进电子一直致力于打破国外芯片市场的垄断地位,实现进口替代。他们在电流传感器领域取得了显著成果,产品已经全面进入工控、光伏、储能等领域,并获得了阳光电源、英威腾、欣旺达、安克等客户的认可。这一成就不仅展示了公司的技术实力和市场竞争力,也为国产芯片事业的发展做出了积极贡献。

Alorium Technology公司的发展小趣事

2023年6月,成都芯进电子宣布完成超1亿元A轮融资。这一轮融资的成功,不仅为公司的发展提供了充足的资金保障,也吸引了更多知名产业机构和投资基金的关注。公司借此机会扩大了研发团队和生产规模,进一步提升了产品的研发和生产能力。

Cyrustek公司的发展小趣事

在电子行业的发展过程中,Cyrustek公司始终能够精准把握市场需求的变化。无论是智能家居、物联网还是可穿戴设备等领域,Cyrustek都能够迅速推出符合市场需求的产品。这种敏锐的市场洞察力和快速响应能力,使得Cyrustek在电子行业中始终保持领先地位。同时,Cyrustek还注重与客户的沟通和合作,不断收集客户反馈,优化产品设计,提高客户满意度。

Akahane Electronics Ind Corp公司的发展小趣事

在电子行业的早期,Akahane Electronics Ind Corp凭借其先进的半导体技术研发,迅速崭露头角。公司专注于提高芯片的性能和稳定性,不断推出创新产品,满足了市场对于高速运算和高效能耗比的迫切需求。通过不断优化生产工艺和降低成本,Akahane在激烈的市场竞争中占据了一席之地,并逐渐扩大了市场份额。

问答坊 | AI 解惑

一种新颖的功率因数校正芯片的研究

一种新颖的功率因数校正芯片的研究   摘要:介绍了一种新颖的功率因数校正(PFC)芯片。它的主要特点是提高了轻载时的功率因数和改善了电路的动态性能。实验表明:这种新颖的PFC控制芯片实现了这些功能。 关键词:功率因数校正;动态性能 ...…

查看全部问答>

为什么在用allergo 更改pcb的单位后,就会报错呢

本信息来自合作QQ群:电子工程师技术交流(12425841)   群主在坛子ID:Kata[/quote] 为什么在用allergo 更改pcb的单位后,比如把mil改成inch,database check就会报错呢 [quote] ERROR IN PAD STACK name = P70C40 pad size does n ...…

查看全部问答>

wince6.0 intel_chips_x86 MsDos loadcepc.exe 硬盘启动为什么黑屏

    在内核编译时已经去掉KITL选项了,该选的组件已经选了,内核加载已经完成,为什么还是黑屏呢? 请高人指点!!!…

查看全部问答>

Keil for arm问题

realview 3.2 Hello.c: Warning: C3910W: Old syntax, please use \'--via\'. Hello.c: error: C3900U: Unrecognized option \'-pu\'. Hello.c: Warning: C3910W: Old syntax, please use \'--apcs\'. 怎么解决 谢谢…

查看全部问答>

家用烟感

各位高手,请帮帮忙,需要家用烟感方面的设计,主要用到光敏二极管,射频电路,cc2500 msp430单片机 。。。挥泪大感谢啊 …

查看全部问答>

LED的专业照明和通用照明之前景

演讲题目:LED的专业照明和通用照明之前景 演讲人:深圳帝光电子有限公司 技术总监 教授级高工 苏遵惠 主 要 内 容:   LED———健康 环保 节能光源   LED还需亟待解决的问题   LED照明之发展前景 请大家 ...…

查看全部问答>

吉时利对于OLED显示器的DC生产测试

据媒体报道,三星旗下三家面板公司Samsung Display、S-LCD以及SMD将被合并成一个公司,新公司将主要从事利润更好的AMOLED面板产品生产。面对竞争日益激烈的OLED市场,吉时利会如何服务呢?   这段时间吉时利就和大家探讨一下OLED显示器的D ...…

查看全部问答>

求大神帮助

书上这样写:当用OSTaskCreat()创建一个任务时,这个函数就会调用系统函数OSTCBInit()来为任务控制进行初始化。      这里对任务控制块进行初始化,是怎样进行的?系统自动初始化?? 还是怎样进行的初始化?…

查看全部问答>

推荐一家做电源的淘宝店,为了方便竞赛同学,不是广告

本帖最后由 paulhyde 于 2014-9-15 04:08 编辑 店名 慕寒冰雪, 不仅电源类比较全 普通元器件也全,还有模拟类芯片也全,象重庆育松电阻电容类器件基础元件全,有的专卖芯片全,这家算是两类都全,特别电源类芯片特别全,主营IR系列芯片和MOS管, ...…

查看全部问答>

EEWORLD下载中心鼎力奉献(二)程序员修炼之道--从小工到专家

EEWORLD下载中心鼎力奉献(二)程序员修炼之道--从小工到专家    在上一个专题中,我们给大家搜集整理了国外优秀的C语言学习书籍,大家可以根据自己的需要选取其中的学习。如果能够系统的学习其中的一部分,那么相信大家一定能够很好地掌 ...…

查看全部问答>