<!-- 本文件由脚本自动转换生成，请勿手动编辑 -->

> **《LKS32MC09x User Manual》EEPROM控制器** . 完整目录见 [README.md](README.md)
>
> **声明**：本文档由芯片用户手册自动转换生成，仅供检索与查阅参考。Markdown 格式可被自由编译、修改，本文档不构成正式技术文件，相关内容以凌鸥创芯官方网站正式发布的手册为准。
>
> 南京凌鸥创芯电子有限公司 . (C) 2023, 版权归凌鸥创芯所有 . 机密文件，未经许可不得扩散

# EEPROM控制器

## 概述

芯片中集成了EEPROM控制器，将EEPROM数据区域映射到地址空间，软件直接读写地址空间，由控制器转换为I2C通讯读写操作，预留了32KB的地址空间。

1.  地址范围是0x40040000至0x40047FFF。
2.  仅支持对EEPROM进行单字节的读写操作，不支持page write以及page read。
3.  通过配置相应寄存器可选择数据地址长度为8bit或者16bit
4.  支持I2C通讯速率可配置
5.  支持EEPROM设备地址可配置
6.  支持SCL/SDA管脚互换
7.  进行EEPROM读写时，可灵活选择软件是否等待读写的I2C传输结束
8.  支持通过DMA搬运EEPROM中的数据

## 功能描述

典型的EEPROM的设备地址如图24-1所示。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图 24 - 1 EEPROM设备地址

典型的EEPROM设备地址高四位固定为1010作为控制码，低三位A2/A1/A0是设备地址引脚。但是本设计中用户可自行配置EEPROM高7位。并且控制器将根据当前的软件操作判断出此时进行的是读操作还是写操作，然后将读写控制信号R/W插入到设备地址的末尾

### 单字节写

8bit数据地址单字节写操作的流程如图24-2所示。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图 24 - 2 8bit数据地址单字节写操作

16bit数据地址单字节写操作的流程如图24-3所示。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图 24 - 4 8bit数据地址单字节读操作

8bit数据地址单字节读操作的流程如图24-5所示

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图 24 - 5 16bit数据地址单字节读操作

在初始化的时候软件端先在配置寄存器中配置好设备地址的高7位，数据地址长度，I2C时钟分频系数以及是否启用管脚切换功能。控制器在进行读操作的时候会先产生一次start信号，随后发送设备地址，此时发送的R/W值为0。然后发送数据地址，同时控制器判断出当前进行的是读操作，并产生第二次start信号，随后第二次发送设备地址，此时发送的R/W值为1，之后控制器得到对应地址的数据。写数据地址时，如果数据地址长度是16bit，会先写高8bit的地址，随后再写入低8位的地址。

### 管脚互换

EEPROM控制器可实现SCL和SDA的管脚功能切换，通过置位配置寄存器中的Switch位，可可以让SCL时钟引脚输出I2C数据，而SDA数据引脚则输出I2C时钟

### 软件等待

EEPROM写操作包含I2C通讯时间和EEPROM存储数据写入时间。I2C写操作的通讯时间通常与I2C通讯时钟速率有关，100KHz/400KHz/1MHz/1.2MHz通常分别为320us/80us/32us/27us，EPPROM存储体写入时间通常为5ms。

EEPROM读操作仅包含I2C通讯时间。I2C读操作的通讯时间通常与I2C通讯时钟速率有关，100KHz/400KHz/1MHz/1.2MHz通常分别为420us/110us/42us/35us

对EEPROM进行写操作，当完成I2C输之后，EEPROM还需要一定的时间将数据存入EEPROM存储体，这段时间称为写周期时间，写周期时间内，若有I2C操作发生，EEPROM对I2C操作会回复NACK，导致EEPROM_CFG.RCV_NACK被置高。写周期时间请参考数据手册。

读写操作的等待时间与EEPROM_CFG.RDY_RLS配置有关。

1.  软件等待I2C传输完成（RDY_RLS =0）

这个模式下，软件直接读取EEPROM地址空间取得数据

1.  写操作

首次写操作，地址和数据写入EEPROM控制器后，软件可以进行其他操作。即软件触发产生I2C访问EEPROM操作后，软件无需等待。但数据实际写入EEPROM存储体需要更长时间。如果软件在第一次写操作的I2C传输没有完成时，接着对EEPROM存储的地址空间进行读写，则会使得软件进入等待，期间软件无法进行其他操作。待当前第一次I2C传输完成之后，EEPROM控制器会自动发起第二次读写操作I2C传输。但是由于第二次的读写操作发生在写周期内，读无效，读取的数据为0；写无效；同时，EEPROM_CFG.RCV_NACK被置高。

