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

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

# I2C

## 概述

I2C总线接口连接微控制器和串行I2C总线。它提供多主机功能，控制所有I2C总线特定的时序、协议、仲裁和定时。支持标准和快速两种模式。

## 主要特性

- 多主机功能：该模块既可做主设备也可做从设备。

I2C主设备功能：产生时钟、START和STOP事件。

I2C从设备功能：可编程的I2C硬件地址比较（仅支持7位硬件地址）、停止位检测。

- 根据系统分频，实现不同的通讯速度。
- 状态标志：发送器/接收器模式标志、字节发送结束标志、I2C总线忙标志。
- 错误标志：主模式时的仲裁丢失、地址/数据传输后的应答(ACK)错误、检测到错位的起始或停止条件。
- 一个中断向量，包含五个中断源：总线错误中断源、完成中断源、NACK中断源、硬件地址匹配中断源和传输完成中断源。

## 功能描述

### 功能框图

本接口采用同步串行设计，实现MCU同外部设备之间的I2C传输。支持轮询和中断方式获得传输状态信息。本接口的主要功能模块如下图所示。

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

图18-1 I2C模块顶层功能框图

I2C接口同外界通讯只有SCL和SDA两根信号线。SDA为双向复用信号线，受到sda_oe控制。模块级，I2C接口信号包括，scl_i，sda_i，scl_o，sda_o和sda_oe。

scl_i：时钟信号。当I2C接口配置为从模式时，此为I2C总线的时钟输入信号。

sda_i：数据信号。当I2C接口接收数据时（无论主模式还是从模式），此为I2C总线的数据输入信号。

scl_o：时钟信号。当I2C接口配置为主模式时，此为I2C总线的时钟输出信号。

sda_o：数据信号。当I2C接口发送数据时（无论主模式还是从模式），此为I2C总线的数据输出信号。

sda_oe：数据使能信号。当sda_o输出时，sda_oe有效；当sda_i输入时，sda_oe无效。

### 功能说明

I2C模块接收和发送数据，并将数据从串行转换成并行，或并行转换成串行。可以开启或禁止中断。接口通过数据引脚(SDA)和时钟引脚(SCL)连接到I2C总线。

#### 模式选择

接口可以下述4种模式中的一种运行：

- 从发送模式
- 从接收模式
- 主发送模式
- 主接收模式

I2C接口默认主从均不使能。接口根据配置情况，进入主模式或者从模式。当仲裁丢失或产生停止信号时，主模式自动释放总线并产生相应异常中断。允许多主机功能。

主模式时，I2C接口启动数据传输并产生时钟信号。串行数据传输总是以起始条件开始并以停止条件结束。起始条件和停止条件都是在主模式下由软件控制产生。

从模式时，I2C接口能识别它自己的地址(7位)。软件能够控制开启或禁止硬件地址比较功能，硬件地址比较功能可降低MCU的负担。只有地址匹配才通知MCU进行相关处理。

数据和地址按8位/字节进行传输，高位在前。跟在起始条件后的1个字节是地址。地址只在主模式发送。

在一个字节传输的8个时钟后的第9个时钟期间，接收器必须回送一个应答位(ACK)给发送器。

软件可以开启或禁止应答(ACK)，并可以设置I2C接口的地址。

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

图18-2基本I2C传输时序图

一般情况下，一次传输一个字节（可反复单次传输，需软件介入提供数据）。上述所有模式，遵循如下基本原则：

- 单字节发送，中断将在8-bit数据发送完毕且收到响应后（ACK/NACK均可）产生。
- 单字节接收，中断将在8-bit数据接收完毕后产生。
- 当I2C接口配置为主模式时，检测到错误后，I2C接口会主动释放总线，恢复到起始状态并产生中断信号。

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

图18-3 I2C传输模式决策与执行流程图

#### 从模式

默认情况下，I2C接口主模式和从模式均关闭。若工作在从模式，需使能从模式。为了产生正确的时序，必须在系统寄存器CLK_DIV0中设定I2C接口的工作时钟。

- 从模式下，I2C接口时刻在监控总线上的信号。一旦检测到起始条件，其将保存地址位数据和读写位数据。
- 从模式下，若硬件地址匹配功能开启，只有地址匹配的情况下，才会产生中断，通知MCU进行后续处理。若没有开启，每次收到地址及读写位数据，都将产生中断。
- 从模式接收。每次收到一个字节的数据后，产生中断，此时I2C接口可拉低SCL，直至中断完成，继续后续操作。
- 从模式发送。每次发送一个字节完毕后且收到响应（ACK/NACK），产生中断，此时I2C接口可拉低SCL，直至中断完成，继续后续操作。

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

图18-5从模式传输示意图

