行业资讯
TMS320F28335串行通信接口(SCI/SPI/I2C)配置与调试实战指南
1. 项目概述与核心价值在嵌入式系统开发尤其是工业控制、电机驱动和数字电源这些对实时性和可靠性要求极高的领域TMS320F28335这颗德州仪器TI的经典DSP芯片是很多工程师的老朋友。它的强大性能不仅体现在200MHz的主频和浮点运算单元上更在于其丰富且灵活的外设资源。其中串行通信接口SCI、SPI、I2C是连接芯片与外部世界、构建复杂系统网络的“咽喉要道”。很多新手甚至是有一定经验的工程师在面对F28335的串口配置时常常会陷入一种困境手册上的寄存器列表和公式看起来都懂但一上手调试通信就是不通或者数据时对时错。问题往往出在对这些接口底层工作机制和配置细节的理解不够透彻。比如为什么SCI的波特率计算要分BRR是否为0两种情况SPI的时钟极性和相位到底怎么组合才匹配从设备GPIO复用配置时那个让人头疼的输入量化Qualification到底在什么场景下必须用这篇文章我就结合自己多年在电机控制器和逆变器项目上“踩坑”的经验把F28335的这三个核心串行通信接口掰开揉碎了讲清楚。我们不只讲寄存器怎么填更要讲清楚每个配置项背后的“为什么”以及在实际工程中如何根据你的具体需求比如通信距离、抗干扰要求、从设备特性做出最合适的选择和配置。目标是让你读完以后不仅能配通通信更能理解其原理在遇到问题时能快速定位根源。2. 串行通信接口SCI深度解析与实战配置SCI是F28335上最常用的异步串行通信接口也就是我们常说的UART。它的特点是通信双方没有统一的时钟线依靠事先约定好的波特率进行数据传输因此硬件连接简单仅需TX和RX两根线非常适合与上位机、调试终端或其他微控制器进行中低速、中远距离的数据交换。2.1 SCI核心工作机制与寄存器精讲F28335提供了三个独立的SCI模块SCI-A SCI-B SCI-C每个模块的功能完全一致。理解其工作核心是抓住几个关键点双缓冲、NRZ格式和可编程波特率。双缓冲机制这是确保通信效率和数据完整性的关键。无论是发送还是接收都有两级缓冲区一个数据缓冲寄存器SCITXBUF/SCIRXBUF和一个移位寄存器TXSHF/RXSHF。当你向SCITXBUF写入一个字节后CPU就可以去处理其他任务硬件会自动将这个字节加载到TXSHF中并按位从SCITXD引脚发送出去。接收过程反之亦然。这种设计避免了因CPU处理不及时而导致的数据覆盖Overrun或发送延迟是实现中断驱动通信的基础。NRZ格式与数据帧SCI采用标准的非归零NRZ格式。一帧数据通常由1个起始位低电平、5-8个数据位、1个可选的奇偶校验位和1-2个停止位高电平组成。这些格式都在**SCICCR通信控制寄存器**中配置。例如SCICCR.5-3位决定数据位长度SCICCR.2位决定是否启用奇偶校验SCICCR.1位决定奇校验还是偶校验。波特率计算——最容易出错的地方波特率发生器是SCI的“心脏”其时钟源是低速外设时钟LSPCLK。手册给出的公式是当波特率寄存器BRR由SCIHBAUD和SCILBAUD组成不为0时波特率 LSPCLK / [(BRR 1) * 8]当BRR为0时波特率 LSPCLK / 16这里有一个至关重要的细节LSPCLK默认等于SYSCLKOUT/4但它是可以通过系统控制寄存器配置分频的。在计算波特率前你必须先确认系统中LSPCLK的实际频率。假设系统主频SYSCLKOUT为150MHz默认LSPCLK为37.5MHz。如果你想得到115200的波特率计算过程如下计算目标分频系数N LSPCLK / (波特率 * 8) 37.5e6 / (115200 * 8) ≈ 40.69计算BRR值BRR N - 1 39.69取整为40。验算实际波特率实际波特率 37.5e6 / [(401)*8] 114332.5误差约为0.75%在异步通信允许的误差范围内通常2%即可。注意波特率误差是异步通信稳定的关键。误差过大会导致采样点偏移最终产生帧错误。对于高波特率如921600或非标准波特率需要仔细计算并可能调整LSPCLK的分频比。2.2 增强功能FIFO与自动波特率检测除了基本功能F28335的SCI还提供了两个非常实用的增强功能16级FIFO和自动波特率检测。16级FIFO这是对双缓冲机制的极大增强。通过配置SCIFFTX、SCIFFRX和SCIFFCT寄存器可以启用发送和接收FIFO。启用后你可以连续向FIFO写入最多16个字节的数据硬件会依次发送大大减少了CPU中断的频率提升了大数据块传输的效率。例如在通过Modbus RTU协议与多个传感器通信时启用接收FIFO并设置一个合适的触发深度如8字节可以确保一帧完整的数据包接收完成后才产生一次中断让CPU处理更高效。自动波特率检测这个功能在需要与未知波特率设备建立初始通信的场景下非常有用比如Bootloader。其原理是检测起始位下降沿的宽度。启用该功能SCICTL2.5位后SCI模块会测量起始位的持续时间并自动计算出对应的波特率更新到波特率寄存器中。使用时主机需要发送一个特定的同步字符通常是0x55或0xAA其二进制位包含连续的01跳变从机在自动检测模式下去测量并锁定波特率。2.3 实战配置步骤与代码示例下面以SCI-A配置为115200波特率、8位数据、无校验、1位停止位、启用发送中断为例展示典型的初始化流程。这里假设使用CPU定时器0进行简单的延时。// 首先在系统初始化阶段正确配置LSPCLK // 假设SYSCLKOUT 150MHz 希望LSPCLK 37.5MHz (即四分频) // 这通常在InitSysCtrl()函数中通过配置HISPCP和LOSPCP寄存器完成 void InitSciA(void) { // 1. 使能SCI-A时钟 (在PCLKCR0寄存器中) EALLOW; // 解除寄存器保护 SysCtrlRegs.PCLKCR0.bit.SCIAENCLK 1; // 使能SCI-A外设时钟 EDIS; // 2. 配置GPIO复用为SCI功能 (GPIO28-RX, GPIO29-TX) EALLOW; GpioCtrlRegs.GPAMUX2.bit.GPIO28 1; // 将GPIO28配置为SCIRXDA功能 GpioCtrlRegs.GPAMUX2.bit.GPIO29 1; // 将GPIO29配置为SCITXDA功能 // 注意根据具体硬件连接可能需要配置上拉/下拉电阻(GPAPUD寄存器) EDIS; // 3. 初始化SCI-A寄存器 (注意先软复位再配置) SciaRegs.SCICCR.all 0x0007; // 1位停止位无校验8位数据异步模式 // 计算波特率寄存器值 BRR 40 (对于LSPCLK37.5MHz, 目标115200) SciaRegs.SCIHBAUD 0x0000; // BRR高字节为0 SciaRegs.SCILBAUD 0x0028; // BRR低字节为40 (0x28) // 4. 配置控制寄存器 SciaRegs.SCICTL1.all 0x0003; // 使能发送器和接收器禁止休眠模式 // 如果需要错误中断可以配置SCICTL1.6 (RX ERR INT ENA) SciaRegs.SCICTL2.all 0x0002; // 使能发送中断(TX INT ENA)接收中断由SCICTL2.1单独控制 SciaRegs.SCICTL2.bit.RXBKINTENA 0; // 本例不使能接收中断采用查询方式 // 5. 可选配置FIFO SciaRegs.SCIFFTX.all 0xE040; // 使能SCI FIFO复位TXFIFOTX中断级别设为0每发送1字产生中断 SciaRegs.SCIFFRX.all 0x2040; // 复位RXFIFORX中断级别设为0每接收1字产生中断 SciaRegs.SCIFFCT.all 0x0000; // 禁止自动波特率检测FIFO发送延迟为0 // 6. 最后重新使能SCI SciaRegs.SCICTL1.bit.SWRESET 1; // 退出复位状态SCI开始工作 } // 发送一个字符的函数查询方式 void scia_send_char(char c) { while (SciaRegs.SCICTL2.bit.TXRDY ! 1) {} // 等待发送缓冲区就绪 SciaRegs.SCITXBUF c; } // 发送字符串的函数 void scia_send_string(char *s) { while (*s ! \0) { scia_send_char(*s); } }3. 串行外设接口SPI主从模式详解与时钟方案SPI是一种高速、全双工、同步的串行通信总线。与SCI不同SPI通信双方共用一根时钟线SPICLK由主机产生因此数据传输速率可以很高且时序严格同步。F28335的SPI模块SPI-A功能强大支持主从模式、可编程数据位宽1-16位以及灵活的时钟配置。3.1 SPI主从模式与四线制SPI通常采用四线制SPISIMO Slave In, Master Out。主机输出从机输入。SPISOMI Slave Out, Master In。主机输入从机输出。SPICLK 串行时钟由主机产生。SPISTE 从机片选低电平有效由主机控制。这是一个关键点SPISTE并非SPI协议强制要求的但F28335的SPI模块将其作为标准功能集成。主机通过拉低对应从机的SPISTE引脚来选中该从机进行通信。一个主机可以连接多个从机通过多个GPIO引脚模拟片选信号或者使用外部译码器。主从模式配置通过SPICTL.2 (MASTER/SLAVE)位选择。作为主机时SPICLK由内部波特率发生器产生作为从机时SPICLK由外部主机提供。一个常见的坑是在从机模式下必须保证SPICLK的时钟质量如果主机时钟不稳定或毛刺多从机很容易采样出错。3.2 时钟极性CPOL与相位CPHA——四种模式这是SPI配置中最容易混淆的部分它决定了数据在时钟的哪个边沿被采样和输出。F28335通过SPICCR.6 (CLOCK POLARITY)和SPICTL.3 (CLOCK PHASE)两位来控制组合出四种模式模式CPOL (SPICCR.6)CPHA (SPICTL.3)时钟空闲状态数据采样边沿数据输出边沿000低电平上升沿下降沿101低电平下降沿上升沿210高电平下降沿上升沿311高电平上升沿下降沿如何理解关键在于抓住“采样”和“输出”的时刻。CPOL0时钟空闲时为低电平。CPHA0时在时钟的第一个边沿即上升沿采样数据在时钟的前一个边沿即下降沿输出数据。CPHA1时在时钟的第二个边沿即下降沿采样在第一个边沿上升沿输出。CPOL1时钟空闲时为高电平。逻辑与CPOL0类似只是边沿反过来。实战口诀绝大多数SPI从设备的数据手册都会明确要求工作在哪种模式。配置时主从设备的CPOL和CPHA必须完全一致。一个快速判断的方法是观察从设备数据手册的时序图看它的数据是在时钟上升沿还是下降沿保持稳定即被主机采样那个稳定的边沿就是采样边沿。然后看时钟空闲时的电平就是CPOL。3.3 波特率计算与FIFO使用SPI的波特率计算比SCI简单公式为当3 ≤ SPIBRR ≤ 127时波特率 LSPCLK / (SPIBRR 1)当SPIBRR 0, 1, 2时波特率 LSPCLK / 4同样LSPCLK是基准时钟。假设LSPCLK37.5MHz需要1MHz的SPI时钟则SPIBRR LSPCLK / 波特率 - 1 37.5 - 1 36.5取整为37实际波特率约为0.9868MHz误差很小。FIFO功能与SCI类似SPI也支持16级深度的发送/接收FIFO通过SPIFFTX、SPIFFRX和SPIFFCT寄存器配置。启用FIFO可以显著提升大数据量传输时的效率减少中断开销。特别是在作为主机连续读取ADC芯片或发送显示数据时FIFO非常有用。3.4 SPI初始化配置示例主机模式模式0下面配置SPI-A为主机模式0CPOL0 CPHA08位数据波特率1MHz使用FIFO。void InitSpiA_Master(void) { // 1. 使能SPI-A时钟 EALLOW; SysCtrlRegs.PCLKCR0.bit.SPIAENCLK 1; EDIS; // 2. 配置GPIO复用为SPI功能 (假设使用GPIO16-SPISIMOA, GPIO17-SPISOMIA, GPIO18-SPICLKA, GPIO19-SPISTEA) EALLOW; GpioCtrlRegs.GPAMUX2.bit.GPIO16 1; // SPISIMOA GpioCtrlRegs.GPAMUX2.bit.GPIO17 1; // SPISOMIA GpioCtrlRegs.GPAMUX2.bit.GPIO18 1; // SPICLKA GpioCtrlRegs.GPAMUX2.bit.GPIO19 1; // SPISTEA (作为主机此引脚可配置为通用GPIO手动控制片选) // 或者如果想让SPISTEA作为自动片选需在SPI配置中设置SPICTL.4 (TALK)位 EDIS; // 3. 初始化SPI寄存器前先进入复位状态 SpiaRegs.SPICCR.bit.SPISWRESET 0; // 将SPI置于复位状态 // 4. 配置SPI参数 SpiaRegs.SPICCR.all 0x000F; // 复位值SPI软件复位保持时钟极性低16位数据不先配置为8位 SpiaRegs.SPICCR.bit.SPICHAR 0x07; // 8位数据 (SPICHAR7 表示字符长度-1) SpiaRegs.SPICCR.bit.CLK_POLARITY 0; // CPOL 0 时钟空闲低 SpiaRegs.SPICCR.bit.SPILBK 0; // 禁止回环模式 SpiaRegs.SPICTL.all 0x0006; // 主机模式正常时钟相位(CPHA0)使能发送禁止超时中断 // SPICTL.3 (CLOCK PHASE) 0 对应模式0 // SPICTL.1 (MASTER/SLAVE) 1 主机模式 // SPICTL.0 (SPI INT ENA) 0 先禁止中断用查询方式 // 5. 设置波特率 (LSPCLK37.5MHz, 目标1MHz) // SPIBRR 37.5 / 1 - 1 36.5 - 取37 SpiaRegs.SPIBRR 37; // 6. 配置FIFO SpiaRegs.SPIFFTX.all 0xE040; // 使能FIFO复位TXFIFOTXFIFO深度为16 SpiaRegs.SPIFFRX.all 0x2040; // 复位RXFIFORXFIFO深度为16 SpiaRegs.SPIFFCT.all 0x00; // FIFO发送延迟为0 // 7. 退出复位状态启动SPI SpiaRegs.SPICCR.bit.SPISWRESET 1; // 8. 可选如果使用SPISTEA作为自动片选需要配置SPI引脚控制 // 但更常见的做法是将SPISTEA对应的GPIO如GPIO19配置为普通输出手动拉低/拉高以控制从机片选 } // SPI发送并接收一个字节查询方式 Uint16 SpiA_Transfer(Uint16 data) { // 等待发送缓冲区空非FIFO模式看SPISTS.5 FIFO模式看SPIFFTX.7 while (SpiaRegs.SPIFFTX.bit.TXFFST ! 0) { // 等待TX FIFO有空间 } SpiaRegs.SPITXBUF data; // 写入数据启动传输 // 等待接收数据就绪非FIFO模式看SPISTS.6 FIFO模式看SPIFFRX.6 while (SpiaRegs.SPIFFRX.bit.RXFFST 0) { // 等待RX FIFO有数据 } return SpiaRegs.SPIRXBUF; // 读取接收到的数据 }4. 集成电路总线I2C协议与F28335实现要点I2C是一种由Philips现NXP开发的双线制、半双工、多主多从的串行通信总线。它只需要两根线串行数据线SDA和串行时钟线SCL通过地址寻址方式与总线上多个从设备通信非常节省IO口资源。F28335的I2C模块完全兼容I2C V2.1规范支持标准模式100kbps和快速模式400kbps。4.1 I2C总线协议基础与F28335特性I2C总线是**开源集电极Open-Drain**结构需要外接上拉电阻。通信由主机发起包括起始条件S、从机地址7位或10位、读写位、数据字节和停止条件P。F28335的I2C模块将这些复杂的时序全部用硬件实现程序员主要通过操作一系列寄存器来完成通信。关键特性支持7位和10位地址模式通过I2CMDR寄存器配置。7位地址是主流10位地址用于连接更多设备。16字深的FIFO大幅提升了连续读写操作的效率。自由数据格式模式在此模式下I2C模块不解析地址和数据只是简单地收发位流可用于实现非标准的串行协议。时钟拉伸从机可以通过拉低SCL来通知主机“我需要更多时间处理数据”F28335的I2C模块支持此功能。4.2 I2C时钟配置与波特率计算I2C模块的时钟源是系统时钟SYSCLKOUT。其通信速率波特率由I2CPSC预分频寄存器和I2CCLKL/I2CCLKH时钟低/高时间寄存器共同决定。计算稍微复杂一些IPSCI2CPSC寄存器决定对SYSCLKOUT的预分频产生I2C模块的输入时钟I2C_CLK SYSCLKOUT / (I2CPSC 1)。波特率I2CCLKL和I2CCLKH分别定义SCL时钟低电平和高电平的持续时间以I2C_CLK周期为单位。波特率 I2C_CLK / [(I2CCLKL d) (I2CCLKH d)]其中d是一个固定值根据数据手册对于F28335通常为5-7个I2C_CLK周期。一个简化的配置方法是使用TI提供的库函数或参考例程中的经验值。例如对于SYSCLKOUT150MHz要配置为标准模式100kbps一种常见的配置是I2CPSC 9 则I2C_CLK 150MHz / 10 15MHz。设置I2CCLKL I2CCLKH 70。计算SCL周期 (706) (706) 152个I2C_CLK周期。波特率 ≈ 15MHz / 152 ≈ 98.68kHz接近100kHz。4.3 I2C通信流程与寄存器操作I2C通信是状态机驱动的需要严格按照流程操作寄存器。以下是一个向7位地址从设备地址0x50的寄存器0x00写入一个字节数据0xAB的主发送流程void I2CA_WriteByte(Uint16 slaveAddr, Uint16 regAddr, Uint16 data) { // 1. 等待I2C总线空闲 (I2CSTR.bit.BB 0) while (I2caRegs.I2CSTR.bit.BB ! 0) {} // 2. 配置为主机发送模式产生起始条件发送7位地址写位 I2caRegs.I2CMDR.all 0x6E20; // 主模式发送器7位地址起始条件不停止 // 0x6E20 0110 1110 0010 0000b // bit15: MST1 (主机), bit14: TRX1 (发送), bit13: XA0 (7位地址), // bit12: RM0, bit11: DLB0, bit10: IRS1 (I2C模块使能), // bit9: STB0, bit8: FDF0, bit7: BC000 (1字节), // bit6-0: 地址未设置通过I2CSAR设置 I2caRegs.I2CSAR slaveAddr; // 设置从机地址 (0x50) // 3. 将数据寄存器地址放入数据发送寄存器 I2caRegs.I2CDXR regAddr; // 4. 等待数据传输完成 (I2CSTR.bit.XRDY1 或 检查中断标志) while (I2caRegs.I2CSTR.bit.XRDY ! 1) {} // 5. 清除XRDY标志 (通过读取I2CSTR然后写1清除) I2caRegs.I2CSTR.bit.XRDY 1; // 6. 发送要写入的数据 I2caRegs.I2CDXR data; while (I2caRegs.I2CSTR.bit.XRDY ! 1) {} I2caRegs.I2CSTR.bit.XRDY 1; // 7. 发送停止条件 I2caRegs.I2CMDR.bit.STP 1; // 在发送完最后一个字节后产生停止条件 // 或者重新配置I2CMDR包含停止位 // I2caRegs.I2CMDR.all 0x4E20; // 与之前相同但STP1 // 8. 等待停止条件完成 (I2CSTR.bit.BB0) while (I2caRegs.I2CSTR.bit.BB ! 0) {} }重要提示I2C操作中状态寄存器I2CSTR的位清除方式比较特殊。大多数标志位如XRDY RRDY需要通过读取该寄存器然后向该位写1来清除。直接写0是无效的。这是I2C模块一个常见的“坑”。4.4 I2C中断与FIFO操作对于连续读写操作使用中断和FIFO是更高效的方式。需要配置I2CIER中断使能寄存器来使能相应中断如XRDY、ARDY等并在PIE向量表中配置好I2C中断服务程序。启用FIFO通过I2CFFTX和I2CFFRX寄存器后可以一次性向发送FIFO写入多个数据字节或从接收FIFO读取多个字节硬件会自动处理数据的搬移并在FIFO达到设定的触发深度时产生中断极大地减轻了CPU负担。5. GPIO复用配置与输入量化机制F28335拥有多达88个可编程的GPIO引脚其强大之处在于几乎每个引脚都可以通过GPxMUX和GPxQSEL寄存器复用到2-3个不同的外设功能上。这是灵活进行硬件设计的基础但也容易配置错误。5.1 复用配置流程与避坑指南配置一个引脚功能的正确流程如下禁用引脚功能在系统初始化时如果不确定引脚状态可以先将其配置为GPIO输入模式GPxDIR.bit 0并禁用上拉GPxPUD.bit 1。选择量化模式通过GPxQSEL寄存器选择输入量化模式。这是抗干扰的关键一步下文详述。选择具体功能通过GPxMUX寄存器选择引脚的具体功能GPIO、外设1、外设2或外设3。如果是GPIO输出设置GPxDIR相应位为1。如果是外设功能方向通常由外设自动控制但有些外设的输入/输出方向也需要额外配置。一个真实案例在某个电机驱动板上我将GPIO12配置为EPWM模块的故障输入引脚TZ1。上电后即使没有故障电机也经常误触发保护。排查后发现是因为GPIO12引脚靠近功率回路有严重的开关噪声。解决方案是在GPxQSEL寄存器中为该引脚配置了“采用采样窗口量化”模式并设置了合适的采样周期QUALPRD滤除了高频毛刺问题得以解决。5.2 输入量化Qualification——数字滤波器的实现输入量化是F28335 GPIO一个非常独特且重要的功能它本质上是一个数字滤波器用于消除引脚上的毛刺噪声。有三种模式仅同步到SYSCLKOUTGPxQSELn00输入信号仅经过两个系统时钟周期的同步器用于滤除亚稳态但抗毛刺能力弱。适用于干净、低速的信号。采用采样窗口量化GPxQSELn01或10这是最常用的抗干扰模式。它在一个可配置的采样窗口3次或6次采样内对输入信号进行多次采样只有当所有采样值一致时才认为输入有效。采样窗口的周期由GPxCTRL寄存器中的QUALPRD位域控制该设置按每组8个引脚进行。无同步GPxQSELn11信号直接进入外设不经过任何同步或滤波。仅用于某些内部已做同步处理的外设输入。如何配置采样窗口确定需要滤除的噪声脉宽。例如要滤除宽度小于100ns的毛刺。计算采样周期。假设系统时钟SYSCLKOUT为150MHz周期约6.67ns。QUALPRD定义的是采样间隔的SYSCLKOUT倍数。若设置QUALPRD2则采样间隔为3个SYSCLKOUT周期20ns。选择采样次数。6次采样比3次更可靠但延迟更大。总滤波时间 采样次数 * 采样间隔。上例中6次采样的总窗口为120ns足以滤除100ns的毛刺。在GPxCTRL中为对应的引脚组设置QUALPRD值并在GPxQSEL中为该引脚选择6采样模式。5.3 外设引脚冲突与默认状态查阅数据手册的GPIO Mux表格如Table 4-16至关重要。需要注意两点引脚冲突一个外设输入信号可能映射到多个GPIO引脚例如CANTXB可以映射到GPIO8或GPIO16。但同一时间只能有一个引脚被选为此外设功能其他映射引脚应配置为其他功能或GPIO否则会产生冲突。未选择时的默认状态当一个引脚未被选为某个外设功能时该外设对应的输入信号在芯片内部会被拉到一个默认状态0或1。在设计电路时尤其是使用外部中断或捕获引脚时需要了解这个默认状态避免误触发。6. 常见问题排查与调试心得串行通信调试是嵌入式开发的必修课。下面总结一些我在这颗芯片上调试SCI、SPI、I2C时最常遇到的问题和解决方法。6.1 通信完全不通时钟与波特率这是头号嫌疑犯。首先确认LSPCLK对于SCI/SPI或SYSCLKOUT对于I2C分频的频率是否与你的计算假设一致。用示波器测量SPICLK或SCITXD引脚看波形频率是否正确。对于SCI计算出的波特率误差是否在2%以内。GPIO复用错误这是最容易被忽略的步骤。用仿真器单步调试检查GPxMUX和GPxQSEL寄存器的值是否与你的硬件连接图匹配。一个技巧在初始化函数里将这些寄存器的配置值通过SCI打印出来与预期值对比。硬件连接检查TX/RX是否接反SCIMOSI/MISO是否接反SPISDA/SCL是否接反且已接上拉电阻I2C。测量引脚电压确认没有对地或对电源短路。外设时钟未使能确认PCLKCR0/1寄存器中对应外设SCIAENCLK SPIAENCLK I2CAENCLK的时钟使能位已经置1。软件复位锁对于SCI和SPI配置寄存器前需要将其软件复位位SCICTL1.0 (SW RESET)或SPICCR.7 (SPISWRESET)清0配置完成后再置1。顺序错误会导致配置不生效。6.2 通信数据错误或时好时坏电气噪声与干扰对于长距离或噪声环境下的SCI通信检查是否使用了RS-232电平转换或RS-485收发器。对于SPI和I2C检查走线是否过长是否靠近功率线。为I2C的SCL和SDA增加串联电阻如22Ω-100Ω有助于抑制信号反射。时序不匹配SPI的时钟极性和相位CPOL CPHA必须与从设备严格一致。用示波器同时抓取SPICLK和SPISIMO/SPISOMI波形对照从设备数据手册的时序图逐一检查建立时间和保持时间。中断与FIFO配置如果使用了中断或FIFO检查中断服务程序ISR是否及时清除了中断标志PIEACK和IFR。检查FIFO的触发深度设置是否合理。过浅的触发深度会导致频繁中断增加CPU负载过深则可能导致响应延迟。从设备忙状态很多I2C或SPI从设备如EEPROM ADC在完成内部操作如写周期时需要时间。主机在发送下一次命令前必须通过查询或延时等待从设备就绪。对于I2C EEPROM写操作后需要发送“查询ACK”的流程。6.3 调试工具与技巧示波器/逻辑分析仪这是最强大的调试工具。不仅能看波形、测频率还能解码SPI、I2C、UART协议直观地看到地址、数据、ACK/NACK位是定位硬件和底层时序问题的利器。软件模拟在硬件做好之前可以先用GPIO模拟SPI或I2C的时序进行初步验证和算法开发。虽然效率低但有助于理解协议。利用仿真器查看寄存器在CCS的调试模式下实时查看和修改SCI、SPI、I2C的相关寄存器特别是状态寄存器如SCIRXSTSPISTSI2CSTR里面的错误标志位FE OE PE ARDY NACK等能直接指明问题方向。分步测试法先调通最简单的功能。对于SCI先让芯片自发自收回环模式。对于SPI先尝试单字节收发。对于I2C先尝试向一个已知地址的设备发送START和STOP信号看总线是否有应答。最后保持耐心和细心。串行通信调试往往需要软硬件结合排查系统地按照“电源-时钟-配置-波形-数据”的顺序进行检查大部分问题都能迎刃而解。F28335的这些串行接口功能非常稳定和强大一旦理解透彻并配置正确将成为你项目中可靠的数据通道。
郑州网站建设
网页设计
企业官网