历史上的今天
返回首页

历史上的今天

今天是:2024年09月03日(星期二)

正在发生

2019年09月03日 | STM32小白入门(第12天)---I2C协议

2019-09-03 来源:eefocus

一、概述



二、信号概念


三、AT24C02(EEPROM电可擦除ROM)--配合单片机存贮掉电前需要保存的数据,类似单片机的硬盘

1、写时序

2、读时序


思考题2:在24c02控制时钟的时候,为什么要进行5us的延时,小于5us延时或许大于5us的延时是否可以,示例代码如下:


        //设置SCL高电平

SCL=1;

delay_us(5);

//设置SCL低电平

SCL=0;

delay_us(5);

回答:大于5us是可以的,如果使用5ms是可以的。但是延时是不能低于1.2us,详细描述如下图。



3、起始信号和停止信号


//sda输入输出模式切换函数

void OLED_SDA_Mode(GPIOMode_TypeDef IOMode)

{

//PB9初始化设置 

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin   =  OLED_SDA_PIN; //9号引脚

GPIO_InitStructure.GPIO_Mode  = IOMode;     //输出模式/输入模式

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;       //推挽输出,驱动LED需要电流驱动

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHz

GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP; //上拉

GPIO_Init(OLED_GPIO_PORT, &GPIO_InitStructure); //初始化GPIOB,把配置的数据写入寄存器

}

/**********************************************

//IIC Start

**********************************************/

void IIC_Start(void)

{

//保证SDA引脚为输出模式

OLED_SDA_Mode(GPIO_Mode_OUT);

OLED_SCLK = 1;

OLED_SDA_W = 1;

/*注:原版代码是没有加延时的,这里一定要延时,因为M4是高速芯片,3.3MHz通信速率,所以一个时钟周 期约为0.3us,有与我们处理器是168MHz,执行一条指令比这个时间快很多所以我们需要加至少1us的延时,

但是在频率较低的处理器中我们可以不加延时

*/

delay_us(1);

OLED_SDA_W = 0;    //数据线先拉低,时钟线后拉低,即为启动信号

delay_us(1);

OLED_SCLK = 0;

delay_us(1);

}

 

/**********************************************

//IIC Stop

**********************************************/

void IIC_Stop(void)

{

//保证SDA引脚为输出模式

OLED_SDA_Mode(GPIO_Mode_OUT);

OLED_SCLK = 1;    //时钟线先拉高,数据线后拉高,即为停止信号

OLED_SDA_W = 0;

delay_us(1);

OLED_SDA_W = 1;

delay_us(1);

}

uint8_t IIC_Wait_Ack(void)

{

uint8_t ack=0;

//保证SDA引脚为输入模式

OLED_SDA_Mode(GPIO_Mode_IN);

OLED_SCLK = 1;

delay_us(1);

//有应答为低电平,无应答为高电平

if(OLED_SDA_R) //无应答

{

ack=1;

IIC_Stop();

}

else //有应答

ack=0;

OLED_SCLK = 0;

delay_us(1);

return ack;

}

/**********************************************

// IIC Read byte

**********************************************/

uint8_t i2c_recv_byte(void)

{

uint8_t byte=0;


uint32_t i=0;

//保证SDA引脚为输出模式

i2c_sda_mode(GPIO_Mode_OUT);


//设置为低电平

SCL=0;

SDA_W=0;


delay_us(5);


//保证SDA引脚为输入模式

i2c_sda_mode(GPIO_Mode_IN);


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

{

//设置时钟为高电平,告诉从机,可以对SDA引脚进行控制

SCL=1;

delay_us(5);


//读取SDA引脚的电平

if(SDA_R)

byte|=1<<(7-i);



//设置时钟为低电平,告诉从机,不可以对SDA引脚进行控制

SCL=0;

delay_us(5);

}


return byte;

}

void at24c02_read(uint8_t addr,uint8_t *pbuf,uint32_t len)    //从机读取数据