##### 从模式发送

地址匹配后，将数据从I2C_DATA寄存器经由内部移位寄存器发送到SDA线上。在I2C_DATA数据没有准备好之前，从设备可拉底SCL，直到待发送数据已写入I2C_DATA寄存器。I2C接口在发送完毕每个字节后都执行下列操作:

- 如果接收到ACK位，装载下一个字节数据，继续传输。装载过程中，可拉底SCL。
- 如果接收到NACK位，停止下一个字节的装载。
- 等待STOP事件，停止本次传输。

##### 从模式单字节接收

地址匹配后，将通过内部移位寄存器从SDA线接收到的数据存入I2C_DATA寄存器。I2C接口在接收到每个字节后都执行下列操作:

- 如果设置了ACK位，在一个字节接收完毕后，产生一个ACK应答脉冲。
- 如果清除了ACK位，在一个字节接收完毕后，产生一个NACK应答脉冲。
- 等待STOP事件，结束本次传输。

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

图18-6 I2C从模式（发送/接收）的逻辑流程图

#### 主模式

默认情况下，I2C接口主模式和从模式均关闭。若工作在主模式，需使能主模式。为了产生正确的时序，必须在系统寄存器CLK_DIV0中设定I2C接口的工作时钟。

I2C接口执行主模式传输之前，需要判断总线是否空闲。可读取I2C_MSCR寄存器的BIT3，查询当前总线状态。若总线处于忙的状态，可以开启I2C中断，通过收到STOP中断事件判断总线是否空闲下来。只有空闲状态下，才能正常发送START状态，以及后续的数据。

##### 主模式传输

每次传输完一个字节的数据后，将产生中断判断是否还要继续传输。下图为主模式传输的总线示意图。从图可知，流程如下：

- 判断总线是否空闲，若空闲，准备开始传输。
- 首先，发送从地址，若地址匹配，才继续后续传输，否则停止。
- 若是接收模式，一个字节接收完毕后，产生中断，软件判断是否继续接收，返回ACK/NACK响应。
- 若是发送模式，一个字节发送完毕后，等待响应（ACK/NACK），产生中断，根据响应判断后续操作。
- 发送总线STOP事件，本次传输完成。

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

图18-7主模式下单字节传输示意图

##### 主模式发送

开始传输后，I2C接口将字节从I2C_DATA寄存器经由内部移位寄存器发送到SDA线上，从地址也通过I2C_DATA发送出去。在I2C_DATA数据没有准备好之前，主设备可不产生SCL时钟信号，直到待发送数据已写入I2C_DATA寄存器。I2C接口在发送完毕每个字节后都执行下列操作:

- 如果接收到ACK位，装载下一个字节数据，继续传输。装载过程中，可拉底SCL。
- 如果接收到NACK位，停止下一个字节的装载。
- 若主设备，完成传输。无论接收的是ACK/NACK，都停止后续传输。
- 产生STOP事件，结束本次传输。

##### 主模式接收

开始传输后，I2C接口将通过内部移位寄存器从SDA线接收到的数据存入I2C_DATA寄存器，从地址也通过I2C_DATA发送出去。I2C接口在接收到每个字节后都执行下列操作:

- 如果设置了ACK位，在一个字节接收完毕后，产生一个ACK应答脉冲。
- 如果清除了ACK位，在一个字节接收完毕后，产生一个NACK应答脉冲。
- 若主设备，完成传输。无论发送的是ACK/NACK，都停止后续传输。
- 产生STOP事件，结束本次传输。

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

图18-8 I2C主模式发送和接收的逻辑流程图

#### I2C总线异常处理

在一个地址或数据字节传输期间，当I2C接口检测到一个外部的停止或起始条件则产生总线错误。一般而言，产生总线错误是由于总线上有干扰、某些I2C设备没有同步于本I2C网络自行发送了START事件/STOP事件。根据I2C协议规定，发生总线错误的时候，在收到START事件/STOP事件后要重置本I2C设备的接口逻辑。对于从设备而言，这个操作是没有问题的；对于主设备而言，总线错误强行要求其释放总线并重置其I2C接口逻辑。因为主设备是不响应外部START和STOP事件的，发生总线错误后，需要中断处理函数处理本次异常，并指导主设备继续监视总线情况，以便后续执行I2C总线传输。

本I2C接口。主模式下，总线错误可被检测到同时总线错误中断也会产生；从模式下，总线错误将触发地址数据被接收，同时让I2C接口恢复空闲状态并产生中断。

#### 中断处理

I2C接口包含三种类型的中断事件，分别是：数据传输完成事件，总线错误事件、STOP事件、NACK事件和硬件地址匹配事件。

