TMS320F2802x SPI模块配置与FIFO应用实战指南
1. 项目概述如果你在玩嵌入式开发尤其是用TI的C2000系列DSP做电机控制或者数字电源那SPI串行外设接口这个模块你肯定绕不开。它就像是你芯片和外部世界比如ADC、DAC、EEPROM或者另一个处理器之间的一条高速数据通道。我这些年用TMS320F2802x系列做项目SPI几乎是每个板子上的标配用来读取传感器数据、配置驱动芯片或者做处理器间的数据同步稳定又高效。但说实话刚开始看官方技术手册比如SPRUI09A里那一大堆寄存器描述时确实有点头大。手册会把每个比特位是干嘛的讲得很清楚但怎么把它们串起来在实际代码里配置出一个能稳定跑起来的SPI通信中间那些“坑”和技巧就得靠自己去试了。比如怎么根据系统时钟算出准确的波特率4级FIFO到底该怎么用才能最大化减轻CPU负担主从模式切换时又有哪些细节要注意这些经验性的东西手册里往往一笔带过或者散落在各个角落。所以我想结合手册里的核心内容把我自己调试TMS320F2802x SPI模块时趟过的路、踩过的坑系统地梳理一遍。我们不止看寄存器每个位是什么意思更要弄明白为什么要这么设计以及怎么用它们。我会重点聊聊那个非常实用的4级FIFO看看它是怎么把我们从频繁的中断服务里解放出来的。目标很简单让你看完之后能直接上手把SPI模块稳稳当当地用起来不管是做主设备去驱动外围还是做从设备响应主机都能心里有数。2. SPI模块核心架构与工作模式解析要玩转一个外设不能一上来就对着寄存器位猛操作。你得先理解它的“脾气”和“工作方式”。TMS320F2802x的SPI模块其设计思想非常经典但也有一些TI C2000特有的增强特性理解了这个框架后续的寄存器配置才会有的放矢。2.1 主从模式与信号线定义SPI通信的核心是主从架构。一个主设备Master掌控着通信的节奏它产生时钟信号SPICLK并选择要与哪个从设备Slave对话。TMS320F2802x的SPI模块既可以当主也可以当从通过配置SPICTL.2MASTER_SLAVE位来切换。通信依靠四条线标准4线模式SPISIMO主设备输出从设备输入。当芯片作为主设备时数据从这根线发出去作为从设备时数据从这根线收进来。SPISOMI主设备输入从设备输出。和SPISIMO反过来。SPICLK串行时钟。由主设备产生用于同步数据位在信号线上的移动。时钟的极性和相位是可配置的这是SPI兼容不同设备的关键。SPISTE从设备发送使能低电平有效。主设备用这根线来“片选”某个从设备。当SPISTE为低时对应的从设备被激活可以响应通信为高时从设备的SPISOMI输出会进入高阻态避免总线冲突。这里有个重要实践细节手册里特别提到不建议把SPISTE引脚直接硬拉到有效电平比如一直接地。因为SPISTE的一个关键作用是“门控”可能存在的虚假时钟和数据脉冲防止从设备失去与主设备的同步。如果一直有效这个保护机制就失效了。在硬件连接上一个主设备可以挂多个从设备通常有两种接法一种是每个从设备独立使用一根SPISTE线需要主设备有多个GPIO来模拟片选另一种是所有从设备SPISTE并联依靠数据包中的地址信息来区分需要软件协议。前一种更简单直接也是我们最常用的。2.2 数据流与核心寄存器数据是怎么流动的呢想象一下SPI模块内部有两个核心的“搬运工”发送缓冲器SPITXBUF和接收缓冲器SPIRXBUF以及一个干活的移位寄存器SPIDAT。当你需要发送数据时CPU把数据写到SPITXBUF。一旦移位寄存器SPIDAT空闲SPITXBUF里的数据就会自动加载到SPIDAT中。然后在SPICLK时钟的驱动下SPIDAT中的数据一位一位地从SPISIMO主模式或SPISOMI从模式引脚移出。同时对方设备发送过来的数据位也会在SPICLK的同步下一位一位地从SPISOMI主模式或SPISIMO从模式引脚移入SPIDAT的另一端。当一整帧数据比如8位或16位全部移位完成后SPIDAT中接收到的数据就会被自动搬运到SPIRXBUF中并置位中断标志SPISTS.6 INT_FLAG告诉CPU“数据收好了快来读吧” 此时如果SPITXBUF里已经有下一帧数据在排队SPISTS.1 BUFFULL_FLAG标志为1它会立刻被加载到SPIDAT开始下一轮发送实现连续传输。这里有个关键点也是新手容易困惑的地方SPIDAT是直接参与移位操作的寄存器我们通常不直接读写它。我们的操作对象是缓冲器SPITXBUF和SPIRXBUF。直接写SPIDAT虽然也可以启动发送但会破坏正在进行的移位操作一般不推荐。而读SPIRXBUF则是获取已接收数据的唯一正确方式。2.3 时钟方案与数据格式SPI没有统一的协议标准不同厂商的设备对时钟和数据采样的约定可能不同。这就需要SPI主设备能够灵活配置。TMS320F2802x通过两个控制位来实现CLKPOLARITYSPICTL.3时钟极性。0表示SPICLK空闲时为低电平1表示空闲时为高电平。CLK_PHASESPICTL.4时钟相位。0表示数据在第一个时钟边沿采样1表示数据在第二个时钟边沿采样。这两个位的组合产生了四种经典的SPI模式Mode 0-3。我习惯用“空闲电平”和“采样边沿”来记忆模式0 (CPOL0 CPHA0)时钟空闲低数据在第一个上升沿采样。模式1 (CPOL0 CPHA1)时钟空闲低数据在第二个上升沿即下降沿采样。模式2 (CPOL1 CPHA0)时钟空闲高数据在第一个下降沿采样。模式3 (CPOL1 CPHA1)时钟空闲高数据在第二个下降沿即上升沿采样。配置时必须确保主从设备模式一致否则数据会错位。我常用的方法是先用示波器抓一下从设备比如一个传感器的SPICLK和MOSI/MISO时序确定它的模式然后再去配置MCU的SPI模块。数据帧的长度也是可变的通过SPICCR.3-0SPICHAR位域可以设置1到16位的数据长度。这带来了一个数据对齐问题写入SPITXBUF的数据需要左对齐而读出SPIRXBUF的数据总是右对齐的。例如如果你设置数据长度为12位那么你准备发送的16位数据应该左移4位再写入SPITXBUF。同样从SPIRXBUF读出的16位数据其低12位才是有效数据高4位是无效的可能是上次传输的残留。在编程时需要用移位和掩码操作来处理这个对齐问题。3. 关键寄存器详解与配置实战理解了框架我们现在可以深入寄存器层面了。手册里寄存器表格很多我们抓最核心的几个把配置流程串起来。我会结合代码片段基于TI的C2000 DriverLib或直接寄存器操作来说明这样更直观。3.1 控制与状态寄存器组这是SPI模块的“大脑”负责模式、中断、功能的开关。1. SPI配置控制寄存器SPICCR - 地址 0x7040这个寄存器负责最基础的设置。SPICHAR (Bits 3-0)如前所述设置数据长度。例如0x7表示8位数据因为0-7是8个状态代表1-8位长度这里手册定义是1-16通常0xF表示16位要查具体映射我们假设0x7为8位。SPILBK (Bit 4)回环测试位。置1时SPISIMO和SPISOMI在内部短接用于模块自检非常方便在硬件连接前验证SPI驱动程序是否正确。CLKPOLARITY (Bit 6)时钟极性选择。SPISWRESET (Bit 7)软件复位位。这是一个关键操作任何对SPI模块的重大配置更改如切换主从模式、改变数据格式前后都应该先将此位置0复位模块配置完成后再置1使能模块。这能确保状态机从一个干净的状态启动。2. SPI操作控制寄存器SPICTL - 地址 0x7041这个寄存器管理运行时的行为。SPIINTENA (Bit 0)SPI中断使能。在非FIFO模式下控制是否产生SPIINT中断。TALK (Bit 1)发送使能。0-禁止发送输出高阻1-允许发送。在从机模式下当多个从机共享总线时只有被选中的从机应将TALK置1其他从机必须为0否则总线会冲突。在3线模式中TALK位更是控制收发切换的关键。MASTER_SLAVE (Bit 2)主从模式选择。1-主模式0-从模式。CLK_PHASE (Bit 3)时钟相位选择。OVERRUNINTENA (Bit 4)超限中断使能。当接收溢出发生时是否产生中断。3. SPI状态寄存器SPISTS - 地址 0x7042这是模块的“仪表盘”反映当前状态。INT_FLAG (Bit 6)中断标志。一帧数据发送/接收完成时置1。必须通过读取SPIRXBUF来清除此标志写1无效。这是SPI中断服务程序ISR里第一件要做的事。OVERRUN_FLAG (Bit 7)超限标志。CPU还没读取SPIRXBUF中的旧数据新数据又覆盖进来了此位置1。通过向该位写1来清除。BUFFULL_FLAG (Bit 5)发送缓冲器满标志。当SPITXBUF有数据等待加载到SPIDAT时置1。当数据从SPITXBUF加载到SPIDAT后自动清零。配置流程示例主模式8位数据模式0使能中断// 假设使用寄存器直接操作地址定义略 void SPI_Master_Init(void) { // 第一步软件复位停止SPI模块 SpiaRegs.SPICCR.bit.SPISWRESET 0; // 第二步配置基本参数 SpiaRegs.SPICCR.bit.SPICHAR 0x07; // 8位数据长度 SpiaRegs.SPICCR.bit.CLKPOLARITY 0; // 时钟极性空闲低 SpiaRegs.SPICTL.bit.CLK_PHASE 0; // 时钟相位模式0 SpiaRegs.SPICTL.bit.MASTER_SLAVE 1; // 主模式 SpiaRegs.SPICTL.bit.TALK 1; // 允许发送 SpiaRegs.SPICTL.bit.SPIINTENA 1; // 使能中断 // 第三步配置波特率见下一节 SpiaRegs.SPIBRR 0x004F; // 示例值对应约1Mbps (LSPCLK50MHz时) // 第四步使能SPI模块启动运行 SpiaRegs.SPICCR.bit.SPISWRESET 1; }3.2 波特率发生器与计算SPI的通信速度由波特率决定。在主模式下波特率由SPIBRR寄存器地址0x7044控制。计算公式手册里给了但怎么用需要理解当SPIBRR 3 ~ 127时SPI Baud Rate LSPCLK / (SPIBRR 1)当SPIBRR 0 1 2时SPI Baud Rate LSPCLK / 4这里的LSPCLK是低速外设时钟由系统时钟SYSCLKOUT经过分频得到通过PCLKCR寄存器配置。第一步你必须先确认你的LSPCLK是多少。例如系统时钟60MHzLSPCLK配置为不分频即60MHz那么最大SPI波特率就是60MHz / 4 15Mbps。计算示例假设我们需要1Mbps的波特率LSPCLK 50MHz。 根据公式SPIBRR LSPCLK / DesiredBaud - 1 50,000,000 / 1,000,000 - 1 50 - 1 49。 所以向SPIBRR写入49即可。实际波特率会有微小误差50MHz / 50 1.000MHz。重要注意事项从机速率限制在从机模式下SPICLK由外部主机提供但其频率不能超过LSPCLK/4。如果主机时钟太快从机可能无法正确采样数据。GPIO速度限制最终波特率不能超过芯片GPIO引脚的最大翻转频率。这个值在芯片数据手册的“AC/DC电气特性”部分对于F2802x系列通常在几十MHz量级。15Mbps的SPI时钟7.5MHz翻转频率对于大多数型号是安全的但若接近极限需要考虑信号完整性问题。时钟对称性手册提到当(SPIBRR1)为奇数且大于3时SPICLK的占空比不再是50%。高电平或低电平会多一个LSPCLK周期。在通信双方对时钟对称性有严格要求时虽然不常见需要避免这种情况。3.3 数据缓冲寄存器与操作数据交换通过三个寄存器完成SPIDAT (0x7049)移位寄存器。通常不直接操作。SPITXBUF (0x7048)发送缓冲器。CPU将待发送数据写入此处。SPIRXBUF (0x7047)接收缓冲器。CPU从此处读取接收到的数据。发送数据流程查询方式uint16_t SPI_TransmitData(uint16_t data) { // 等待发送缓冲器空闲确保上一帧数据已从SPITXBUF加载到SPIDAT while(SpiaRegs.SPISTS.bit.BUFFULL_FLAG 1) { ; // 等待 } // 写入数据到发送缓冲器启动传输 SpiaRegs.SPITXBUF data; // 等待接收完成一帧数据发完的同时也收完了一帧 while(SpiaRegs.SPISTS.bit.INT_FLAG 0) { ; // 等待 } // 读取接收缓冲器同时会清除INT_FLAG标志 return SpiaRegs.SPIRXBUF; }这里有个细节SPIRXBUF里读出的数据并不一定是你想“接收”的数据。在SPI全双工通信中每次发送都会伴随一次接收。如果你只是单向发送命令给从设备从设备可能不会回复有效数据此时SPIRXBUF里是“哑元”数据。你需要根据通信协议来解析它。4. FIFO功能深度解析与应用策略标准SPI模式下每收发一帧数据就可能产生一次中断在高速连续传输时比如连续读取ADC的采样值CPU会频繁被中断打扰效率低下。TMS320F2802x的SPI模块集成的4级FIFO先入先出缓冲区就是为了解决这个问题而生的“神器”。4.1 FIFO模式使能与配置FIFO功能由三个新增的寄存器控制SPIFFTX发送FIFO控制、SPIFFRX接收FIFO控制、SPIFFCTFIFO控制。使能FIFO的步骤复位后状态芯片复位后SPI处于标准模式FIFO禁用。使能FIFO将SPIFFTX.14SPIFFENA位置1。强烈建议在修改FIFO相关配置前先将SPIFFTX.13SPIRST置1对FIFO模块进行复位配置完成后再清零这是一个好习惯。配置中断触发深度这是FIFO使用的精髓。SPIFFTX.4-0(TXFFIL)发送FIFO中断触发级别。当发送FIFO中的数据量TXFFST小于或等于这个设定值时触发发送中断SPITXINT。通常设置为0空时触发让CPU及时填充数据。SPIFFRX.4-0(RXFFIL)接收FIFO中断触发级别。当接收FIFO中的数据量RXFFST大于或等于这个设定值时触发接收中断SPIRXINT。例如设置为4则当FIFO存满4个字时才中断让CPU一次读取多个数据大幅减少中断次数。使能FIFO中断将SPIFFTX.5TXFFIENA和SPIFFRX.5RXFFIENA置1。清除FIFO通过SPIFFTX.12TXFIFO和SPIFFRX.12RXFIFO位可以复位各自的FIFO指针。初始化代码片段void SPI_FIFO_Init(void) { // ... 先完成标准SPI的基本配置主从模式、波特率等 // 1. 复位FIFO模块 SpiaRegs.SPIFFTX.bit.SPIFFENA 0; // 先关闭FIFO SpiaRegs.SPIFFTX.bit.SPIRST 1; // FIFO复位 SpiaRegs.SPIFFRX.bit.RXFIFORESET 1; SpiaRegs.SPIFFTX.bit.TXFIFORESET 1; // 2. 配置FIFO SpiaRegs.SPIFFTX.bit.TXFFIL 0; // 发送FIFO空时产生中断 SpiaRegs.SPIFFRX.bit.RXFFIL 4; // 接收FIFO有4个或以上数据时产生中断 SpiaRegs.SPIFFCT.bit.FFTXDLY 0; // 发送FIFO到移位寄存器无延迟后文详述 // 3. 使能FIFO及其中断 SpiaRegs.SPIFFTX.bit.TXFFIENA 1; // 使能发送FIFO中断 SpiaRegs.SPIFFRX.bit.RXFFIENA 1; // 使能接收FIFO中断 SpiaRegs.SPIFFTX.bit.SPIFFENA 1; // 使能FIFO增强功能 // 4. 释放FIFO复位 SpiaRegs.SPIFFTX.bit.SPIRST 0; SpiaRegs.SPIFFRX.bit.RXFIFORESET 0; SpiaRegs.SPIFFTX.bit.TXFIFORESET 0; }4.2 FIFO工作流程与中断服务程序设计使能FIFO后数据的搬运流程发生了变化发送端CPU不再直接写SPITXBUF而是连续写入SPITXBUF此时它充当了FIFO的入口。数据会先存入4级深的发送FIFO中。只有当移位寄存器SPIDAT完全空闲时FIFO中的第一个数据才会被自动加载到SPIDAT开始发送。发送FIFO状态位TXFFST实时反映FIFO中还有几个数据待发。接收端每接收完一帧数据数据不会直接进入SPIRXBUF而是先存入4级深的接收FIFO。接收FIFO状态位RXFFST实时反映FIFO中已存有多少个数据。CPU从SPIRXBUF读取数据时实际上是从接收FIFO的出口读取。中断服务程序ISR的设计思路需要调整发送中断SPITXINT通常由TXFFIL0触发意味着发送FIFO空了。在ISR中你应该检查是否还有数据要发送如果有就一次性向SPITXBUF写入多个数据最多4个直到填满或所有数据写完。接收中断SPIRXINT由RXFFIL触发比如我们设为4表示FIFO快满了。在ISR中你应该一次性从SPIRXBUF读取多个数据通过查询RXFFST知道有多少个直到将FIFO读空或读到满足需求的数量。示例基于FIFO的块传输发送ISR__interrupt void spiTxFifoIsr(void) { uint16_t i; // 判断是否为发送FIFO中断 if(SpiaRegs.SPIFFTX.bit.TXFFINT 1) { SpiaRegs.SPIFFTX.bit.TXFFINTCLR 1; // 清除中断标志 // 假设有一个全局的待发送数据数组 g_txBuffer[] 和索引 g_txIndex // 以及总数据量 g_txSize while((SpiaRegs.SPIFFTX.bit.TXFFST 4) (g_txIndex g_txSize)) { SpiaRegs.SPITXBUF g_txBuffer[g_txIndex]; } // 如果所有数据已发送完毕可以关闭发送中断或进行其他处理 if(g_txIndex g_txSize) { SpiaRegs.SPIFFTX.bit.TXFFIENA 0; // 禁用发送FIFO中断 // 设置一个标志通知主循环发送完成 g_spiTransferDone 1; } } // 必须清除PIE组应答位 PieCtrlRegs.PIEACK.all PIEACK_GROUP6; }4.3 可编程延迟与FIFO状态管理SPIFFCT寄存器地址0x705A的FFTXDLY位域Bits 7-0提供了一个非常实用的功能可编程的发送延迟。它定义了从发送FIFO传输一个字到发送移位寄存器SPIDAT之间需要延迟多少个SPICLK周期。这个功能有什么用想象一下你要驱动一个低速的SPI接口EEPROM如AT25系列。如果你以很高的波特率连续发送命令和数据EEPROM可能处理不过来导致通信失败。FFTXDLY允许你在每个数据帧之间插入空闲时间。例如设置FFTXDLY 255则在每发送完一个16位数据后SPI模块会等待255个SPICLK周期再开始发送FIFO中的下一个数据。这相当于自动在数据帧之间添加了“保护间隔”让你无需用CPU来制造延时就能无缝对接各种低速外设。FIFO状态管理 在程序运行中你可以通过查询TXFFST和RXFFST来了解FIFO的实时状态进行流控制。例如在非中断的查询式发送中你可以这样做void SPI_WriteMultipleData(uint16_t *data, uint16_t count) { uint16_t i 0; while(i count) { // 等待发送FIFO有至少一个空位 if(SpiaRegs.SPIFFTX.bit.TXFFST 4) { SpiaRegs.SPITXBUF data[i]; } // 可以同时检查接收FIFO防止溢出如果也是全双工 if(SpiaRegs.SPIFFRX.bit.RXFFST ! 0) { // 读取数据... volatile uint16_t dummy SpiaRegs.SPIRXBUF; } } }5. 高级应用与疑难问题排查掌握了基本配置和FIFO后我们再看几个高级主题和常见问题。5.1 3线SPI模式应用3线模式节省了一个引脚SPISOMI将SPISIMO主模式或SPISOMI从模式变为双向数据线。这在引脚资源紧张时非常有用。关键控制位是SPIPRI.3TRIWIRE。3线主模式操作要点设置TRIWIRE1SPISIMO变为双向引脚SPIMOMI。发送数据时确保TALK1。接收数据是难点因为收发共用一根线发送的数据也会被自己接收回来。所以当主机需要从从机读取数据时流程是主机先TALK0停止驱动总线。主机向SPIDAT或SPITXBUF写入一个哑元数据比如0xFFFF这个操作会启动时钟但不会驱动SPIMOMI引脚输出因为TALK0。从机在时钟驱动下将其数据送到SPIMOMI线上。主机在时钟驱动下将SPIMOMI线上的数据即从机的回复移入自己的移位寄存器。接收完成后主机TALK1恢复对总线的控制。主机必须进行一次“哑读”操作读取SPIRXBUF来清除接收到的自己之前发送的数据然后再读取真正从从机那里得到的数据通常需要两次传输一次发命令一次发哑元读数据。5.2 常见问题与排查技巧在实际调试中SPI通信失败是家常便饭。下面是一个快速排查清单现象可能原因排查步骤与解决方法完全无通信用示波器看不到时钟或数据1. SPI模块未使能SPISWRESET0。2. 引脚复用功能未正确配置到SPI。3. 主模式下TALK0或从模式下SPISTE未被主机拉低。4. 波特率设置极端错误如SPIBRR值过大导致时钟极慢。1. 检查SPICCR.7是否为1。2. 检查GPxMUX寄存器确认相应引脚已配置为SPI功能。3. 主模式检查SPICTL.1从模式用示波器检查SPISTE引脚电平。4. 计算并检查SPIBRR值用示波器测量SPICLK引脚。有时钟但数据不对或波形异常1.时钟模式CPOL/CPHA不匹配。这是最常见的原因。2. 数据帧长度SPICHAR不匹配。3. 数据位序MSB/LSB不匹配SPI通常是MSB先行。4. 电气问题上拉电阻、走线过长、干扰。1.用示波器同时抓取主从双方的SPICLK和MOSI/MISO对照数据手册严格确认采样边沿。务必保证主从模式一致。2. 核对主从设备的数据长度设置。3. 如果外设是LSB先行需要在软件中对数据进行反转。4. 检查硬件连接缩短走线在时钟和数据线上增加合适的端接电阻。只能发送一次后续通信失败1. 中断标志未清除导致中断卡死或状态机停滞。2. 接收溢出OVERRUN_FLAG发生且未处理。3. 在从模式下主机时钟频率超过LSPCLK/4。1.确保在中断服务程序中读取SPIRXBUF以清除INT_FLAG。对于溢出标志写1清除。2. 检查OVERRUN_FLAG如有则清除。优化程序确保及时读取接收数据。3. 降低主机SPI时钟频率或提高从机LSPCLK。使用FIFO时数据丢失或乱序1. FIFO中断触发级别TXFFIL/RXFFIL设置不合理导致中断不及时。2. 发送FIFO下溢CPU供给数据太慢或接收FIFO溢CPU取数据太慢。3. 未正确初始化或复位FIFO指针。1. 根据数据流量调整触发级别。对于连续高速流接收FIFO触发级别可设高些如3或4。2. 在ISR中根据TXFFST/RXFFST状态尽可能多地写入/读取数据。考虑使用DMA配合FIFO以获得更高效率。3. 在使能FIFO前先执行FIFO复位操作SPIRST1再0。多从机系统中某个从机无响应1. 该从机的片选SPISTE或GPIO模拟信号有问题。2. 多个从机TALK位同时为1造成总线冲突。3. 从机供电或硬件故障。1. 用示波器检查片选信号在通信期间是否有效低电平。2.确保在任何时刻只有一个从机的TALK位为1或片选有效。在切换从机前先将当前从机的TALK置0或片选无效。3. 检查硬件。调试心得示波器是你的最佳朋友没有之一。第一时间用示波器看四根线上的波形比对时序图大部分问题都能定位。从最简单配置开始先不用FIFO不用中断用查询模式、最低波特率、模式0实现单字节收发。通了之后再逐步增加复杂度。善用回环测试将SPICCR.4SPILBK置1可以排除外部硬件问题快速验证软件配置和驱动程序是否正确。注意中断嵌套与优先级SPI中断可能比较频繁确保中断服务程序执行时间足够短。在C2000中合理配置PIE向量表和中断优先级。电源与地是关键尤其是高速SPI通信确保电源干净地回路阻抗小。时钟和数据线尽可能等长避免反射。最后关于手册里提到的比较器COMP模块寄存器部分虽然和SPI同属外设但功能独立。它主要用于模拟比较常与PWM模块结合实现硬件保护或逐周期电流控制。如果你在做电机驱动或数字电源会经常用到它来检测过流点。它的配置核心是COMPCTL比较器控制、DACVAL内部DAC参考值和RAMP斜坡发生器相关寄存器。配置时务必注意许多关键寄存器如COMPCTL是受EALLOW保护的在修改前需要调用EALLOW指令修改后调用EDIS指令。这一点和SPI寄存器不同需要特别注意。