BUG查找中
LCD初始化之后,EEPROM就不好是了。。。。
我说我的代码没问题啊!
还不小心把SMBUS给初始化了,这样EEPROM悲剧地只读了。
同时,还有一个问题出来了。
前两天一直OS和HUI,添加了太多的代码。
以至于现在编译一次都很费劲。于是决定还是先裸奔吧,至少吧UCGUI干掉先不用。硬件驱动起来,赚点分再弄GUI






120楼
IIC EEPROM 记录开机次数
每次开机时候,从EEPROM中读出一个数值加一之后再写入原地址。
这样可以记录板子复位次数。不是很准,也凑合了。
使用之前需要一个初始化,在EEPROM中要使用的地址上写入00。
我一直难以理解IIC这个总线,代码是抄的。
调试时候的注意事项:
我调试的时候,改变了几次I2C_Ack_Disable/Enable这个东西。
当改成ENABLE的时候,CMU会一直等待ACK。可能是24C02 EEPROM把哪个线拉底了,CMU一直无法获取总线的控制权。复位的时候,24C02不会自动复位。
之后,即使你烧写进去对的程序的时候也读不出来数据。
板子断电再上电,可以解决这个问题。
IIC初始化代码:
//时钟&引脚初始化
void EEPROM_LowLevel_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
/*!< I2C Periph clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
/*!<I2C_SCL_GPIO_CLK, I2C_SDA_GPIO_CLK Periph clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //SMB、SCL、SDA都在GPIOB上
/*!< Configure SCL(PB6) & SDA(PB7)*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
//IIC初始化
void EEPROM_Init()
{
I2C_InitTypeDef I2C_InitStructure;
EEPROM_LowLevel_Init();
I2C_DeInit(I2C1);
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0x00;
I2C_InitStructure.I2C_Ack = I2C_Ack_Disable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 100000;
I2C_Init(I2C1, &I2C_InitStructure);
I2C_Cmd(I2C1,ENABLE);
}
至于别的读写,我还不是很理解 就不贴出来找抽了
惯例,图:
每次开机时候,从EEPROM中读出一个数值加一之后再写入原地址。
这样可以记录板子复位次数。不是很准,也凑合了。
使用之前需要一个初始化,在EEPROM中要使用的地址上写入00。
我一直难以理解IIC这个总线,代码是抄的。
调试时候的注意事项:
我调试的时候,改变了几次I2C_Ack_Disable/Enable这个东西。
当改成ENABLE的时候,CMU会一直等待ACK。可能是24C02 EEPROM把哪个线拉底了,CMU一直无法获取总线的控制权。复位的时候,24C02不会自动复位。
之后,即使你烧写进去对的程序的时候也读不出来数据。
板子断电再上电,可以解决这个问题。
IIC初始化代码:
//时钟&引脚初始化
void EEPROM_LowLevel_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
/*!< I2C Periph clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
/*!<I2C_SCL_GPIO_CLK, I2C_SDA_GPIO_CLK Periph clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //SMB、SCL、SDA都在GPIOB上
/*!< Configure SCL(PB6) & SDA(PB7)*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
//IIC初始化
void EEPROM_Init()
{
I2C_InitTypeDef I2C_InitStructure;
EEPROM_LowLevel_Init();
I2C_DeInit(I2C1);
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0x00;
I2C_InitStructure.I2C_Ack = I2C_Ack_Disable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 100000;
I2C_Init(I2C1, &I2C_InitStructure);
I2C_Cmd(I2C1,ENABLE);
}
至于别的读写,我还不是很理解 就不贴出来找抽了
惯例,图:

回复
有奖活动 | |
---|---|
【EEPW电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【我踩过的那些坑】电感选型错误导致的处理器连接不上被打赏50分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏10分 | |
【我踩过的那些坑】DRC使用位置错误导致的问题被打赏100分 | |
我踩过的那些坑之混合OTL功放与落地音箱被打赏50分 | |
汽车电子中巡航控制系统的使用被打赏10分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏100分 | |
分享汽车电子中巡航控制系统知识被打赏10分 | |
分享安全气囊系统的检修注意事项被打赏10分 | |
分享电子控制安全气囊计算机知识点被打赏10分 | |
【分享开发笔记,赚取电动螺丝刀】【OZONE】使用方法总结被打赏20分 |