历史上的今天
今天是: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);
}
上一篇:STM32—USART
史海拾趣
|
【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都是为了获得一个负压输出, 把输出端的输出电压和地进行了对调。 但是下面的电路还将输出的负压连接到输入端原先的地。 上面的图则没有,这是什么原因? 仅仅调换输出端的输出电压和地的位置就 ...… 查看全部问答> |
|
本帖最后由 模拟链新手 于 2022-11-15 19:52 编辑 用opa843仿真时放大 500mVpp,100Mhz方波信号时,用图一所示的电阻能够正常放大,改成图二就会有震荡,有大佬知道为什么吗 … 查看全部问答> |
|
转自:https://www.toutiao.com/article/7149130033838604834 1】导论 先来说一写题外话... 研究生入学后就被导师逼着学习神经网络,一开始非常盲目,先是在网上搜了一大堆的资料,各种什么“一文读懂卷积神经纹网络&rdquo ...… 查看全部问答> |
|
单片机ADC的采样频率和采样速率是不是同一个概念?采样频率、速率要远远大于被采样... 单片机ADC的采样频率和采样速率是不是同一个概念?采样频率、速率要远远大于被采样的信号频率和速率? … 查看全部问答> |