1.  读操作

发起读操作之后，I2C通讯期间，软件会进行等待。当数据被读取后，软件结束等待，此时才可以进行其他操作。若在写周期时间内，软件进行了EEPROM的读操作，RCV_NACK将被硬件置1，那么此时读操作无效，读取的结果为0。

因此可以在发起读写操作之后，判断EEPROM_CFG.RCV_NACK是否为高，若不为高，则读写操作有效，若为高，则读写操作无效，用户可以继续发起相同的写操作，直到EEPROM_CFG.RCV_NACK不为高。或者用户需要等待写周期时间结束之后再起发起写操作即可

用户可以通过进行读操作并根据EEPROM_CFG.RCV_NACK是否为高，来确认EEPROM内部的写周期是否完成。

1.  软件不等待读写操作完成（RDY_RLS =1）

在这个模式下，对EEPROM的任何读写操作都不会造成软件的等待，软件在发起EEPROM读写操作之后可以立即进行其他操作，无需等待EEPROM中I2C传输操作的完成。这个模式下，读取EEPROM的数据保存在寄存器EEPROM_RDATA中，需要通过读取EEPROM_RDATA寄存器得到此次读取的数据。

1.  写操作

发起写操作之后，软件不会进行等待，此时软件可以进行其他操作。但此时写操作并未完成。在这个模式下若I2C传输没有完成，EEPROM_CFG.BUSY信号会被拉高，在EEPROM_CFG.BUSY信号为高期间，软件的读写操作将不会被响应。当EEPROM_CFG.BUSY为低时，表示当前没有I2C传输进行，但是对于写操作而言，此时可能还需要一定的时间将数据存入EEPROM，这段时间称为写周期时间。若在写周期时间内，软件进行了EEPROM的读写操作，读操作无效，直接读取EEPROM地址空间得到的数据为0，由于此时的读操作无效，所以寄存器EEPROM_RDATA中的数据不会更新，仍然为前一次读操作的结果值；写无效。同时EEPROM_CFG.RCV_NACK将被硬件置1。

因此进行写操作之前需要先判断EEPROM_CFG.BUSY信号是否为高，为高则不能发起写操作。若不为高，则可以发起写操作，随后再判断EEPROM_CFG.RCV_NACK是否为高。若为高则写操作无效，需要过一段时间后，再次对相同地址发起上述相同的写操作。若不为高，则当前写操作有效。

1.  读操作

发起读操作之后，软件不会进行等待，此时软件可以对其他外设进行操作。但此时读操作并未完成，在这个模式下若I2C传输没有完成，EEPROM_CFG.BUSY信号会被拉高。在EEPROM_CFG.BUSY信号为高期间，软件的读写操作将不会被响应。当EEPROM_CFG.BUSY不为高时，只能此时表示没有进行I2C传输，并不表明数据被完全写入EEPROM存储体或者数据已经从EEPROM存储体中被读出。若I2C传输已完成，但是在写周期时间内，软件进行了EEPROM的读操作，EEPROM_CFG.RCV_NACK将被硬件置1，此时读操作无效，直接读取EEPROM地址空间得到的数据为0。由于此时的读操作无效，所以寄存器EEPROM_RDATA中的数据不会更新，仍然为前一次读操作的结果值。

若读操作没有发生在写周期时间内，且EEPROM_CFG.BUSY不为高，那么当前的读操作是有效的，可以读取寄存器EEPROM_RDATA获得此次读操作的结果值。

### DMA搬运

软件使用DMA搬运EEPROM存储体中的数据，相当于DMA对EEPROM发起读操作，先进行I2C传输，传输完成之后获得数据，再将数据搬运至目的地址。因此使用DMA搬运EEPROM存储体中的数据的时候，不可以使能EEPROM_CFG.RDY_RLS，否则会导致I2C传输还未完成时，DMA就将错误的数据搬运至目的地址中。

## 寄存器

### 地址分配

EEPROM控制器的基地址是0x40040000，地址0x40040000-0x40047FFF为EEPROM数据的映射地址，预留了32KB的地址空间。在EEPROM_CFG.RDY_RLS
=1时，对EEPROM进行读取.得到的结果被保留在寄存器EEPROM_RDATA中。

