历史上的今天
返回首页

历史上的今天

今天是:2025年02月12日(星期三)

正在发生

2019年02月12日 | STM32—基于模拟IIC方式读取EEPROM

2019-02-12 来源:eefocus

前言:

最近在调试STM32L152芯片利用IIC接口读取EEPROM的程序,总结下STM32的 IIC接口 读取EEPROM的使用方法。


PS:由于STM32的硬件IIC存在一些问题,本文暂时使用模拟IIC进行EEPROM的读取。STM32的硬件IIC使用方法见另外两篇文章:传送门1和传送门2。


硬件平台:STM32L152


软件平台:keil v5+cubeMX


函数库:HAL函数库


 


1:配置iic引脚,本例对应PC2和PC3管脚,移植修改对应管脚。


#define I2C_SCL GPIO_PIN_2   //PC2

#define I2C_SDA GPIO_PIN_3   //PC3

 

 

#define I2C_SCL_H HAL_GPIO_WritePin(GPIOC,I2C_SCL,GPIO_PIN_SET)

#define I2C_SCL_L HAL_GPIO_WritePin(GPIOC,I2C_SCL,GPIO_PIN_RESET)

 

#define I2C_SDA_H HAL_GPIO_WritePin(GPIOC,I2C_SDA,GPIO_PIN_SET)

#define I2C_SDA_L HAL_GPIO_WritePin(GPIOC,I2C_SDA,GPIO_PIN_RESET)

void I2C_INIT()

{

    GPIO_InitTypeDef GPIO_InitStructure;

 

    GPIO_InitStructure.Pin= I2C_SCL|I2C_SDA;

    GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_PP;

    GPIO_InitStructure.Pull  =GPIO_NOPULL;

    GPIO_InitStructure.Speed  = GPIO_SPEED_FREQ_VERY_HIGH;

    HAL_GPIO_Init(GPIOC,&GPIO_InitStructure);

 

    I2C_SCL_H;

    I2C_SDA_H;

}

2: 编写开始、停止、应答、非应答、发送、接收等信号程序;

//SDA数据输入函数


void I2C_SDA_OUT()

{

    GPIO_InitTypeDef GPIO_InitStructure; 

 

    GPIO_InitStructure.Pin =I2C_SDA;

    GPIO_InitStructure.Mode =GPIO_MODE_OUTPUT_PP;

    GPIO_InitStructure.Pull  =GPIO_PULLUP;

    GPIO_InitStructure.Speed =GPIO_SPEED_FREQ_VERY_HIGH;

    HAL_GPIO_Init(GPIOC,&GPIO_InitStructure);

}


//SDA数据输出函数


void I2C_SDA_IN(void)

{

    GPIO_InitTypeDef GPIO_InitStructure; 

 

    GPIO_InitStructure.Pin   =I2C_SDA;

    GPIO_InitStructure.Mode =GPIO_MODE_INPUT;

    GPIO_InitStructure.Pull  =GPIO_NOPULL;

    GPIO_InitStructure.Speed =GPIO_SPEED_FREQ_VERY_HIGH;

    HAL_GPIO_Init(GPIOC,&GPIO_InitStructure);

}

//产生IIC开始信号函数


void I2C_Start(void)

{

  I2C_SDA_OUT();

 

    I2C_SDA_H;

    I2C_SCL_H;

    delay_us(5);

    I2C_SDA_L;

    delay_us(6);

    I2C_SCL_L;

}

 //产生IIC停止信号函数


void I2C_Stop(void)

{

   I2C_SDA_OUT();

 

 

   I2C_SCL_L;

   I2C_SDA_L;

   I2C_SCL_H;

   delay_us(6);

   I2C_SDA_H;

   delay_us(6);

}

//IIC应答函数


void I2C_Ack(void)

{

   I2C_SCL_L;

   I2C_SDA_OUT();

   I2C_SDA_L;

   delay_us(2);

   I2C_SCL_H;

   delay_us(5);

   I2C_SCL_L;

}


//IIC非应答函数


void I2C_NAck(void)

{

   I2C_SCL_L;

   I2C_SDA_OUT();

   I2C_SDA_H;

   delay_us(2);

   I2C_SCL_H;

   delay_us(5);

   I2C_SCL_L;

}

