历史上的今天
返回首页

历史上的今天

今天是:2025年08月05日(星期二)

正在发生

2019年08月05日 | STM32学习笔记之IIC操作

2019-08-05 来源:eefocus

STM32中的IIC可分为硬件IIC和软件IIC,但实际应用中更倾向于软件IIC。即可自行指定两个端口为数据线和时钟线进行IIC的模拟。但是相对于52单片机的IIC协议,STM32的IIC时序操作完全一致,唯一的差别在与STM32需要对端口的信号输入输出端口进行配置。


IIC总线协议之起始信号: IIC的启动实在SDA和SCL均为高电平期间,SDA拉低后SCL接着拉低。


void IIC_Start(void)

{

SDA_OUT();    // 配置SDA为输出模式

SDA_SET;

SCL_SET;        // 初始状态SDA、SCL均为高电平

delay_us(5);

SDA_CLR;        // SDA拉低

delay_us(5);    // 延时5us以上

SCL_CLR;

}

      IIC总线协议之停止信号:IIC的停止是发生在SCL为高电平期间,SDA突然拉高。


 


void IIC_Stop(void)

{

SDA_OUT();

SDA_CLR;

SCL_SET;

delay_us(5);

SDA_SET;

delay_us(5);

}

  IIC总线协议之伪造应答:IIC从器件的应答主要是发生在SCL为高电平期间,SDA为低电平,延时5us以后SCL拉低。 


void IIC_Ack(void)

{

SDA_OUT();

SDA_CLR;

SCL_SET;

delay_us(5);

SCL_CLR;

delay_us(5);

}

IIC总线协议之伪造非应答:IIC器件的非应答是指在SCL为高电平期间,SDA也为高电平,延时5us以后SCL拉低。 


void IIC_NoAck(void)

{

SDA_OUT();

SDA_SET;

SCL_SET;

delay_us(5);

SCL_CLR;

delay_us(5);

}

     IIC总线协议之写单字节:IIC发送数据时从高到低位发送。


void IIC_WriteByte(unsigned char data)

