1. 项目概述如果你在嵌入式领域摸爬滚打过几年尤其是在使用TI的C2000系列DSP或MCU时I2C总线绝对是一个绕不开的“老朋友”。它不像SPI那样需要四根线也不像UART那样需要事先约定好波特率两根线SDA和SCL就能搞定主从设备之间的通信听起来简直完美。但现实往往是当你兴冲冲地打开数据手册准备用TMS320F2837xS的I2C模块驱动一个温湿度传感器时面对I2CMDR、I2CCNT、I2CPSC等一堆寄存器以及主从收发四种模式、7位/10位地址、重复模式等概念很容易就懵了。手册里虽然列出了每个比特位的定义但“为什么”要这么配置以及在实际代码中“如何”流畅地使用中间的鸿沟需要大量的实践去填补。我最近在一个电机控制项目中就深度使用了F2837xS的I2C模块与多个从设备EEPROM存储参数、数字隔离器进行板间通信打交道。从最开始的寄存器直接操作到后来熟练运用TI提供的DriverLib库函数期间踩过不少坑也总结了一套行之有效的配置和调试方法。这篇文章我就以TMS320F2837xS的I2C模块为核心抛开官方手册的平铺直叙从一个一线开发者的视角为你深入拆解I2C协议的精髓并手把手带你搞定F2837xS上I2C模块的实战应用。我们会从协议本质讲起再到寄存器每个关键位的设计意图最后落地到具体的代码配置和避坑指南。目标很简单让你看完就能用用了不出错。2. I2C总线协议核心思想与F2837xS的硬件实现在直接怼寄存器之前我们必须先吃透I2C协议本身。它不是TI发明的而是一种由Philips现NXP制定的行业标准。理解协议是理解芯片厂商如何用硬件实现它的前提。2.1 两线制与开漏输出优雅的“线与”逻辑I2C最显著的特点是只使用两根线串行数据线SDA和串行时钟线SCL。这两根线都通过上拉电阻连接到正电源VDD。所有连接到总线上的设备其SDA和SCL引脚都必须是开漏Open-Drain或开集Open-Collector输出。为什么必须是开漏这是实现“线与”Wire-AND功能的关键。开漏输出只有两种状态低电平晶体管导通将线拉低和高阻态晶体管关闭输出断开。当总线上的任何一个设备将线拉低时整条线就是低电平只有当所有设备都输出高阻态时上拉电阻才能把总线拉到高电平。这种机制天然地实现了多主设备的仲裁和时钟同步。如果使用推挽输出一个设备输出高另一个输出低就会形成短路烧毁器件。在F2837xS上当你将某个GPIO引脚配置为I2C功能时其内部的输出驱动器会自动切换到开漏模式你无需额外操心。但你需要确保外部上拉电阻的阻值合适通常在3.3V系统下4.7kΩ到10kΩ是常见选择具体需要根据总线电容和通信速度计算。2.2 通信的起承转合起始、停止与重复起始条件I2C通信总是由主设备发起和控制。它通过制造特殊的时序信号来宣告通信的开始和结束。起始条件S当SCL为高电平时SDA线上产生一个从高到低的下降沿。这个信号告诉总线上所有设备“注意我要开始说话了”。停止条件P当SCL为高电平时SDA线上产生一个从低到高的上升沿。这个信号表示“我说完了总线现在空闲”。在F2837xS的I2C模块中当模块作为主设备时你通过设置I2CMDR寄存器中的主模式位MST1、起始条件位STT1来产生起始条件。设置停止条件位STP1来产生停止条件。硬件会自动在正确的时序点上操纵SDA线你只需要关注这些控制位。重复起始条件Sr这是一种非常有用且高效的机制。在一次通信序列中主设备可以在不释放总线不发停止条件的情况下直接发起一个新的起始条件。这常用于切换通信方向例如先写设备地址设置寄存器指针再读数据或连续访问多个不同从设备。在F2837xS中你只需要在总线忙BB1时再次设置STT1硬件就会产生一个重复起始条件。2.3 数据帧与应答每一次握手起始条件之后通信以字节8位为单位进行但F2837xS支持1-8位可配置。每个字节传输后都紧跟着一个应答ACK或非应答NACK时钟脉冲。数据有效性SDA线上的数据必须在SCL为高电平期间保持稳定。数据的变化只能发生在SCL为低电平期间。这是I2C协议的铁律硬件会严格遵守。应答机制每传输完8个数据位或BC位配置的位数后发送方会释放SDA线输出高阻。在第9个时钟脉冲期间接收方必须将SDA线拉低以此作为应答ACK表示“我成功收到了这个字节”。如果接收方没有拉低SDA保持高阻由上拉电阻拉高则表示非应答NACK通常意味着接收失败或通信结束。在F2837xS作为接收方时硬件会自动在应答位时钟周期内检查SDA线电平并将状态反映在I2C状态寄存器I2CSTR的无应答标志位NACK上。作为发送方你需要通过检查这个位来判断从设备是否正常应答。2.4 寻址模式如何找到正确的设备起始条件后的第一个或两个字节通常是地址字节用于寻址特定的从设备。F2837xS支持三种格式7位地址模式默认地址字节包含7位从机地址和1位读写方向位R/W。R/W0表示主设备要写数据到从设备R/W1表示主设备要从从设备读数据。这是最常用的模式理论上一条总线可挂载127个设备地址0x00通常保留。10位地址模式用于需要更多从机地址的场景。地址分两个字节发送第一个字节是固定前缀11110加上地址的两个最高位A9, A8和R/W位第二个字节是地址的低8位A7-A0。F2837xS通过设置I2CMDR.XA1来启用此模式。自由数据格式通过设置I2CMDR.FDF1启用。这种格式下起始条件后直接就是数据字节没有地址帧。这要求通信双方事先约定好角色谁发谁收且在整个传输过程中角色不能改变。它适用于点对点、无需寻址的简单通信。3. TMS320F2837xS I2C模块深度寄存器解析与配置逻辑理解了协议我们再看TI是如何用硬件寄存器来实现它的。直接操作寄存器是理解底层最透彻的方式虽然在实际项目中我们更多使用DriverLib库但知其然知其所以然至关重要。3.1 时钟系统配置通信速率的基石I2C的通信速率标准模式100kbps快速模式400kbps由SCL线的频率决定。F2837xS的I2C模块时钟生成是一个两级分频过程如图19-3所示。第一级模块时钟分频I2CPSC寄存器模块时钟频率Fmod SYSCLK / (I2CPSC.IPSC 1)其中SYSCLK是系统时钟频率。关键点IPSC的值必须在I2C模块处于复位状态I2CMDR.IRS 0时配置。一旦设置IRS1启动模块再修改IPSC是无效的。模块时钟Fmod必须在7-12MHz范围内以满足I2C协议严格的时序要求。第二级主时钟分频I2CCLKL和I2CCLKH寄存器当I2C模块作为主设备时它需要产生SCL时钟。SCL时钟的频率由ICCL和ICCH两个参数决定它们分别控制SCL线低电平和高电平的持续时间。SCL低电平时 Tmod * (ICCL d)SCL高电平时间 Tmod * (ICCH d)SCL周期Tmst Tmod * [(ICCL d) (ICCH d)]SCL频率Fmst 1 / Tmst这里的d是一个由IPSC决定的延迟因子见手册表19-1用于补偿内部逻辑延迟确保建立和保持时间。实操心得如何计算分频值假设你的SYSCLK 200MHz目标SCL频率为400kHz快速模式。首先确定Fmod。取中间值10MHz则IPSC SYSCLK / Fmod - 1 200/10 -1 19。计算Tmod 1/10MHz 100ns。目标SCL周期Tmst 1/400kHz 2500ns。根据IPSC19大于1查表得d5。由公式Tmst Tmod * [(ICCL5) (ICCH5)] 100ns * (ICCL ICCH 10)。所以ICCL ICCH Tmst / Tmod - 10 2500/100 - 10 15。通常设置ICCL和ICCH相等或接近以得到占空比接近50%的时钟。我们可以设ICCL 7,ICCH 8。代入验证周期100ns * [(75)(85)] 100ns * 25 2500ns频率400kHz符合要求。3.2 核心控制寄存器I2CMDR模式与命令中枢这是I2C模块的“大脑”几乎所有的工作模式都由它控制。IRSI2C复位写0复位整个I2C模块所有状态机清零。任何配置更改前应先复位模块。配置完成后写1使能模块。MST主模式1模块作为主设备控制SCL并发起通信0模块作为从设备。TRX发送/接收当MST1主模式或FDF1自由数据格式时此位明确指示方向。1发送器0接收器。在非自由数据格式的从模式下此位无效方向由主设备发送的地址字节中的R/W位决定。XA扩展地址1启用10位地址模式07位地址模式。RM重复模式这是F2837xS I2C模块一个非常强大的功能。RM0非重复模式传输的字节数由I2CCNT寄存器严格指定。当计数器减到0时根据STP位的设置要么产生停止条件STP1要么产生传输完成中断ARDY置位STP0。特别注意如果I2CCNT设置为0硬件会理解为传输65536个字节而不是0个字节RM1重复模式I2CCNT寄存器被忽略。传输会一直持续直到你在软件中主动设置STP1来产生停止条件或者设置STT1来产生重复起始条件开始新的传输。在此模式下每完成一个字节的发送或接收ARDY位都会置位这为流式数据传输例如连续读取传感器数据提供了极大的灵活性。STT起始条件在主模式下MST1设置此位为1模块会在总线上产生一个起始条件如果总线空闲或重复起始条件如果总线忙。硬件会在起始条件成功发出后自动清除此位。STP停止条件在主模式下设置此位为1模块会在当前字节传输完成后在总线上产生一个停止条件。硬件完成后自动清除此位。FDF自由数据格式如前所述启用则忽略地址帧。BC位计数设置每个数据单元包含的位数1-8。通常设置为8二进制111b。3.3 数据与状态寄存器信息交换的窗口I2CDXR数据发送寄存器你要发送的数据写到这里。在非FIFO模式下如果发送移位寄存器I2CXSR为空数据会自动从I2CDXR拷贝到I2CXSR并开始移位发送。在FIFO模式下数据写入发送FIFO。I2CDRR数据接收寄存器从总线上接收到的数据从这里读取。在非FIFO模式下当接收移位寄存器I2CRSR收满一个字节后数据会自动拷贝到I2CDRR。在FIFO模式下从接收FIFO读取数据。I2CSTR状态寄存器这是调试时最需要关注的寄存器。BB总线忙1表示总线正处于起始和停止条件之间忙0表示总线空闲。一个关键坑点当I2C模块从复位IRS0切换到使能IRS1时BB位可能无法正确反映真实的总线状态直到它检测到一个实际的起始或停止条件。安全的做法是使能模块后等待远长于一次完整传输的时间例如10ms确保总线上的活动已被捕获然后再检查BB位是否为0空闲以开始新的传输。ARDY寄存器就绪当数据寄存器I2CDXR或I2CDRR准备好进行下一次读写操作时此位置1。在非重复模式下当I2CCNT计数到0时也会置位。它常用来触发中断以进行流式数据处理。NACK无应答当模块作为发送器主或从且未收到接收方的应答信号时此位置1。通常表示从设备地址错误、设备不存在或设备忙。RSFULL接收移位寄存器满在从接收模式下如果I2CDRR中的数据尚未被CPU读取而新的数据又已接收完毕并准备从I2CRSR拷贝到I2CDRR时此位置1。此时从设备会拉低SCL线时钟延展等待CPU读取数据以防止数据覆盖。XSMT发送器空在从发送模式下如果I2CDXR和I2CXSR都为空无数据可发此位置0。此时从设备会拉低SCL线等待CPU写入新的数据。3.4 FIFO功能提升效率的利器F2837xS的I2C模块包含16级深度的发送和接收FIFO。启用FIFO可以极大减少CPU中断频率提升数据传输效率。启用通过设置SCIFFTX寄存器的SCIFFEN位注意虽然寄存器名带SCI但它确实控制I2C的FIFO来启用FIFO功能。中断水平通过SCIFFTX.TXFFIL和SCIFFRX.RXFFIL可以分别设置发送和接收FIFO的中断触发阈值。例如设置TXFFIL8则当发送FIFO中剩余空间大于等于8个时触发发送中断让你可以一次性填充多个数据。状态查询SCIFFTX.TXFFST和SCIFFRX.RXFFST分别指示当前发送和接收FIFO中有多少数据。4. 基于DriverLib库的I2C模块实战配置直接操作寄存器繁琐且易错TI提供的DriverLib库封装了底层细节让开发更高效。下面我们以主设备发送为例展示完整的配置流程。4.1 初始化配置步骤#include driverlib.h #include device.h #define I2C_SLAVE_ADDR 0x50 // 假设的EEPROM地址 #define I2C_MODULE_FREQ_HZ 100000 // 100kHz 标准模式 void I2CA_Init(void) { // 1. 使能I2C模块时钟 SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_I2CA); // 2. 初始化GPIO引脚为I2C功能 (GPIO18-SDA, GPIO19-SCL for I2CA) GPIO_setPinConfig(GPIO_18_I2CA_SDA); GPIO_setPinConfig(GPIO_19_I2CA_SCL); // 必须将输入量化设置为异步模式避免信号被错误滤波 GPIO_setQualificationMode(18, GPIO_QUAL_ASYNC); GPIO_setQualificationMode(19, GPIO_QUAL_ASYNC); // 3. 复位并初始化I2C模块 I2C_disableModule(I2CA_BASE); // 相当于设置IRS0 // 配置为主发送器7位地址模式禁止自由数据格式使能FIFO I2C_initMaster(I2CA_BASE, DEVICE_SYSCLK_FREQ, I2C_MODULE_FREQ_HZ, I2C_DUTYCYCLE_50); // 注意I2C_initMaster内部已经计算并设置了I2CPSC、I2CCLKL、I2CCLKH // 4. 配置FIFO (可选但推荐) I2C_enableFIFO(I2CA_BASE); // 使能FIFO I2C_setFIFOInterruptLevel(I2CA_BASE, I2C_FIFO_TX8, I2C_FIFO_RX8); // 设置中断水平 // 5. 使能I2C模块 (相当于设置IRS1) I2C_enableModule(I2CA_BASE); // 6. 可选配置中断并开启PIE I2C_clearInterruptStatus(I2CA_BASE, I2C_INT_ARB | I2C_INT_NACK | I2C_INT_ARDY); I2C_enableInterrupt(I2CA_BASE, I2C_INT_ARB | I2C_INT_NACK | I2C_INT_ARDY); Interrupt_enable(INT_I2CA); // 使能CPU级中断 Interrupt_register(INT_I2CA, i2cAISR); // 注册中断服务函数 }4.2 主设备发送数据流程以写EEPROM为例假设我们要向地址为0x50的EEPROM的0x00A0地址写入两个字节数据{0xAA, 0x55}。I2C写EEPROM通常需要先发送内存地址。void I2CA_WriteEEPROM(uint16_t memAddr, uint8_t *data, uint16_t len) { uint16_t i; uint8_t addrBytes[2]; // 1. 确保总线空闲 (等待BB位为0) while(I2C_isBusBusy(I2CA_BASE)) { // 可选加入超时机制 } // 2. 设置从设备地址 (7位模式左移一位最低位为R/W) I2C_setSlaveAddress(I2CA_BASE, I2C_SLAVE_ADDR); // DriverLib内部会处理左移 // 3. 设置为主发送器模式 I2C_setConfig(I2CA_BASE, I2C_MASTER_SEND_MODE); // 设置MST1, TRX1 // 4. 准备要发送的数据首先是EEPROM的内部地址2字节 addrBytes[0] (uint8_t)(memAddr 8); // 高字节 addrBytes[1] (uint8_t)(memAddr 0xFF); // 低字节 // 5. 设置传输数据计数 (非重复模式) // 总字节数 地址字节数(2) 数据字节数(len) I2C_setDataCount(I2CA_BASE, 2 len); // 6. 产生起始条件 I2C_sendStartCondition(I2CA_BASE); // 设置STT1 // 7. 等待ARDY中断或轮询ARDY位然后依次发送数据 // 先发送内存地址 I2C_putData(I2CA_BASE, addrBytes[0]); while(!I2C_getInterruptStatus(I2CA_BASE, I2C_INT_ARDY)) { // 等待ARDY表示数据寄存器已空可以发送下一个 // 在中断服务程序中处理更高效 } I2C_clearInterruptStatus(I2CA_BASE, I2C_INT_ARDY); I2C_putData(I2CA_BASE, addrBytes[1]); while(!I2C_getInterruptStatus(I2CA_BASE, I2C_INT_ARDY)) {} I2C_clearInterruptStatus(I2CA_BASE, I2C_INT_ARDY); // 再发送实际数据 for(i 0; i len; i) { I2C_putData(I2CA_BASE, data[i]); while(!I2C_getInterruptStatus(I2CA_BASE, I2C_INT_ARDY)) {} I2C_clearInterruptStatus(I2CA_BASE, I2C_INT_ARDY); } // 8. 所有数据发送完成后产生停止条件 // 注意在非重复模式且设置了数据计数的情况下如果初始化时配置了STP硬件可能会自动产生。 // 更可控的方式是手动发送停止条件。 I2C_sendStopCondition(I2CA_BASE); // 设置STP1 while(I2C_isStopConditionDetected(I2CA_BASE) false) { // 等待停止条件完成 } }4.3 主设备接收数据流程中断FIFO方式接收数据尤其是使用FIFO和中断能极大提升效率。以下是一个读取多个字节的示例框架。volatile uint8_t g_rxBuffer[256]; volatile uint16_t g_rxIndex 0; volatile uint16_t g_rxExpectedLen 0; // I2C中断服务函数 __interrupt void i2cAISR(void) { uint32_t status I2C_getInterruptStatus(I2CA_BASE); if(status I2C_INT_NACK) { // 处理无应答错误 I2C_clearInterruptStatus(I2CA_BASE, I2C_INT_NACK); // ... 错误处理如重试或报错 } if(status I2C_INT_ARDY) { // 寄存器就绪中断在非FIFO或FIFO阈值触发时有用 I2C_clearInterruptStatus(I2CA_BASE, I2C_INT_ARDY); // ... 处理数据 } if(status I2C_INT_RXFF) { // 接收FIFO达到阈值中断 // 计算FIFO中有多少数据 uint16_t rxWords I2C_getRxFIFOStatus(I2CA_BASE) 0xFF; while(rxWords--) { if(g_rxIndex g_rxExpectedLen) { g_rxBuffer[g_rxIndex] I2C_readDataNonBlocking(I2CA_BASE); } else { // 数据已读完可以提前产生停止条件或丢弃数据 I2C_readDataNonBlocking(I2CA_BASE); // 读出来丢弃 } } I2C_clearInterruptStatus(I2CA_BASE, I2C_INT_RXFF); } // 必须清除PIE组应答位 Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP8); } void I2CA_ReadFromSlave(uint16_t slaveAddr, uint8_t *rxData, uint16_t len) { // 1. 准备全局变量 g_rxExpectedLen len; g_rxIndex 0; // 2. 确保总线空闲 while(I2C_isBusBusy(I2CA_BASE)) {} // 3. 设置从设备地址和主接收模式 I2C_setSlaveAddress(I2CA_BASE, slaveAddr); I2C_setConfig(I2CA_BASE, I2C_MASTER_RECEIVE_MODE); // MST1, TRX0 // 4. 设置数据计数非重复模式 I2C_setDataCount(I2CA_BASE, len); // 5. 使能接收FIFO中断 I2C_enableInterrupt(I2CA_BASE, I2C_INT_RXFF); // 6. 产生起始条件开始接收 I2C_sendStartCondition(I2CA_BASE); // 7. 主循环中等待接收完成 (或使用信号量) while(g_rxIndex g_rxExpectedLen) { // 可以进入低功耗模式等待中断 __asm( NOP); } // 8. 接收完成产生停止条件 I2C_sendStopCondition(I2CA_BASE); while(I2C_isStopConditionDetected(I2CA_BASE) false) {} // 9. 关闭中断拷贝数据 I2C_disableInterrupt(I2CA_BASE, I2C_INT_RXFF); memcpy(rxData, (void*)g_rxBuffer, len); }5. 常见问题排查与调试技巧实录在实际项目中I2C通信失败是家常便饭。下面是我总结的几个最常见的问题和排查手段。5.1 问题一通信完全无响应SCL/SDA线始终为高现象用逻辑分析仪或示波器抓取波形发现主设备发起起始条件后SCL或SDA线没有任何变化或者从设备不应答。排查步骤检查硬件连接这是第一步也是最容易出错的一步。确认SDA和SCL线是否接反上拉电阻是否焊接阻值是否合适通常4.7kΩ电源是否正常检查GPIO配置确认GPIO引脚是否已正确复用为I2C功能配置GPyMUX寄存器。特别重要必须将对应GPIO的输入量化模式设置为异步GPIO_QUAL_ASYNC。I2C是异步通信如果错误地设置了同步或采样窗口低速的I2C信号可能根本无法被正确采样。检查模块使能确认I2CMDR.IRS位是否已设置为1。模块在复位状态下是不会响应任何操作的。检查从设备地址确认你发送的7位从设备地址是否正确通常需要左移一位最低位存放R/W。许多从设备的数据手册给出的地址是7位值而DriverLib的I2C_setSlaveAddress函数期望的正是这个7位值它会内部处理左移。但如果你是自己拼装数据帧务必注意。检查总线锁死如果SCL线被意外拉低并保持例如从设备在时钟延展时崩溃总线会挂起。尝试用软件复位I2C模块IRS先写0再写1。如果还不行可能需要短暂地将SCL引脚配置为通用输出并手动产生几个时钟脉冲“Clock Stretching”恢复法来帮助从设备释放总线。5.2 问题二能收到应答但数据错误或丢失现象起始条件和地址帧都正常从设备也回复了ACK但后续传输的数据位出现错误或者数据接收不全。排查步骤检查时钟频率这是最常见的原因。用示波器测量SCL线的实际频率是否与你计算的配置相符是否超过了从设备支持的最大速率例如某些EEPROM只支持100kHz检查I2CPSC、I2CCLKL、I2CCLKH的计算公式和配置值。检查时序参数I2C协议对建立时间Setup Time和保持时间Hold Time有要求。虽然F2837xS的硬件模块通常能保证但在高速400kHz或长走线、大容性负载的情况下可能因信号边沿变缓而违规。使用示波器测量SDA相对SCL的建立和保持时间。检查FIFO配置如果使用了FIFO检查TXFFIL和RXFFIL中断水平设置是否合理。是否因为中断触发太晚导致FIFO溢出Overrun或下溢Underrun检查SCIFFRX.RXOVFF溢出标志位。检查软件流程在非FIFO模式下你是否在ARDY中断或轮询到ARDY置位后及时读取了I2CDRR或写入了I2CDXR延迟太久可能导致数据覆盖接收或发送欠载发送。在从模式下这会导致SCL被拉低时钟延展。5.3 问题三多主仲裁丢失现象在有多主设备的系统中自己的主设备发送数据时突然通信中断且I2CSTR.ARBLST仲裁丢失标志位被置1。原因与处理当多个主设备同时发起传输时它们会通过“线与”机制仲裁。SDA线会在每个位周期被所有主设备监视。如果某个主设备试图发送高电平释放总线但检测到SDA线为低电平被其他主设备拉低则说明它失去了仲裁。应对策略仲裁丢失是正常现象I2C硬件模块会自动处理失去仲裁的设备会立即切换到从接收模式并监听赢得仲裁的主设备发出的地址看是否与自己相关。你的软件需要在中断服务程序中检查ARBLST标志。清除该标志。根据应用需求决定是重试发送还是放弃本次传输。通常主设备在仲裁丢失后应等待总线空闲BB0后延迟一个随机时间再重试以避免再次冲突。5.4 调试利器逻辑分析仪与软件模拟逻辑分析仪这是调试I2C的终极工具。一个带I2C解码功能的逻辑分析仪如Saleae可以直观地显示起始、停止、地址、数据、ACK/NACK并能直接标出协议错误。没有它调试I2C就像在黑暗中摸索。软件模拟I2C在硬件I2C模块调试不通时可以先用两个GPIO口模拟I2C时序“Bit-Banging”来验证从设备是否正常、硬件连接是否正确。这能帮你快速隔离问题是出在F2837xS的I2C模块配置上还是出在其他地方。虽然效率低但作为调试手段非常有效。充分利用状态寄存器养成在关键操作后如发送起始条件、发送数据后检查I2CSTR寄存器的习惯。BB、ARDY、NACK、ARBLST、RSFULL、XSMT这些位包含了丰富的状态信息。最后关于手册中提到的SCIPRI寄存器它主要用于仿真调试场景。其中的FREESOFT位决定了当你在CCS中遇到断点时I2C外设的行为是立即停止可能破坏通信还是完成当前收/发序列后再停止或是完全自由运行。在正常的应用程序运行中通常不需要配置此寄存器保持默认值即可。但在进行在线调试尤其是调试与实时性相关的I2C通信如电机控制中读取编码器时需要根据情况配置避免因断点导致总线挂起或从设备超时。