- 数据完成事件。当前数据传输完成，高电平有效，对I2C_SCR.Done写0清除。
- 总线错误事件。传输过程中，总线产生错误的START事件/STOP事件，高电平有效，对I2C_SCR.STT_ERR写0清除。
- STOP事件。当前数据传输完成，主设备发送STOP事件，从设备收到STOP事件并产生相应中断。高电平有效，对I2C_SCR.STOP_EVT写0清除。
- NACK事件。发送端接收到NACK响应，表明接收端无法继续后续传输。高电平有效，对I2C_SCR.RX_ACK写0清除。
- 硬件地址匹配事件。从模式下接收到的地址同本设备地址匹配，产生相应中断。高电平有效，对I2C_SCR.ADDR_DATA写0清除。

#### 通讯速度设置

I2C接口的工作时钟来自系统时钟的分频，分频寄存器为SYS模块的CLK_DIV0。

I2C接口采用同步设计，需要对外部设备的信号进行同步采样，同步时钟为I2C接口工作时钟。

- I2C模块工作时钟频率
  = 系统频率 / (CLK_DIV0 + 1)
- I2C模块数据信号(SDA)和时钟信号(SCL)的时钟频率= I2C模块工作时钟频率 /
  17。
- I2C波特率 = I2C模块工作时钟频率 / 17

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

图18-9 I2C总线错误处理及中断管理流程图

## 寄存器

### 地址分配

I2Cx模块寄存器的基地址分别是是0x4001_1000，0x4001_1400，寄存器列表如下：

表18-1 I2C寄存器地址分配表

||||
|---|---|---|
|名称|偏移|说明|
|I2Cx_ADDR|0x00|I2C地址寄存器|
|I2Cx_CFG|0x04|I2C配置寄存器|
|I2Cx_SCR|0x08|I2C状态寄存器|
|I2Cx_DATA|0x0C|I2C数据寄存器|
|I2Cx_MSCR|0x10|I2C主模式寄存器|
|I2Cx_BCR|0x14|I2C传输控制寄存器|

### I2Cx_ADDR 地址寄存器 (x = 0,1)

地址分别是：0x4001_1000，0x4001_1400

复位值：0x0

表18-2地址寄存器I2C_ADDR

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||||||ADDR_CMP|ADDR|||||||
|||||||||RW|RW|||||||
|||||||||0|0|||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[31:8\]||未使用|
|\[7\]|ADDR_CMP|I2C硬件地址比较使能开关，默认值为0。0：关闭1：开启|
|\[6:0\]|ADDR|仅用于从模式下，I2C设备硬件地址。主模式下，从设备地址写入I2C_DATA寄存器。|

### I2Cx_CFG 系统控制寄存器 (x = 0,1)

地址分别是：0x4001_1004，0x4001_1404

复位值：0x0

表18-3系统控制寄存器I2C_CFG

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||||||IE|TC_IE|BUS_ERR_IE|STOP_IE|||MST_MODE|SLV_MODE|
|||||||||RW|RW|RW|RW|||RW|RW|
|||||||||0|0|0|0|||0|0|

||||
|---|---|---|
|位置|位名称|说明|
|\[31:8\]||未使用|
|\[7\]|IE|I2C中断使能信号。默认值为0。1：使能I2C中断0：关闭I2C中断|
|\[6\]|TC_IE|I2C数据传输完成中断使能信号。默认值为0。1：使能此中断源0：屏蔽此中断源|
|\[5\]|BUS_ERR_IE|I2C总线错误事件中断使能信号。默认值为0。1：使能此中断源0：屏蔽此中断源|
|\[4\]|STOP_IE|I2CSTOP事件中断使能信号。默认值为0。1：使能此中断源0：屏蔽此中断源|
|\[3:2\]||NA|
|\[1\]|MST_MODE|I2C主模式使能信号。默认值为0。1：使能主模式0：关闭主模式|
|\[0\]|SLV_MODE|I2C从模式使能信号。默认值为0。1：使能从模式0：关闭从模式|

### I2Cx_SCR 状态控制寄存器 (x = 0,1)

地址分别是：0x4001_1008，0x4001_1408

复位值：0x0

表18-4状态控制寄存器I2C_SCR

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||||||STT_ERR|LOST_ARB|STOP_EVT|BYTE_CMPLT|ADDR_DATA|DATA_DIR|RX_ACK|Done|
|||||||||RW|RW|RW|RW|RW|RW|RW|RW|
|||||||||0|0|0|0|0|0|0|0|

