#include "eeprom_lc02b.h" #include "delay.h" #define W_ADD_COM 0xa8 // 写字节命令及器件地址(根据地址实际情况改变), 1010 A2 A1 A0 0 #define R_ADD_COM 0xa9 // 读命令字节及器件地址(根据地址实际情况改变), 1010 A2 A1 A0 1 #define PAGE_SIZE 8U #define SIZE 256U #define EEPROM_LC02B_SDA_PORT I2C1_SDA_GPIO_Port #define EEPROM_LC02B_SDA_PIN I2C1_SDA_Pin #define EEPROM_LC02B_SCL_PORT I2C1_SCL_GPIO_Port #define EEPROM_LC02B_SCL_PIN I2C1_SCL_Pin static i2c_t *eeprom_24lc028bt_i2c; void eeprom_lc02b_test(void) { #define TEST_SIZE 15 uint16_t test_address = SIZE - TEST_SIZE; uint8_t buf[TEST_SIZE]; for (uint8_t i = 0; i < TEST_SIZE; i++) { buf[i] = i + 1; } eeprom_lc02b_write(test_address, buf, TEST_SIZE); LL_mDelay(10); osel_memset(buf, 0, ARRAY_LEN(buf)); eeprom_lc02b_read(test_address, buf, TEST_SIZE); __NOP(); } /** * @brief 获取EEPROM LC02B的状态 * * 此函数用于获取EEPROM LC02B的当前状态。 * * @return 如果EEPROM LC02B处于正常状态,则返回TRUE;否则返回FALSE。 * 注意:在本实现中,总是返回TRUE,因为这是一个简单的示例函数。 */ BOOL eeprom_lc02b_status_get(void) { return TRUE; } /** * @brief EEPROM LC02B初始化 * @return {*} * @note */ void eeprom_lc02b_init(void) { i2c_gpio_group_t gpios; gpios.scl = gpio_create(EEPROM_LC02B_SCL_PORT, EEPROM_LC02B_SCL_PIN); gpios.sda = gpio_create(EEPROM_LC02B_SDA_PORT, EEPROM_LC02B_SDA_PIN); eeprom_24lc028bt_i2c = i2c_create(gpios, 10); // eeprom_lc02b_test(); } /** * @brief EEPROM LC02B反初始化 * @return {*} * @note */ void eeprom_lc02b_dinit(void) { GPIO_SET_ANALOG(EEPROM_LC02B_SDA_PORT, EEPROM_LC02B_SDA_PIN); GPIO_SET_ANALOG(EEPROM_LC02B_SCL_PORT, EEPROM_LC02B_SCL_PIN); } /** * @brief 写入数据 * @param {uint32_t} write_addr * @param {uint8_t} *data * @param {uint16_t} length * @return {*} * @note */ void eeprom_lc02b_write(uint32_t write_addr, uint8_t *data, uint16_t length) { // 发送开始信号 eeprom_24lc028bt_i2c->interface.start(eeprom_24lc028bt_i2c); // 发送写入地址命令 eeprom_24lc028bt_i2c->interface.write_byte(eeprom_24lc028bt_i2c, W_ADD_COM); // 等待写入地址命令响应 eeprom_24lc028bt_i2c->interface.wait_ack(eeprom_24lc028bt_i2c); // 发送要写入的地址 eeprom_24lc028bt_i2c->interface.write_byte(eeprom_24lc028bt_i2c, (uint8_t)write_addr); eeprom_24lc028bt_i2c->interface.wait_ack(eeprom_24lc028bt_i2c); // 循环写入数据 for (uint16_t i = 0; i < length; i++) { // 写入一个字节数据 eeprom_24lc028bt_i2c->interface.write_byte(eeprom_24lc028bt_i2c, *data++); // 等待响应 eeprom_24lc028bt_i2c->interface.wait_ack(eeprom_24lc028bt_i2c); write_addr++; if (write_addr % PAGE_SIZE == 0) { eeprom_24lc028bt_i2c->interface.stop(eeprom_24lc028bt_i2c); LL_mDelay(10); // 延时10ms,等待写入完成 eeprom_24lc028bt_i2c->interface.start(eeprom_24lc028bt_i2c); eeprom_24lc028bt_i2c->interface.write_byte(eeprom_24lc028bt_i2c, W_ADD_COM); eeprom_24lc028bt_i2c->interface.wait_ack(eeprom_24lc028bt_i2c); eeprom_24lc028bt_i2c->interface.write_byte(eeprom_24lc028bt_i2c, (uint8_t)write_addr); eeprom_24lc028bt_i2c->interface.wait_ack(eeprom_24lc028bt_i2c); } } // 写入完成,停止I2C总线 eeprom_24lc028bt_i2c->interface.stop(eeprom_24lc028bt_i2c); } /** * @brief 读取数据 * @param {uint32_t} read_addr * @param {uint8_t} *data * @param {uint16_t} length * @return {*} * @note */ void eeprom_lc02b_read(uint32_t read_addr, uint8_t *data, uint16_t length) { // 发送开始信号 eeprom_24lc028bt_i2c->interface.start(eeprom_24lc028bt_i2c); // 发送写入地址命令 eeprom_24lc028bt_i2c->interface.write_byte(eeprom_24lc028bt_i2c, W_ADD_COM); // 等待写入地址命令响应 eeprom_24lc028bt_i2c->interface.wait_ack(eeprom_24lc028bt_i2c); // 发送要读取的地址 eeprom_24lc028bt_i2c->interface.write_byte(eeprom_24lc028bt_i2c, (uint8_t)read_addr); eeprom_24lc028bt_i2c->interface.wait_ack(eeprom_24lc028bt_i2c); // 发送开始信号 eeprom_24lc028bt_i2c->interface.start(eeprom_24lc028bt_i2c); // 发送读取地址命令 eeprom_24lc028bt_i2c->interface.write_byte(eeprom_24lc028bt_i2c, R_ADD_COM); // 等待读取地址命令响应 eeprom_24lc028bt_i2c->interface.wait_ack(eeprom_24lc028bt_i2c); // 循环读取数据 for (uint16_t i = 0; i < length - 1; i++) { // 读取一个字节数据 *data++ = eeprom_24lc028bt_i2c->interface.read_byte(eeprom_24lc028bt_i2c, TRUE); } *data++ = eeprom_24lc028bt_i2c->interface.read_byte(eeprom_24lc028bt_i2c, FALSE); // 停止I2C总线 eeprom_24lc028bt_i2c->interface.stop(eeprom_24lc028bt_i2c); }