//IIC等待应答函数


u8 I2C_Wait_Ack(void)

{

    u8 tempTime=0;

 

    I2C_SDA_IN();

    I2C_SDA_H;

    delay_us(1);

    I2C_SCL_H;

    delay_us(1);

 

 

    while(HAL_GPIO_ReadPin(GPIO_I2C,I2C_SDA))

    {

        tempTime++;

        if(tempTime>250)

        {

            I2C_Stop();

            return 1;

        }  

    }

    I2C_SCL_L;

    return 0;

}


//IIC发送一个字节函数


void I2C_Send_Byte(u8 txd)

{

    u8 i=0;

 

    I2C_SDA_OUT();

    I2C_SCL_L;

 

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

    {

        if((txd&0x80)>0) //0x80  1000 0000

            I2C_SDA_H;

        else

            I2C_SDA_L;

 

        txd<<=1;

        I2C_SCL_H;

        delay_us(2); 

        I2C_SCL_L;

        delay_us(2);

    }

}


//I2C 读取一个字节函数

 


u8 I2C_Read_Byte(u8 ack)

{

   u8 i=0,receive=0;

 

   I2C_SDA_IN();

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

   {

        I2C_SCL_L;

        delay_us(2);

        I2C_SCL_H;

        receive<<=1;

        if(HAL_GPIO_ReadPin(GPIO_I2C,I2C_SDA))

          receive++;

        delay_us(1); 

   }

    if(ack==0)

      I2C_NAck();

    else

      I2C_Ack();

    return receive;

}

 


3:编写写入EEPROM AT24C02程序。


从EEPROM中读取一字节数据函数。


u8 AA24x_ReadOneByte(u8 addr)

{

    u8 temp=0;

    I2C_Start(); 

    I2C_Send_Byte(0xA0);//1010000

    I2C_Wait_Ack();

    I2C_Send_Byte(addr);

    I2C_Wait_Ack();

    I2C_Start();

    I2C_Send_Byte(0xA1);//10100001

    I2C_Wait_Ack();

    temp=I2C_Read_Byte(0); 

    I2C_NAck();

    I2C_Stop(); 

    return temp; 

}

从EEPROM中写入一字节数据函数。 


void AA24x_WriteOneByte(u8 addr,u8 dt)

{

    I2C_Start();

    I2C_Send_Byte(0xA0);

    I2C_Wait_Ack();

    I2C_Send_Byte(addr); 

    I2C_Wait_Ack();

    I2C_Send_Byte(dt);

    I2C_Wait_Ack();

    I2C_Stop();

    delay_ms(10);

}

 

推荐阅读

史海拾趣

HI Microwave Technology Limited公司的发展小趣事

人才是企业最宝贵的资源。HI Microwave高度重视人才培养和团队建设,通过引进和培养高素质的技术人才和管理人才,不断提升企业的核心竞争力。公司建立了完善的人才激励机制和培训体系,鼓励员工不断学习和创新。同时,公司还注重营造和谐、开放的企业文化氛围,激发员工的积极性和创造力。这些措施为公司的持续发展提供了有力的人才保障和智力支持。

国兴(GOODSKY)公司的发展小趣事

HI Microwave Technology Limited自2004年在中国成立以来,便以“Hertz Infinite”(赫兹无限)为愿景,致力于将产品范围扩展至30 KHz至110 GHz+(针对GaAs、HEMT、PHEMT和MMIC基产品)以及220 GHz+(针对毫米波产品和子系统)。这一宏伟愿景不仅为公司指明了发展方向,也激励着每一位员工不断追求技术创新和产品卓越。在初创阶段,HI Microwave通过引进国际先进的生产设备和技术人才,迅速在微波通信领域站稳脚跟。

Gigabit Logic Inc公司的发展小趣事
通过控制脉冲信号的频率或占空比,可以实现更精细的调速范围。
Fremont_Micro_Devices_USA公司的发展小趣事
用户只需通过触摸即可实现调速,无需手动旋转旋钮或按钮。
Avalon Photonics公司的发展小趣事

