请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

EE在STM32F407中的应用

[复制链接]
废鱼 发布时间:2021-6-28 11:07
   在我们日常开发过程中,常用到EEPROM作为数据存储。今天我以AT24C32为例,给大家接一下EEPROM的使用。1、在我们编写代码前,需要先确定EEPROM的连接STM32的I2C接口。
2、我们需要确定EEPROM的设备地址,在技术手册中找到Device Address,如下图所示。我们介绍使用A2 A1 A0均连接到GND。因此我们使用的Device Address为0xA0。R/W这一位由我们操作I2C读写时再填入。 1.png
3、确定EEPROM的内部地址访问规则,如下图所示,AT24C32的访问地址为16位,我们在发送start信号以后,需要连续写入两个字节的地址,再进行后续操作。需要确定2字节的内容存储的格式:AT24C32的页最大容量为32byte,bit0-4用来存写入页内地址,bit5-11填写页地址。比如访问AT24C32的地址为:35,输入页地址为addr=35%32 | ((uint16_t)(35/32)<<5)。换算后的结果为0x0023。
2.png
4、EEPROM写时序如下图,通过时序图我们确定写入是,需要先写入硬件地址0xA0,再写入两字节页内地址,后面写入的是数据内容。注意数据内容长度要小于等于32-页内起始地址。
3.png
5、EEPROM读时序如下图,通过时序图我们发现,读写操作是不一样的。读操作需要先写入设备地址,两字节页地址后,需要重新发送一个读取的start信号,然后就可以读取数据了。读数据时不需要考虑读的长度,但也不能超出EEPROM的范围。
4.png
6、结合上面的介绍,我们来看一下EEPROM的代码操作。首先我们需要对I2C进行初始化,初始化时需要考虑I2C的复用功能,407和103的使用方法不同,需要注意。我们以407为例,代码初始化如下所示:       /* Peripheral clock enable */
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);

        /**I2C2 GPIO Configuration
         PB8     ------> I2C1_SCL
         PB9     ------> I2C1_SDA
         */
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
        GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_I2C1);
        GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_I2C1);

        /*!< Configure I2C2 pins: SCL,SDA */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_Init(GPIOB, &GPIO_InitStructure);

        Std_NVIC_SetPriority(I2C1_EV_IRQn, 0, 0);
        Std_NVIC_SetPriority(I2C1_ER_IRQn, 0, 0);7、读操作代码

        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
        
        I2C_GenerateSTART(I2C1, ENABLE);
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); //EV5
        
        I2C_Send7bitAddress(I2C1, addr_dev, I2C_Direction_Transmitter);
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); //EV6

        I2C_SendData(I2C1,addr>>8]);
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTING));//EV8
        
        I2C_SendData(I2C1, addr);
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BTF) == RESET);//EV8
        
        I2C_GenerateSTART(I2C1, ENABLE);
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); //EV5
        
        I2C_Send7bitAddress(I2C1, addr_dev|0x01, I2C_Direction_Receiver);
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));//EV6

        while(Num --> 1)
        {
                while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BTF) == RESET);
                *pBuffer++ = I2C_ReceiveData(I2C1);
        }
                I2C_AcknowledgeConfig(I2C1, DISABLE);
                I2C_GenerateSTOP(I2C1, ENABLE);
                while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BTF) == RESET);
                *pBuffer++ = I2C_ReceiveData(I2C1);

8、写操作代码


        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));

        I2C_GenerateSTART(I2C1, ENABLE);
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); //EV5

        I2C_Send7bitAddress(I2C1, addr_dev, I2C_Direction_Transmitter);
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); //EV6
        (void)I2C1->SR1;//EV6

        I2C_SendData(I2C1, addr>>8]);         //EV8-1
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTING)); //EV8

        I2C_SendData(I2C1, addr);
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTING)); //EV8

        while(Num-->0)
        {
                I2C_SendData(I2C1,*pBuffer++);
                while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTING)); //EV8
        }
        I2C_GenerateSTOP(I2C1,ENABLE);
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //EV8-2








收藏 评论0 发布时间:2021-6-28 11:07

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版