基于f407标准库 进行eeprom配置,pb14sda pb15scl 标准库进行配置 标准库进行配置
时间: 2024-02-24 18:57:49 浏览: 20
好的,针对您的问题,我可以给出以下基于f407标准库的EEPROM配置代码,使用PB14和PB15引脚作为I2C的SDA和SCL线:
```c
#include "stm32f4xx.h"
#include "stm32f4xx_hal.h"
#include "stm32f4xx_hal_i2c.h"
#define EEPROM_ADDR 0xA0 // EEPROM设备地址
#define EEPROM_PAGE_SIZE 8 // EEPROM每页的字节数
I2C_HandleTypeDef hi2c1;
void EEPROM_Init(void)
{
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000;
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLED;
hi2c1.Init.OwnAddress2 = 0;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLED;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLED;
HAL_I2C_Init(&hi2c1);
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_14 | GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
void EEPROM_WriteByte(uint16_t addr, uint8_t data)
{
uint8_t buf[2] = {0};
buf[0] = (uint8_t)(addr >> 8); // 地址高位
buf[1] = (uint8_t)addr; // 地址低位
HAL_I2C_Master_Transmit(&hi2c1, EEPROM_ADDR, buf, 2, 100);
HAL_I2C_Master_Transmit(&hi2c1, EEPROM_ADDR, &data, 1, 100);
HAL_Delay(10);
}
uint8_t EEPROM_ReadByte(uint16_t addr)
{
uint8_t buf[2] = {0};
buf[0] = (uint8_t)(addr >> 8); // 地址高位
buf[1] = (uint8_t)addr; // 地址低位
HAL_I2C_Master_Transmit(&hi2c1, EEPROM_ADDR, buf, 2, 100);
uint8_t data = 0;
HAL_I2C_Master_Receive(&hi2c1, EEPROM_ADDR, &data, 1, 100);
HAL_Delay(10);
return data;
}
```
此代码中,我们首先在EEPROM_Init函数中初始化了I2C和GPIO,然后使用EEPROM_WriteByte和EEPROM_ReadByte函数分别进行写入和读取操作。需要注意的是,在写入数据时,我们首先发送了EEPROM的地址和写入地址,然后再发送要写入的数据。在读取数据时,我们先发送EEPROM地址和读取地址,然后接收数据。
希望这个代码可以帮到您,如果您还有其他问题,请继续提出。