随着公司的发展,Avalon Photonics开始寻求国际合作,以进一步拓展市场。公司与欧洲一家知名的科研机构建立了战略合作关系,共同研发新一代的光子学设备。这一合作不仅带来了技术上的互补,也为Avalon打开了欧洲市场的大门。通过国际合作,Avalon的产品逐渐在国际市场上获得认可,公司规模也逐步扩大。

Frequency Sources公司的发展小趣事

面对日益严峻的环境问题和不断变化的市场需求,Frequency Sources公司积极响应国家环保政策和可持续发展战略,致力于研发绿色、环保、高效的频率源产品。同时,公司还继续加大在技术创新方面的投入力度,不断推出具有自主知识产权的新产品和新技术。这种可持续发展的理念和技术创新的精神使得公司在激烈的市场竞争中始终保持领先地位并实现了持续健康的发展。

需要注意的是,以上故事是基于电子行业的一般情况和频率源技术的特点来构建的虚构故事,并不直接对应任何具体公司的实际情况。在实际应用中,请根据具体公司的历史和发展情况进行调整和修改。

问答坊 | AI 解惑

【Arduino】168种传感器与执行器模块系列实验(221)---360°激光雷达模块

本帖最后由 eagler8 于 2022-11-17 05:47 编辑 37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流 ...…

查看全部问答>

[RTT&瑞萨超低功耗MCU RA2L1开发板]测评之PWM模块介绍与测试,呼吸灯实现

[localvideo]c7124e9a44105c641495c3ea541222be[/localvideo]   PWM模块介绍 参考<<Renesas RA2L1 Group User’s Manual: Hardware>>的章节<<320. General PWM Timer (GPT)>> 特征 4通道GPT32,6通道GPT1 ...…

查看全部问答>

【Sipeed 高云GW2A FPGA开发板】开发环境体验之第一个程序之点灯

资料下载 开发板资料 https://dl.sipeed.com/shareURL/TANG/Primer_20K 只能一个一个文件下载,如果能打包下载更好。     芯片资料 http://www.gowinsemi.com.cn/prod_view.aspx?TypeId=10&FId=t3:10:3&Id=167# ...…

查看全部问答>

一个有趣的电路

国外视频网站看到的一个手动调光电路,有兴趣的朋友可以分析看看。       …

查看全部问答>

电荷泵一般用在什么场合?

我的问题: 1.电荷泵一般用在什么场合?   2.使用电荷泵有什么优缺点和注意事项?    比如从成本,EMI,PCB,纹波,X效率,带负载能力这几个角度    和LDO以及开关电源比起来怎么样?   3.运放 ...…

查看全部问答>

BUCK怎么输出负压?

如图,两个BUCK都是为了获得一个负压输出, 把输出端的输出电压和地进行了对调。   但是下面的电路还将输出的负压连接到输入端原先的地。 上面的图则没有,这是什么原因?   仅仅调换输出端的输出电压和地的位置就 ...…

查看全部问答>

运放反馈电阻值得选取问题

本帖最后由 模拟链新手 于 2022-11-15 19:52 编辑 用opa843仿真时放大 500mVpp,100Mhz方波信号时,用图一所示的电阻能够正常放大,改成图二就会有震荡,有大佬知道为什么吗           …

查看全部问答>

转一篇文章:卷积神经网络CNN完全指南。写的蛮好的。

转自:https://www.toutiao.com/article/7149130033838604834   1】导论 先来说一写题外话... 研究生入学后就被导师逼着学习神经网络,一开始非常盲目,先是在网上搜了一大堆的资料,各种什么“一文读懂卷积神经纹网络&rdquo ...…

查看全部问答>

单片机ADC的采样频率和采样速率是不是同一个概念?采样频率、速率要远远大于被采样...

单片机ADC的采样频率和采样速率是不是同一个概念?采样频率、速率要远远大于被采样的信号频率和速率? …

查看全部问答>

【应用】VR可穿戴式设备是如何让你拥有真实“触觉”的?功率放大器静电吸附制动器驱动

【应用】VR可穿戴式设备是如何让你拥有真实“触觉”的?功率放大器静电吸附制动器驱动   …

查看全部问答>