{

uint32_t ack=0;

//发送起始信号

i2c_start();

//发送寻址地址

i2c_send_byte(0xA0);

 

 

//等待应答

ack=i2c_wait_ack();

if(ack)

{

printf("i2c ack device address failrn");

return ;

}

printf("i2c ack device address okrn");

 

//发送24c02的数据存储地址

i2c_send_byte(addr);

 

//等待应答

ack=i2c_wait_ack();

if(ack)

{

printf("i2c ack word address failrn");

return ;

}

printf("i2c ack word address okrn");

//再一次发送起始信号

i2c_start();

//发送寻址地址,读访问操作

i2c_send_byte(0xA1);

//等待应答

ack=i2c_wait_ack();

if(ack)

{

printf("i2c ack device address_r failrn");

return ;

}

printf("i2c ack device address_r okrn");

len=len-1;

while(len--)

{

*pbuf++=i2c_recv_byte();

i2c_ack(0);

}

*pbuf=i2c_recv_byte();

i2c_ack(1);

//发送停止信号

i2c_stop();

printf("i2c ack read data okrn");

}

/**********************************************

// IIC Write byte

**********************************************/

 

void Write_IIC_Byte(unsigned char IIC_Byte)

{

unsigned char i;

 

//保证SDA引脚为输出模式

OLED_SDA_Mode(GPIO_Mode_OUT);

OLED_SCLK = 0;

delay_us(1);

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

{

if(IIC_Byte&(1<<(7-i)))  MSB

OLED_SDA_W = 1;

else 

OLED_SDA_W = 0;

delay_us(1);

OLED_SCLK = 1;

delay_us(1);

OLED_SCLK = 0;

delay_us(1);

}

}


推荐阅读

史海拾趣

ALD [Advanced Linear Devices]公司的发展小趣事

ALD(Advanced Linear Devices)是一家专注于模拟半导体器件和电源解决方案的公司。以下是关于ALD公司发展的5个相关故事:

  1. 公司成立与创始人: ALD公司成立于1985年,总部位于美国加州的米尔皮塔斯市。该公司由俄罗斯裔工程师及企业家Vladimir Larkhov先生创立。Larkhov先生在半导体领域有着丰富的经验和深厚的技术底蕴,他创立ALD旨在为市场提供高品质、高性能的模拟集成电路和解决方案。

  2. 技术创新与专利: ALD公司以其在模拟半导体领域的技术创新而闻名。该公司拥有众多的专利,涵盖了多个关键技术领域,包括功率管理、电源管理、精密电压参考和模拟信号处理等。这些专利为ALD提供了技术壁垒,保护了其在市场上的地位。

  3. 产品线与市场应用: ALD公司的产品涵盖了模拟集成电路(ICs)、功率管理芯片、电源解决方案等领域。其产品被广泛应用于工业控制、医疗设备、汽车电子、通信设备、消费类电子产品等多个市场领域。ALD产品的高性能、高可靠性得到了客户的认可和信赖。

  4. 全球业务拓展: 随着全球市场的不断扩大,ALD公司不断加大对海外市场的开拓力度。除了在美国设立总部和研发中心外,ALD还在亚洲、欧洲等地设立了销售办事处和合作伙伴,以便更好地服务全球客户。

  5. 不断创新与发展: ALD公司一直致力于不断创新和发展,不断推出具有竞争力的新产品和解决方案,以满足客户不断变化的需求。公司注重技术研发和人才培养,拥有一支技术过硬、富有创新精神的团队,为公司的持续发展提供了强有力的支持。

这些故事展现了ALD公司在技术创新、产品应用、全球业务拓展和持续发展等方面的发展历程和成就。

Euvis Inc公司的发展小趣事

在技术创新的基础上,Euvis Inc公司积极拓展市场,通过与国际知名电子产品制造商的合作,将其产品应用于各类高端电子产品中。同时,公司注重品牌建设,通过一系列营销活动提升品牌知名度和美誉度。随着市场份额的不断扩大,Euvis Inc公司逐渐在电子行业中树立起了高端、可靠的品牌形象。

Dymec公司的发展小趣事

随着业务的不断拓展,Dymec公司逐渐意识到品质对于品牌的重要性。公司决定加大对产品质量的投入,从原材料采购到生产流程,再到质量检测,每一个环节都严格把控。这种对品质的执着追求使得Dymec公司的产品在市场上获得了良好的口碑,公司也逐渐成为了电子连接器行业的知名品牌。

