历史上的今天
返回首页

历史上的今天

今天是:2024年10月30日(星期三)

正在发生

2019年10月30日 | STM32之I2C 学习笔记

2019-10-30 来源:eefocus

一、基本概念

(1)I2C是两线式串行总线,由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,高速IIC总线一般可达400kbps以上。


(2)IIC是半双工通信方式,也就是说它既可以接收也可以发送,但是由于它只有一根数据线,所以接收和发送不能同时进行。


二、I2C协议

(1)空闲状态:数据线SDA和时钟SCL线都处于高电平。


(2)开始信号:SCL线持续处于高电平,数据线SDA由高变为低。


(3)停止信号:SCL线持续处于高电平,数据线SDA由低变为低。


(4)应答信号:位发送器每发送一个字节,就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。 应答信号为低电平时,规定为有效应答(ACK简称应答位)


(5)数据的有效性:数据SDA在SCL的上升沿到来之前就需准备好。并在在下降沿到来之前必须稳定。否则,你可以想象,就会被认为是开始信号或者停止信号。


(6)数据的传输:在SCL串行时钟的配合下,在SDA上逐位地串行传送每一位数据。数据位的传输是边沿触发。


三、代码讲解

//产生IIC起始信号

void IIC_Start(void)

{

SDA_OUT();     //sda线输出

IIC_SDA=1;     

IIC_SCL=1;

delay_us(4);

  IIC_SDA=0;//START:when CLK is high,DATA change form high to low 

delay_us(4);

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

}   

 


//产生IIC停止信号

void IIC_Stop(void)

{

SDA_OUT();//sda线输出

IIC_SCL=0;

IIC_SDA=0;//STOP:when CLK is high DATA change form low to high

  delay_us(4);

IIC_SCL=1; 

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

delay_us(4);    

}

 


//等待应答信号到来

//返回值: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);  

while(READ_SDA)

{

ucErrTime++;

if(ucErrTime>250)

{

IIC_Stop();

return 1;

}

}

IIC_SCL=0;//时钟输出0    

return 0;  

//产生ACK应答

void IIC_Ack(void)

{

IIC_SCL=0;

SDA_OUT();

IIC_SDA=0;

delay_us(2);

IIC_SCL=1;

delay_us(2);

IIC_SCL=0;

}

//不产生ACK应答     

void IIC_NAck(void)

{

IIC_SCL=0;

SDA_OUT();

IIC_SDA=1;

delay_us(2);

IIC_SCL=1;

delay_us(2);

IIC_SCL=0;

}

//IIC发送一个字节

//返回从机有无应答

//1,有应答

//0,无应答   

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);

    }  

}

//读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;

        receive<<=1;

        if(READ_SDA)receive++;   

delay_us(1); 

    }  

    if (!ack)

        IIC_NAck();//发送nACK

    else

        IIC_Ack(); //发送ACK   

    return receive;

}


四、EEPROM(24C02)



推荐阅读

史海拾趣

宜源科技(ETERNAL)公司的发展小趣事

宜源科技公司非常重视人才培养和团队建设。公司建立了一套完善的人才培养体系,为员工提供丰富的培训和发展机会。同时,宜源科技还积极引进优秀人才,打造高素质、专业化的技术和管理团队。这些团队在公司的各个领域中发挥着重要作用,为公司的长远发展提供了有力的人才保障。

Asia Pacific Microsystems Inc公司的发展小趣事

APM深知在电子行业中,单打独斗很难取得长远的发展。因此,公司开始积极寻求与上下游企业的合作,共同构建完整的产业链。通过与原材料供应商、代工厂商以及终端客户的紧密合作,APM实现了产业链的整合与协同发展。这不仅降低了公司的运营成本,还提高了产品的质量和生产效率,为公司的持续发展奠定了坚实基础。

客益(Guestgood)公司的发展小趣事

随着电子行业的快速发展,APM意识到只有不断创新才能在市场中立足。于是,公司加大了对研发的投入,积极引进高端人才,并与多所高校和研究机构建立了合作关系。经过几年的努力,APM成功研发出了一款具有自主知识产权的高性能模拟芯片,填补了国内市场的空白。这款芯片在信号处理、通信等领域具有广泛应用前景,为APM带来了可观的收益。

