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网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【笔记】生成报错synthdesignERROR被打赏50分 | |
【STM32H7S78-DK评测】LTDC+DMA2D驱动RGBLCD屏幕被打赏50分 | |
【STM32H7S78-DK评测】Coremark基准测试被打赏50分 | |
【STM32H7S78-DK评测】浮点数计算性能测试被打赏50分 | |
【STM32H7S78-DK评测】Execute in place(XIP)模式学习笔记被打赏50分 | |
每周了解几个硬件知识+buckboost电路(五)被打赏10分 | |
【换取逻辑分析仪】RA8 PMU 模块功能寄存器功能说明被打赏20分 | |
野火启明6M5适配SPI被打赏20分 | |
NUCLEO-U083RC学习历程2-串口输出测试被打赏20分 | |
【笔记】STM32CUBEIDE的Noruletomaketarget编译问题被打赏50分 |