- /* 初始化IIC引脚 */
- static void bsp_iic_gpio_init(void)
- {
- GPIO_Config_T gpioConfig;
-
- RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOB);
- RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SYSCFG);
- GPIO_ConfigStructInit(&gpioConfig);
-
- /*
- * SCL -> PB6
- * SDA -> PB7
- */
- GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_6, GPIO_AF_PIN1);
- GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_7, GPIO_AF_PIN1);
-
- gpioConfig.pin = GPIO_PIN_6;
- gpioConfig.mode = GPIO_MODE_AF;
- gpioConfig.outtype = GPIO_OUT_TYPE_OD;
- gpioConfig.speed = GPIO_SPEED_50MHz;
- gpioConfig.pupd = GPIO_PUPD_NO;
- GPIO_Config(GPIOB, &gpioConfig);
- gpioConfig.pin = GPIO_PIN_7;
- GPIO_Config(GPIOB, &gpioConfig);
- }
- /* 初始化IIC */
- void bsp_iic_init(void)
- {
- I2C_Config_T i2cConfig;
-
- RCM_ConfigI2CCLK(RCM_I2C1CLK_SYSCLK);
- RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_I2C1);
- bsp_iic_gpio_init();
-
- I2C_Reset(I2C1);
- I2C_ConfigStructInit(&i2cConfig);
- i2cConfig.timing = 0x80220707; /* 400KHz */
- i2cConfig.address1 = 0xA0;
- i2cConfig.mode = I2C_MODE_I2C;
- i2cConfig.analogfilter = I2C_ANALOG_FILTER_ENABLE;
- i2cConfig.digitalfilter = I2C_DIGITAL_FILTER_0;
- i2cConfig.ack = I2C_ACK_ENABLE;
- i2cConfig.ackaddress = I2C_ACK_ADDRESS_7BIT;
- I2C_Config(I2C1, &i2cConfig);
- I2C_Enable(I2C1);
-
- GPIO_SetBit(GPIOB, GPIO_PIN_8);
- GPIO_SetBit(GPIOB, GPIO_PIN_9);
- }
EEPROM驱动代码如下:
- /* 最大容量 1KB */
- #define AT24C08_MAX_CAPACITY ((uint32_t)0x400)
- /* 单页大小 */
- #define AT24C08_PAGE_SIZE ((uint8_t)16)
- /* 设备地址 */
- #define AT24C08_DEV_ADDR ((uint8_t)0xA0)
- /* 超时 */
- #define I2CT_TIMEOUT ((uint32_t)0xFF000)
- /*
- * @brief 延时
- *
- * @param None
- *
- * @retval None
- *
- */
- static void bsp_delay(void)
- {
- volatile uint32_t ms = 0x3FFF; /* 2.5ms */
- while (--ms);
- }
- /*
- * @brief 写数据
- *
- * @param addr: 存储地址
- * buf: 数据缓存
- * size: 数据大小
- *
- * @retval None
- *
- */
- uint16_t bsp_at24c08_write(uint16_t addr, uint8_t *buf, uint16_t size)
- {
- uint16_t write_bytes = 0;
- uint32_t iic_timeout = I2CT_TIMEOUT;
- uint8_t dev_addr = AT24C08_DEV_ADDR; /* 设备地址 */
- uint8_t mem_addr = addr; /* 存储地址 */
- uint16_t write_index = 0;
- uint8_t current_page_write_size = 0; /* 当前页写大小 */
-
- /* 入参检查 */
- if ((addr >= AT24C08_MAX_CAPACITY) || (size == 0) || ((addr + size) > AT24C08_MAX_CAPACITY)) {
- return write_bytes;
- }
-
- do {
- /* 计算地址 */
- dev_addr = AT24C08_DEV_ADDR + (((addr / AT24C08_PAGE_SIZE) >> 4) << 1);
- mem_addr = (addr % AT24C08_PAGE_SIZE) + (((addr / AT24C08_PAGE_SIZE) & 0x0F) << 4);
- current_page_write_size = AT24C08_PAGE_SIZE - (addr % AT24C08_PAGE_SIZE);
- current_page_write_size = (current_page_write_size <= (size - write_bytes)) ? current_page_write_size : (size - write_bytes);
- write_index = 0;
-
- /* 等待IIC空闲 */
- iic_timeout = I2CT_TIMEOUT;
- while (I2C_ReadStatusFlag(I2C1, I2C_FLAG_BUSY) == SET) {
- if ((iic_timeout--) == 0) {
- I2C_EnableGenerateStop(I2C1);
- return write_bytes;
- }
- }
-
- /* 发送起始位和设备地址 */
- I2C_HandlingTransfer(I2C1, dev_addr, 1, I2C_RELOAD_MODE_RELOAD, I2C_GENERATE_START_WRITE);
- iic_timeout = I2CT_TIMEOUT;
- while (I2C_ReadStatusFlag(I2C1, I2C_FLAG_TXBE) == RESET) {
- if ((iic_timeout--) == 0) {
- I2C_EnableGenerateStop(I2C1);
- return write_bytes;
- }
- }
-
- /* 发送存储地址 */
- I2C_TxData(I2C1, mem_addr);
- iic_timeout = I2CT_TIMEOUT;
- while (I2C_ReadStatusFlag(I2C1, I2C_FLAG_TCRF) == RESET) {
- if ((iic_timeout--) == 0) {
- I2C_EnableGenerateStop(I2C1);
- return write_bytes;
- }
- }
-
- /* 配置写入的数据数量 */
- I2C_HandlingTransfer(I2C1, dev_addr, current_page_write_size, I2C_RELOAD_MODE_AUTOEND, I2C_GENERATE_NO_STARTSTOP);
- I2C_ClearStatusFlag(I2C1, I2C_FLAG_TCRF);
- iic_timeout = I2CT_TIMEOUT;
- while (I2C_ReadStatusFlag(I2C1, I2C_FLAG_TXBE) == RESET) {
- if ((iic_timeout--) == 0) {
- I2C_EnableGenerateStop(I2C1);
- return write_bytes;
- }
- }
-
- /* 写数据 */
- while (write_index++ < current_page_write_size) {
- I2C_TxData(I2C1, buf[write_bytes]);
- iic_timeout = I2CT_TIMEOUT;
- while (I2C_ReadStatusFlag(I2C1, I2C_FLAG_TXBE) == RESET) {
- if ((iic_timeout--) == 0) {
- I2C_EnableGenerateStop(I2C1);
- return write_bytes;
- }
- }
- write_bytes++;
- }
-
- /* 等待结束 */
- iic_timeout = I2CT_TIMEOUT;
- while (I2C_ReadStatusFlag(I2C1, I2C_FLAG_STOP) == RESET) {
- if ((iic_timeout--) == 0) {
- I2C_EnableGenerateStop(I2C1);
- return write_bytes;
- }
- }
- I2C_ClearStatusFlag(I2C1, I2C_FLAG_STOP);
- addr += current_page_write_size;
- bsp_delay(); /* 等待存储完成,否则异常 */
- } while (write_bytes < size);
-
- return write_bytes;
- }
- /*
- * @brief 读数据
- *
- * @param addr: 存储地址
- * buf: 数据缓存
- * size: 数据大小
- *
- * @retval None
- *
- */
- uint16_t bsp_at24c08_read(uint16_t addr, uint8_t *buf, uint16_t size)
- {
- uint16_t read_bytes = 0;
- uint32_t iic_timeout = I2CT_TIMEOUT;
- uint8_t dev_addr = AT24C08_DEV_ADDR; /* 设备地址 */
- uint8_t mem_addr = addr; /* 存储地址 */
- uint16_t read_index = 0;
- uint16_t current_page_read_size = 0; /* 当前页读大小 */
-
- /* 入参检查 */
- if ((addr >= AT24C08_MAX_CAPACITY) || (size == 0) || ((addr + size) > AT24C08_MAX_CAPACITY)) {
- return read_bytes;
- }
-
- do {
- /* 计算地址 */
- dev_addr = AT24C08_DEV_ADDR + (((addr / AT24C08_PAGE_SIZE) >> 4) << 1);
- mem_addr = (addr % AT24C08_PAGE_SIZE) + (((addr / AT24C08_PAGE_SIZE) & 0x0F) << 4);
- current_page_read_size = AT24C08_PAGE_SIZE - (addr % AT24C08_PAGE_SIZE);
- current_page_read_size = 255; /* 寄存器只有8bit,限制单次最多255个字节 */
- current_page_read_size = (current_page_read_size <= (size - read_bytes)) ? current_page_read_size : (size - read_bytes);
- read_index = 0;
-
- /* 等待IIC空闲 */
- iic_timeout = I2CT_TIMEOUT;
- while (I2C_ReadStatusFlag(I2C1, I2C_FLAG_BUSY) == SET) {
- if ((iic_timeout--) == 0) {
- I2C_EnableGenerateStop(I2C1);
- return read_bytes;
- }
- }
-
- /* 发送起始位和写设备地址 */
- I2C_HandlingTransfer(I2C1, dev_addr, 1, I2C_RELOAD_MODE_AUTOEND, I2C_GENERATE_START_WRITE);
- iic_timeout = I2CT_TIMEOUT;
- while (I2C_ReadStatusFlag(I2C1, I2C_FLAG_TXBE) == RESET) {
- if ((iic_timeout--) == 0) {
- I2C_EnableGenerateStop(I2C1);
- return read_bytes;
- }
- }
-
- /* 发送地址 */
- I2C_TxData(I2C1, mem_addr);
- iic_timeout = I2CT_TIMEOUT;
- while (I2C_ReadStatusFlag(I2C1, I2C_FLAG_TXBE) == RESET) {
- if ((iic_timeout--) == 0) {
- I2C_EnableGenerateStop(I2C1);
- return read_bytes;
- }
- }
-
- /* 等待结束 */
- iic_timeout = I2CT_TIMEOUT;
- while (I2C_ReadStatusFlag(I2C1, I2C_FLAG_STOP) == RESET) {
- if ((iic_timeout--) == 0) {
- I2C_EnableGenerateStop(I2C1);
- return read_bytes;
- }
- }
- I2C_ClearStatusFlag(I2C1, I2C_FLAG_STOP);
-
- /* 发送起始位和读设备地址 */
- I2C_HandlingTransfer(I2C1, dev_addr, current_page_read_size, I2C_RELOAD_MODE_AUTOEND, I2C_GENERATE_START_READ);
- iic_timeout = I2CT_TIMEOUT;
- while (I2C_ReadStatusFlag(I2C1, I2C_FLAG_TXBE) == RESET) {
- if ((iic_timeout--) == 0) {
- I2C_EnableGenerateStop(I2C1);
- return read_bytes;
- }
- }
-
- /* 读数据 */
- while (read_index++ < current_page_read_size) {
- iic_timeout = I2CT_TIMEOUT;
- while (I2C_ReadStatusFlag(I2C1, I2C_FLAG_RXBNE) == RESET) {
- if ((iic_timeout--) == 0) {
- I2C_EnableGenerateStop(I2C1);
- return read_bytes;
- }
- }
- buf[read_bytes++] = I2C_RxData(I2C1);
- }
-
- /* 等待结束 */
- iic_timeout = I2CT_TIMEOUT;
- while (I2C_ReadStatusFlag(I2C1, I2C_FLAG_STOP) == RESET) {
- if ((iic_timeout--) == 0) {
- I2C_EnableGenerateStop(I2C1);
- return read_bytes;
- }
- }
- I2C_ClearStatusFlag(I2C1, I2C_FLAG_STOP);
- addr += current_page_read_size;
- } while (read_bytes < size);
-
- return read_bytes;
- }
测试代码如下:
- uint8_t w_buf[1024];
- uint8_t r_buf[1024];
- int8_t result = -1;
- // 应用初始化
- void app_init(void)
- {
- /* 硬件IIC */
- bsp_iic_init();
- for (uint16_t i = 0; i < sizeof(w_buf); i++) {
- w_buf[i] = 10 + i;
- }
- bsp_at24c08_write(0, w_buf, sizeof(w_buf));
- bsp_at24c08_read(0, r_buf, sizeof(r_buf));
-
- result = memcmp(w_buf, r_buf, sizeof(w_buf));
- }
- // 应用任务
- void app_task(void)
- {
- }
详细代码,请查看附件:
AT24C08_Hardware.zip
(2 MB, 下载次数: 1)