Forge Europa Ltd公司的发展小趣事

在快速发展的过程中,Forge Europa Ltd公司始终注重品牌与文化的塑造。公司秉承“创新、品质、服务”的企业精神,致力于为客户提供优质的产品和服务。同时,公司还注重员工的培养和发展,建立了完善的培训体系和激励机制,激发了员工的创造力和工作热情。通过这些努力,Forge Europa不仅塑造了一个具有行业影响力的品牌形象,还形成了独特的企业文化,为企业的长远发展奠定了坚实的基础。

驰芯微(CHIPWISE)公司的发展小趣事

驰芯微公司与明然科技的合作是公司在技术创新方面的又一重要突破。双方共同研发的MCU控制芯片成功应用于主动悬架项目,并在奇瑞的星途瑶光、瑞虎9等车型上取得了重要进展。这一合作不仅提升了国产芯片在高端配置车型中的应用水平,也进一步推动了驰芯微在汽车电子领域的发展。

东科半导体(DK)公司的发展小趣事

面对电源管理芯片市场需求的不断增长,东科半导体(DK)公司决定投资扩产。公司投资数亿元建设新的生产线和研发基地,提升产能和研发能力。同时,公司还加大了对新技术、新产品的研发投入,不断推出具有竞争力的新产品。通过投资扩产和加大研发投入,东科半导体(DK)公司进一步巩固了其在电源管理芯片市场的领先地位。

以上五个故事从不同角度展现了东科半导体(DK)公司在电子行业中的发展历程和成就。这些故事不仅记录了公司的成长轨迹,也反映了公司在技术创新、产学研合作、市场拓展和品牌建设等方面的努力和成果。

问答坊 | AI 解惑

刚写的基于UDP通信的校验算法源码

原文作者:玉丫子   本文来自于:HELLODSP uint16 CheckSumUdp(uint8 *check,uint16 length) { uint32 sum=0; uint16 i;         for (i=0;i…

查看全部问答>

怎么安装FEDORA啊

我怎么也不能在电脑上安装linux 哪位高手就这方面介绍介绍…

查看全部问答>

怎么修改redboot才能从cf卡上启动呢(非GRUB模式)?

老大们,怎么修改redboot才能从CF、disk上启动呢?谢谢!…

查看全部问答>

基于PID算法的有刷直流电机PWM调速

请问各位:基于PID算法的有刷直流电机PWM调速系统中对有刷直流电机调速用到的算法是模拟 PID控制原理还是增量式PID控制或者别的PID控制原理?能否将PID算法式子告诉我?谢谢各位了!!QQ:286410824…

查看全部问答>

帮帮我呀很急!!!

我的笔记本接上电源电池也装在电脑上了 为什么电源每隔十几分钟就断自动用电池用一下子几秒钟又用电源了???? 老是自动切换了 是不是硬件坏了…

查看全部问答>

有朋友用过AD2S80吗

本人在使用该芯片过程中遇到一些问题,想请有经验的朋友指教一下。 本人用720极的圆感应同步器作为角度传感器,想利用AD2S80来解码。 激磁信号使用的是5Khz的正弦波,AD2S80设置的分辨率为12位,该芯片的外围电路完全按照芯片手册上的针对5KHZ/12 ...…

查看全部问答>

usbkey

从事专业的cos开发工作,熟悉各种cos工作原理,愿意长期探讨以下工作: 1、开发各种usb加密狗、usbkey开发。 2、开发PKI,PBOC加密锁COS,可以开发基于U盘、HID、CCID等协议的无驱cos; 3、开发各平台USB KEY驱动; 4、专业开发CSP、PKCS11中间 ...…

查看全部问答>

TPS2393A实现大电流热插拔应用

TPS2393A集成电路是一款专为-48V系统优化的热插拔控制器。TPS2393A广泛用于许多应用中,它拥有如下强大功能:.      宽泛的输入电源范围.      可编程电流限制.      UV/OV保护.&nbs ...…

查看全部问答>

EEWORLD大学堂----MSP430x5xx系列

MSP430x5xx系列:https://training.eeworld.com.cn/course/339…

查看全部问答>

求PT4115外围过流或过压保付电路

求PT4115外围过流或过压保付电路,要求电源或脉冲控制端短路时处于保付状态…

查看全部问答>