||||
|---|---|---|
|位置|位名称|说明|
|\[31:8\]||未使用|
|\[7\]|STT_ERR|总线错误状态标志位，用于主模式发送/主模式接收，写0清除。0：无START/STOP总线错误1：有START/STOP总线错误|
|\[6\]|LOST_ARB|总线仲裁丢失状态标志位，用于主模式发送/主模式接收，发生总线仲裁丢失事件将此位置1，无中断事件产生，在字节完成中断中需查此位。总线上任何START事件将导致硬件清除此位。0：无总线仲裁丢失错误发生1：有总线仲裁丢失错误发生|
|\[5\]|STOP_EVT|STOP事件状态标志位，用于主模式发送/从模式发送/主模式接收/从模式接收。写0清除。0：无STOP事件1：有STOP事件|
|\[4\]|BYTE_CMPLT|ACK控制位，用于主模式接收/从模式接收。发送方发送完毕当前字节，接收方对此的响应。若是发送方，此位保留0值。接收方，根据实际情况配置。0：字节发送完成，返回NACK回应，表示接收方不能接收更多数据1：字节发送完成，返回ACK回应，表示接收方可以继续接收数据|
|\[3\]|ADDR_DATA|地址数据标志位，用于主模式发送/从模式发送/主模式接收/从模式接收。START后，第一个字节为地址数据，此位是一个提示位。写0清除。0：当前传输的数据非地址数据。1：当前传输的数据是地址数据。|
|\[2\]|DATA_DIR|发送或接收控制位，主模式发送/从模式发送，此位置1，触发发送，硬件自动清零；主模式接收/从模式接收，此位置0，等待接收。0：接收1：触发发送|
|\[1\]|RX_ACK|接收响应标志位，用于主模式发送/从模式发送，告知发送方，接收方的反馈。发送方收到反馈后，对该位执行清零操作。0：本I2C接口发送数据，接收到ACK响应。1：本I2C接口发送数据，接收到NACK响应。|
|\[0\]|Done|传输完成状态标志位，用于主模式发送/从模式发送/主模式接收/从模式接收。写0清除。0：传输未完成1：传输已完成|

一般，进入中断后，需读取I2C_SCR寄存器，获得当前I2C总线状态及当前传输处于什么阶段；然后，对I2C_SCR进行写操作，写入不同的值，软件通知硬件下一步如何处理。

### I2Cx_DATA 数据寄存器 (x = 0,1)

地址分别是：0x4001_100C，0x4001_140C

复位值：0x0

表18-5数据寄存器I2C_DATA

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||||||DATA||||||||
|||||||||RW||||||||
|||||||||0||||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[31:8\]||未使用|
|\[7:0\]|DATA|数据寄存器，用于主模式发送/从模式发送/主模式接收/从模式接收。发送方，写入发送数据；接收方，读取接收数据。注意，地址数据也是数据，主模式只能将要发送地址数据写入此寄存器。|

### I2Cx_MSCR 主模式寄存器 (x = 0,1)

地址分别是：0x4001_1010，0x4001_1410

复位值：0x0

表18-6主模式寄存器I2C_MSCR

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||||||||||BUSY|MST_CHECK|RESTART|START|
|||||||||||||RW|RW|RW|RW|
|||||||||||||0|0|0|0|

||||
|---|---|---|
|位置|位名称|说明|
|\[31:4\]||未使用|
|\[3\]|BUSY|I2C总线，闲忙状态。0：检测到STOP事件，空闲。1：检测到START事件，忙碌。|
|\[2\]|MST_CHECK|主模式争抢总线标志位。争抢到总线，置1；STOP事件或者发生总线冲突本模块释放总线，置0。|
|\[1\]|RESTART|再次触发START事件，写1有效。发送START完毕，硬件清0。I2C_CFG\[1\]置1，才能实现写1操作。|
|\[0\]|START|触发START事件并发送地址数据至总线，写1有效。I2C_CFG\[1\]置1，才能实现写1操作。|

### I2Cx_BCR I2C传输控制寄存器 (x = 0,1)

地址分别是：0x4001_1004，0x4001_1404

复位值：0x0

表18-7DMA传输控制寄存器I2C_BCR

||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5||4|3|2|1|0|
|||||||||NACK|ADDR_CMP|BURST_EN|||||||
|||||||||RW|RW|RW|||||||
|||||||||0|0|0|||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[31:8\]||未使用|
|\[7\]|NACK_IE|I2C传输，NACK事件中断使能信号。0：屏蔽此中断源1：使能此中断源|
|\[6\]|ADDR_CMP_IE|I2C传输，硬件地址匹配中断使能信号。0：屏蔽此中断源1：使能此中断源|
|\[5\]|BUSRT_EN|I2C 多数据传输使能，需要采用 DMA 方式。 1：使能 0：关闭|
|\[4:0\]|--|保留|

DMA传输仅支持2字节及以上的数据的传输，单字节传输使用普通发送模式。