{

unsigned char i ;

SDA_OUT();

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

{

if((data< SDA_SET;

else

SDA_CLR;

// __Nop();        //确保数据线上电平稳定

SCL_SET; // 时钟线高电平期间,数据线上数据稳定有效

delay_us(5);

SCL_CLR; // 时钟线为低电平期间,开始发送数据

}

}

    IIC总线协议之读单字节:IIC读取数据时也是先读取高位。 


unsigned char IIC_ReadByte(void)

{

unsigned char i,dat=0;

SDA_IN();

SDA_SET;

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

{

SCL_CLR;

delay_us(5);

SCL_SET;

dat<<=1;

if(SDA)

dat+=1;

}

SCL_CLR;

delay_us(5);

return(dat);

}

  IIC总线协议之写数据:按照总线协议发送。 


void IIC_WriteData(unsigned char add,unsigned char dat)

{

IIC_Start();                // 开启IIC总线

IIC_WriteByte(0XA0);        // 写入从器件地址

IIC_Ack();                  // 伪造应答

IIC_WriteByte(add);         // 写入从器件内存地址

IIC_Ack();                  // 伪造应答

IIC_WriteByte(dat);         // 写入数据

IIC_Ack();                  // 伪造应答

IIC_Stop();                 // 停止IIC总线

}

  IIC总线协议之读数据:在读取时首先发送从期间地址和要读取的内存地址,然后重新启动总线读取数据。


unsigned char IIC_ReadData(unsigned char add)

{

unsigned char temp=0;

IIC_Start();

IIC_WriteByte(0XA0);

IIC_Ack();

IIC_WriteByte(add);

IIC_Ack();

IIC_Start();

IIC_WriteByte(0XA1);        // 从期间读操作

IIC_Ack();

temp=IIC_ReadByte();        // 读取值

SCL_CLR;

IIC_NoAck();

IIC_Stop();

return temp;

}

     当然在这些操作之前,还需要配置相关的IO口。


void IIC_Config(void)

{

GPIO_InitTypeDef GPIO_InitStruct ;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7 ;

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

GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz ;

GPIO_Init(GPIOB,&GPIO_InitStruct);

GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7);             //先拉高

}

   除此之外,还有关于端口的宏定义。


#define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}

#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}

 

#define SCL_SET GPIO_SetBits(GPIOB,GPIO_Pin_6)

#define SCL_CLR GPIO_ResetBits(GPIOB,GPIO_Pin_6)

 

#define SDA_SET GPIO_SetBits(GPIOB,GPIO_Pin_7)

#define SDA_CLR GPIO_ResetBits(GPIOB,GPIO_Pin_7)

 

#define SDA GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)

      最后当然是我们验证对24C02的数据读写结果是否正确。 


int main(void)

 {  

u8 flag=0 ;

 

delay_init();     //延时函数初始化   

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级

uart_init(9600); //串口初始化为115200

LCD_Init();

POINT_COLOR=RED;

 

IIC_Config();                      //IIC相关端口配置

flag=IIC_ReadData(0x00);             // 读取之前开机次数

flag++;                            // 加1次

IIC_WriteData(0x00,flag);          // 将当前开机启动次数写进去

printf("%d",flag);                // 串口显示当前开机次数

 

while(1) 

{  

POINT_COLOR=RED;   

LCD_ShowString(30,40,210,16,16,"This is the"); 

LCD_ShowNum(124,40,flag,2,16);

  LCD_ShowString(140,40,210,24,16,"th Start The System");   

LED0=!LED0;      

delay_ms(1000);

}

到此,就完成了关于IIC协议操作24C02的操作,实现开机记录次数。 

推荐阅读

史海拾趣

Hoffman Engineering公司的发展小趣事

在Harry Hoffman的领导下,Hoffman Engineering不断扩展其产品线。从最初的压力机安全保护装置,公司逐渐研发出蒲公英掘具、碟靶投掷器、厨房用电动搅拌器等一系列创新产品。这些产品不仅丰富了Hoffman Engineering的市场布局,也展现了公司在不同领域的技术实力。特别是Hoffman的机柜系列产品,如接线箱和电源插座,逐渐成为市场上的热门产品,为公司带来了稳定的收入来源。

Crouzet公司的发展小趣事

随着市场竞争的加剧,Crouzet开始注重提供定制化的解决方案,以满足客户不断变化的需求。公司凭借强大的研发能力和丰富的行业经验,能够根据客户的具体需求,提供量身定制的产品和服务。这种以客户需求为导向的经营理念,使得Crouzet在市场上赢得了更多的客户和合作伙伴。

CMOSIS公司的发展小趣事

近年来,随着人工智能、物联网等技术的快速发展,CMOS图像传感器行业也面临着深刻的变革。CMOSIS公司敏锐地把握住了这一趋势,积极调整战略方向,加大了在人工智能算法、低功耗设计等方面的研发投入。通过不断创新和优化产品,公司成功应对了行业变革带来的挑战,保持了稳健的发展态势。

C&D公司的发展小趣事

为了保持技术领先地位,C&D公司积极与高校、科研机构等开展产学研合作。通过与这些机构的紧密合作,C&D公司不断引进新技术、新工艺和新材料,推动产品的持续创新。同时,公司还鼓励员工参与各种技术创新活动,激发员工的创新热情,为公司的持续发展注入新的活力。

ANSHAN [Anshan Suly Electronics]公司的发展小趣事

在快速发展的过程中,ANSHAN公司始终把人才队伍建设放在首位。公司注重引进和培养高素质的技术人才和管理人才,为他们提供广阔的发展空间和良好的工作环境。同时,公司还建立了完善的培训体系和激励机制,鼓励员工不断学习新知识、掌握新技能。这些举措不仅提升了员工的综合素质和能力水平,也为公司的长远发展提供了有力的人才保障。

川土(Chipanalog)公司的发展小趣事

经过数月的紧张研发与测试,川土微电子成功推出了其首款自研产品——一款高性能的隔离器芯片。这款芯片的问世不仅填补了国内市场的空白,也标志着川土微电子在模拟芯片领域的初步成功。随后,公司开始逐步扩大产品线,涵盖了接口、高性能模拟等多个系列。

问答坊 | AI 解惑

超级单片机开发工具!! 很实用哦!

!!!超级单片机开发工具!!!   单片机开发过程中用到的多功能工具,包括热敏电阻RT值--HEX数据转换;3种LED编码;色环电阻计算器;HEX/BIN 文件互相转换;eeprom数据到C/ASM源码转换;CRC校验生成;串口调试,带简单而实用的数据分 ...…

查看全部问答>

基于AT89C52单片机的SD卡的读写设计

长期以来,以Flash Memory为存储体的SD卡因具备体积小、功耗低、可擦写以及非易失性等特点而被广泛应用于消费类电子产品中。特别是近年来,随着价格不断下降且存储容量不断提高,它的应用范围日益增广。当数据采集系统需要长时间地采集、记录海量数 ...…

查看全部问答>

到底应该选择哪种无线技术?

底应该选择哪种无线技术?---- 各种无线技术简介及其选择 摘要:本文将简要介绍各种无线技术,包括:红外线、蓝牙技术、Zigbee技术、自组织网络、Wi-Fi技术、射频识别技术(RFID)、实时定位服务(RTLS)、微波存取全球互通技术(WiMax)、大功 ...…

查看全部问答>

辩题讨论-硬件工程师好还是软件工程师好?

我想每个学电子的,都会为自己的发展方向而忧愁过。在选择从事方向时不知道就行选择哪一个?   究竟是做硬件好还是做软件好,还是全部都做?   希望网友能说是你的看法,给为选择的人们一定指引。。。…

查看全部问答>

ucos中的OSUnMapTbl原理在硬件中的应用?

ucos中的OSUnMapTbl是一个很大的静态数组,提高查找速度 以前看过一个网页说 这中设计思想在硬件设计中也有应用,固化在芯片中什么的, 烦请请高手指点一下。…

查看全部问答>

大家一般怎么采购电子元器件?

我一般是在华强电子网上搜,华强上面的商家一般是深圳广州的,然后逐个打电话去问,网上显示有货也不一定有货。不知道大家一般怎么买元器件。…

查看全部问答>

【MSP430共享】基于智能检测技术的室内照明系统

以MSP430单片机为核心,采用检测单元阵列进行人体检测,并结合自然光检测,实现照明系统的只能控制,解决了传统节能照明控制系统存在的检测不准确、可靠性不高的问题,达到了节能目的。实际应用验证了方案的可行性,具有良好的实用价值。 [ 本帖最 ...…

查看全部问答>

求帮助设计一个关于电梯运行的控制电路

一个四层楼的建筑,两个电梯:电梯1和电梯2要求:1,当处于某层的一个人按动“呼叫”命令时,距离他较近的电梯到来;           2,如果两个电梯和这个人距离一样,则“电梯1”到来        &nbs ...…

查看全部问答>

How to deliver employee's welfare?

The high welfare of valley song on the other hand can keep a talented person, can deliver the information of \"the valley song has good business enterprise quality\" to the north face denali external world on the other hand.As lon ...…

查看全部问答>

430F169AD采样工作有间断期

#include #define   Num_of_Results   8 uint ADC_BUF0[Num_of_Results]; uint ADC_BUF1[Num_of_Results]; uint sumI;            //定义电流采样均值 uint sumV;    ...…

查看全部问答>