表 24 - 1EEPROM控制器寄存器地址分配

||||
|---|---|---|
|名称|偏移|描述|
|EEPROM_CFG|0x8000|EEPROM控制器配置寄存器|
|EEPROM_RDATA|0x8004|EEPROM数据寄存器|

### EEPROM_CFG EEPROM控制器配置寄存器

地址: 0x40048000

复位值:0x0

表 24 - 2配置寄存器

||||
|---|---|---|
|位置|名称|说明|
|\[31:18\]|Reserved|保留|
|\[17\]|BUSY|I2C传输繁忙信号，这个信号只有在使能RDY_RLS信号时，才会有效。不使能RDY_RLS时，BUSY一直为0。1:表明此时正在进行I2C传输0:表明此时没有进行I2C传输|
|\[16\]|RDY_RLS|软件等待选择信号1:进行eeprom读写时不会造成软件等待，可以对其他外设进行操作。0:进行eeprom读写时会造成软件等待，无法对其他外设进行操作。用户可以通过将RDY_RLS置1与否来选择当进行EEPROM读写时是否可以对其他外设进行操作。|
|\[15:12\]|STATE|I2C传输状态0:IDLE状态。I2C处于空闲状态，没有进行传输。1:START1状态。产生I2C传输的start信号。2:SEND_D_ADDR状态。发送设备地址。3:ACK1状态。EEPROM颗粒对设备地址回复应答信号。4:SEND_B_ADDR_H状态。发送数据地址的高8位。5:ACK2状态。EEPROM颗粒对接收到的数据地址高8位回复应答信号6:SEND_B_ADDR_L状态。发送数据地址的低8位。7:ACK3状态。EEPROM颗粒对接收到的数据地址低8位回复应答信号8:WR_DATA状态。往目的数据地址写入数据。9:ACK4状态。EEPROM颗粒对写入的数据回复应答信号。10:START2状态。读操作下产生第二次start信号。11:SEND_RD_ADDR状态。读操作下第二次发送设备地址。12:ACK5状态。EEPROM颗粒对第二次接收到的设备地址回复应答信号。13:RD_DATA状态。读取EEPROM颗粒对应数据地址的数据。14:NACK状态。EEPROM控制器对读取的数据回复NACK。15:STOP状态。I2C传输结束。当出现I2C传输卡住的情况，如未接受到正确的应答信号，I2C的传输会卡住，此时可以复位通过将SYS_SFT_RST的EEPROM_SFT_RST置位来复位EEPROM模块，以达到复位I2C传输状态的目的，复位后I2C状态机处于IDLE状态。随后将SYS_SFT_RST的EEPROM_SFT_RST清零释放EEPROM模块，重新配置EEPROM_CFG寄存器，启动新一轮的I2C传输。|
|\[11\]|RCV_NACK|接收到NACK信号1:接收到NACK信号0:没有接收到NACK信号当接收到NACK信号时，I2C传输的状态机会复位，并且当前的读写操作无效。需要再次发起读写操作。如果对EEPROM进行读操作时，接收到了NACK，则表明此次的读操作是无效的，并且读取到结果为0|
|\[10\]|SWITCH|管脚功能切换0:SCL输出I2C时钟,SDA输出I2C数据1:SCL输出I2C数据，SDA输出I2C时钟|
|\[9\]|ADDR_LENTH|数据地址长度选择信号0:数据地址长度为8位1:数据地址长度位16位|
|\[8:2\]|DEVICE_ADDR|设备地址的高7位，R/W位由控制器自动生成。|
|\[1:0\]|CLK_DIV|I2C SCL时钟频率选择，I2C时钟通常不超过1MHz速率，具体请参考DATASHEET00:100KHz01:400KHz10:1MHz11:1.2MHz|

### EEPROM_RDATA EEPROM数据寄存器

地址: 0x40048004

复位值:0x0

||||
|---|---|---|
|位置|名称|说明|
|\[31:8\]|Reserved|保留|
|\[7:0\]|RDATA|RDT_RLS为1时，软件直接读取EEPROM地址空间，得到的数据保留在EEPROM_RDATA寄存器中。若RDY_RLS为0，软件直接读取EEPROM地址空间便可取得数据，不用再读取EEPROM_RDATA寄存器。|