Green Solution Technology Co Ltd公司的发展小趣事

随着全球对环保问题的日益关注,Dymec公司也积极响应号召,开始推动绿色环保的转型。公司投入大量资金研发环保型电子连接器产品,采用环保材料和生产工艺,减少了对环境的污染。这一转型不仅提升了公司的社会责任感,也为公司赢得了更多客户的青睐。

First Silicon Co., Ltd公司的发展小趣事

面对日益激烈的市场竞争,First Silicon公司深知供应链管理的重要性。公司投入大量资源,对供应链进行了全面整合和优化。通过建立长期稳定的供应商关系、引入先进的供应链管理软件和提高库存周转率等措施,First Silicon有效降低了原材料成本和库存风险。同时,公司还加强了与下游客户的沟通和合作,确保产品能够及时、准确地送达客户手中。这一系列举措不仅提升了公司的运营效率,还增强了其市场竞争力。

峰岹(Fortior Tech )公司的发展小趣事

人才是企业发展的核心竞争力。First Silicon公司深知这一点,因此始终将人才战略作为公司发展的重要支撑。公司建立了完善的人才培养体系和激励机制,吸引了大批优秀人才的加入。同时,公司还注重与高校和研究机构的合作,共同开展前沿技术研究和人才培养项目。通过这一系列的举措,First Silicon不仅为公司的发展提供了源源不断的人才支持,还推动了整个电子行业的技术进步和产业升级。

请注意,以上五个故事均是基于电子行业的一般情况和假设构建的,并非First Silicon Co., Ltd公司的实际历史。如需了解该公司的具体发展情况,建议直接访问其官方网站或查阅相关行业报告。

问答坊 | AI 解惑

通讯基本知识

里面主要介绍了以下几个内容: 1、帧结构 2、时隙 3、什么是信令 4、什么是PCM 5、什么是7号信令 6、TDM 7、知识总结点…

查看全部问答>

CPU315和模块通讯问题

CPU315-PN/DP连接3个分布式I/O机架,3个分布式I/O机架还未上电,直接给CPU的机架上电后程序下载正常,而且第一次下载采用TCP/IP的形式,后来发现AI模块的信号与现场设备的不符,现场的设备是4-20mA的信号输出,AI模块上设置的是0-10V的信号输入,AI ...…

查看全部问答>

LINUX下如何将字符串转化成UNICODE串

在编程中遇到个问题,LINUX下如何将字符串转化成UNICODE串以及将UNICODE串转换成字符串。 在WINDOWS下可以调用MultiByteToWideChar(),WideCharToMultiByte()函数完成, 请问LINUX下有类似的函数吗,网上说的不清楚,请高人指点.…

查看全部问答>

新生入学第一问:怎么调试串口设备

刚学,也许问题就问得不对。见谅 如果GSM模块已经和计算机串口相连,网上有一段话说。 1)    从串口输入:AT+CMGS=”13636371111” 然后按回车键。 这里的  从串口输入 是指从哪里输入,是指用cmd命令进入DOS模式,在DOS ...…

查看全部问答>

mega中文资料!~

中文DATASHEET!~ [ 本帖最后由 wanghongyang 于 2010-10-25 12:21 编辑 ]…

查看全部问答>

刚看见有人说430贵,不得不说几句

刚看见有人说430单片机很贵,100美金什么的,这可能是被AVR的代理商给忽悠过吧。   第一,430的产品齐全,价格一直在降,最近我申请了大概0.5美金的样片。反观AVR的芯片最近呢几年来一直在涨,现在很多芯片又是断货又是涨价的,很多芯片都不 ...…

查看全部问答>

请逐步分析该程序的意思

void Show_Waveform(void){    unsigned char k; unsigned int  i,s; for(s=10;s<310;s++)     {  Set_ramaddr(cl[s-10],s);   Write_com_data(0x0022,0x0000);   if(cl[s-10]<c ...…

查看全部问答>

TI高效节能汽车系统设计

$(\'swf_Jwj\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encodeURI(\'http://player.youku.com/player.php/sid/XMzA3OTU5NTY4/v.sw ...…

查看全部问答>

CCS窗口使用说明

CCS窗口使用说明…

查看全部问答>