应用笔记 3663

MAX3420E系统调试


摘要 : 本应用笔记列出了保证MAX3420E正常工作需要的详细检查步骤,包括系统的检查过程和调试提示。

引言

当您设计了一块电路板,将MAX3420E与您喜爱的微控制器整合在一起。加电,插入USB,不能正常工作...,怎么办? 本文为您提供了答案。

第一次调试USB外设器件时,会面临很大的挑战。要使MAX3420E能够正常工作,首先需要按下列步骤进行检查。

检查USB 'B'型连接器的引脚

这是最容易出错的地方―视图是顶视图还是底视图? 引脚1在哪里? 如果您不是机械工程师,这些视图会让人感觉无所适从。图1图2可帮您解决这一问题。

图1. USB B型连接器内部结构
图1. USB B型连接器内部结构

图2. B型连接器的引脚位置,从PCB的下面看。
图2. B型连接器的引脚位置,从PCB的下面看。

图3. USB电缆线连接器
图3. USB电缆线连接器

应采用欧姆表来检查MAX3420E和USB连接器之间的连线。特别注意D+和D-。二者很容易搞反。请注意,MAX3420E与连接器D+和D-引脚之间有33Ω电阻。对于这么小的电阻,大部分测试是否接通的仪表都会发出“嘀嘀”声。如果需要检查USB电缆,请参考图3

USB “完整性”检查

本节阐述设备与USB的连接情况。完整性检查给出了D+和D-线的工作情况,在没有USB总线分析仪的情况下,这种方法非常有效。

复位处理器,将电缆连接至PC USB端口,初始化代码执行完毕后,在设置CONNECT位的语句前停止运行。该语句如下:
wreg(rUSBCTL,bmCONNECT);	// Connect to USB
在执行该语句之前,D+和D-应均为低电平。这是因为电缆的主机侧电路通过15kΩ电阻将这些信号下拉至地。现在,单步执行CONNECT语句后,MAX3420E在D+和VCC (3.3V)之间接入一个1.5kΩ内部电阻。此时,D+应变为高电平,其后会出现一些突发脉冲(图4)。

图4. 设置CONNECT = 1时,D+变为高电平,并出现一些突发脉冲。
图4. 设置CONNECT = 1时,D+变为高电平,并出现一些突发脉冲。

上面的波形是D+,下面的是D-。该突发波形持续约18s,然后消失。D+保持高电平,D-保持低电平,然后弹出下面的Windows XP消息框(图5):

图5. Windows XP提示消息
图5. Windows XP提示消息

怎么回事?
请注意,程序为单步执行。到目前为止所作的只是连接了D+上拉电阻。该上拉提示PC有新的USB设备刚刚插入,因此PC开始向该设备发送信号,确定设备类型。这就是图4中的脉冲信号。由于微控制器代码停止运行,因此不会命令MAX3420E做出任何响应。PC由于没有收到响应信号,最终决定(18秒后)忽略该设备。D+为高电平和D-为低电平的总线状态称为“USB总线挂起”或者“挂起”。主机停止发送任何信号,MAX3420E的D+上拉电阻保持D+信号为高电平。

图6. 总线工作情况说明(没有画出NAK)
图6. 总线工作情况说明(没有画出NAK)

图6所示为利用LeCroy Instruments (LeCroy兼并了CATC,CATC是该分析仪的最初生产商)的USB总线分析仪测得的总线过程。当PC探测到设备插入后(CONNECT = 1),它发出一个USB总线复位信号(没有画出)。然后,在Transfer 0,它发出一个“GET_DESCRIPTOR”请求以获取“DEVICE”类型。5.687s之后,PC发出第二个USB总线复位信号,再尝试5.578s,要求得到设备描述符。PC第三次复位总线,再尝试5.580s,然后挂起总线并放弃尝试。由于没有运行固件,设备不会听取或应答(ACK) PC的请求。

图7. 图6中第一次传输过程展开后的数据包和NAK握手信号
图7. 图6中第一次传输过程展开后的数据包和NAK握手信号

为清晰起见,图6没有画出MAX3420E回送的NAK (非应答)握手信号。图7将第一次传输过程展开,详细地显示数据包。现在可以看到Transfer 0以下面三个封包开始:
  1. 主机向刚刚连上的设备 在这种情况下,USB发送地址0)发送一个SETUP包(63)。
  2. 主机发送一个DATA包(64),包含一个8字节“操作码”。
  3. 外设(MAX3420E)回送一个ACK包(65),确认无差错地收到两个主机封包。
如果打开含有MAX3420E的系统,插入USB,设置CONNECT = 1 (但是不再进行其他操作),MAX3420E将发出ACK握手包(上面第3步的65字节包)。MAX3420E硬件自动应答CONTROL传输的SETUP阶段,这是由USB规范规定的。

接下来,主机开始发送IN请求,并从Transaction 1开始。对应每个IN请求,MAX3420E回送NAK (非应答)握手信号。这是因为还没有运行程序,因此,与MAX3420E连接的微控制器不会收到SUDAV IRQ (Setup数据就绪中断请求)。


注意:MAX3420E通过置位SUDAV IRQ,提示微控制器收到了SETUP包。该信息通知微控制器需要对数据包解码,并回送要求的数据作为响应。


这些IN-NAK过程持续5.687s,此时PC会复位总线,开始第二次尝试。图4中的脉冲信号即是IN-NAK过程。如果仔细观察示波器,5s后波形将略有变化—这对应总线复位(D+和D-同时置低约30ms),其后是另一个SETUP包。然后,IN-NAK再持续5s。

供参考:另一个分析仪

图8. Beagle分析仪
图8. Beagle分析仪

产生图6和图7波形的USB总线分析仪可能超出了您的预算。尽管本应用笔记假设您只有一个示波器和欧姆表,我们还是强烈建议在USB开发过程中使用USB总线分析仪。我们使用的LeCroy/CATC具有多种优点,包括友好的界面和丰富的软件,最重要的是它享有工业标准USB测量工具的美誉。通过比对CATC波形来确定实际情况,解决了许多争论不休的问题(硬件、软件和芯片等)。总线总是如实反映情况。

幸亏现在有低成本USB分析仪。图8所示为Beagle-USB的屏幕截图。Beagle分析仪能够以比LeCroy/CATC低很多的价格显示总线的工作情况。如果对比图8中的Index 10和图6中的64字节数据包,会发现它们显示了完全相同的SETUP数据包。

检查进程

如果观察到了图4中的信号,已经可以确定USB连接器的连线是正确的,而且MAX3420E供电正常。如果还没有观察到该显示,可以尝试以下措施:
  • 测量MAX3420E的RES#引脚,确定其为高电平。
  • 测量晶振,确保其振荡频率为12MHz。必须是12MHz ±0.25%才能满足USB规范。如果超出容限,检查所连接的负载电容是否与并联谐振晶体所规定的电容一致(通常采用18pF)。
  • 检查VCC是否为3.3V。
  • 检查系统接口电压VL。确保不超过3.6V。
  • 如果由VBUS通过一个3.3V稳压器对MAX3420E的VCC引脚供电,确定连接了USB。否则,MAX3420E的VCC无法供电。

注意:由于固件运行与否和USB电缆连接无关,因此,与总线供电的设计相比,调试自供电设计要简单一些。可以先采用外部电源对样机供电。如果需要,以后可以再转为总线供电。


下一步检查您的控制器是否能够成功地通过SPI总线与MAX3420E寄存器组进行通信。

检查rreg()和wreg()。

编写任何程序,无论是采用Maxim的实例代码还是自己从头开始编写代码,都需要使用读写MAX3420E寄存器的函数。下面的例子使用了这些函数原型:
unsigned char rreg(BYTE r);   // Read a MAX3420E register byte
void wreg(BYTE r,BYTE v);     // Write a MAX3420E register byte
在调试处理USB传输的代码前,先编写一个简单的子程序来测试这些函数。参见图9的例子:

图9. 单步执行,检查“rd” 8次,验证SPI接口与MAX3420E的通信情况。
图9. 单步执行,检查“rd” 8次,验证SPI接口与MAX3420E的通信情况。

图9中的测试代码先复位MAX3420E,然后向USBIEN寄存器写入每字节移动1位的8个字节。每个字节中有一位置位,从00000001开始,然后是00000010,最终以10000000结束。单步执行该函数,检查“rd”值8次,确定其值为0x01,0x02,0x04,0x08,0x10,0x20,0x40和0x80。如果是这样,则可以确定SPI接口寄存器的写和读操作均正常。如果能够写入USBIEN寄存器,并可靠的读回其内容,那么就可以读写所有的MAX3420E寄存器。

图10. 采用MAXQ2000微控制器的Rowley CrossStudio开发工具,单步执行,检查变量值。将光标指向“rd”,其数值会弹出。
图10. 采用MAXQ2000微控制器的Rowley CrossStudio开发工具,单步执行,检查变量值。将光标指向“rd”,其数值会弹出。

图10所示为采用CrossStudio调试MAXQ2000微控制器的屏幕截图。将光标指向“rd”变量时,将激活弹出窗口(截图没有显示光标)。单步执行代码时,可采用这种方式来查看任何变量。

测试代码首先设置微处理器SPI端口。对应每种微处理器类型和特定IO引脚分配,SPI_Init()函数各不相同。然后,代码向PINCTL寄存器写入0x10,设置MAX3420E SPI接口为全双工工作模式。这将置位FDUPSPI位。代码置位CHIPRES位,然后对其清零,使MAX3420E处于已知的状态。建议在代码的开始部分包含芯片复位功能,从而在每一个调试周期的开始使MAX3420E处于已知的状态。

如果图10中的代码没有产生正确的结果,应检查SPI信号,确定其工作是否正常。

图11. 执行第一次wreg()调用
图11. 执行第一次wreg()调用

测试程序test_SPI()中的第一次wreg()调用,向MAX3420E的寄存器17写入数值0x10。SPI总线的波形应与图11所示一致。


注意:图11所示的波形使用SPI模式(0,0),在SCLK的上升沿采样SPI数据,SCLK的空闲电平为低电平。SPI接口不同,显示的波形会有不同的脉冲持续时间,但是对应SCLK上升沿的数值应该相同。


每次访问SPI的第一个字节是命令字节,其字节格式如图12所示。注意图11中对应前一部分SLCK上升沿的MOSI波形,位模式10001010指定寄存器17 (第7位至第3位是10001,数值为17)。同样,第1位为高电平,表明是写操作。第二个字节的位模式是00010000。这是写入寄存器17的数据,即0x10 (只有第4位FDUPSPI寄存器位置位)。因此,该SPI访问将0x10写入寄存器17,置位FDUPSPI位。

图12. MAX3420E命令字节格式
图12. MAX3420E命令字节格式

得到这些波形的一种简单方法是设置示波器或者逻辑分析仪在SS#的下降沿触发,单步执行wreg()调用。

图13. 第一次写入USBIEN寄存器(test_SPI函数)
图13. 第一次写入USBIEN寄存器(test_SPI函数)

test_SPI()中的下一条语句是rreg()函数。第一次进入循环体时,将数值0x01写入USBIEN寄存器,如图13所示。

图14. 第一次调用rreg()函数
图14. 第一次调用rreg()函数

然后,test_SPI()函数读回USBIEN寄存器的数值,第一次通过循环体时,应等于1 (图14)。每次通过循环体时,写入和读回的位应向左移动一个SCLK边沿。

MAX3420E寄存器写和读操作验证完毕后,可以进一步调试程序。到目前为止所有的检查步骤均属于“完整性检查”。现在,我们开始实际处理USB通信功能的第一步:需要处理器响应不同的MAX3420E中断请求位。

IRQ位设置

似乎应该USB总线通信开始后MAX3420E才会置位中断请求位。实际上,当MAX3420E上电时,就会有IRQ位置位,当插入USB电缆和设置CONNECT = 1时,又有其他IRQ位置位。下面介绍该启动过程的中断请求情况。

完成复位

当MAX3420E完成复位后,即使还没有插入USB,某些中断请求位就会置位。这些位是:

EPIRQ寄存器:
  • IN3BAVIRQ
  • IN2BAVIRQ
  • IN0BAVIRQ
EPIRQ寄存器的初始值应为0x19。MAX3420E置位这三个IRQ位,指示三个IN端点FIFO已经准备就绪,可以装入数据。BAV表示“Buffer Available”。

USBIRQ寄存器:
  • OSCOKIRQ
USBIRQ寄存器的初始值应为0x01。上电时,MAX3420E启动其片内振荡器。振荡器稳定后,MAX3420E置位OSCOKIRQ位,指示已经准备就绪,可以进行工作。如果程序没有通过OSCOKIRQ位检查,请确定VCC引脚电压为3.3V。VCC为振荡器供电。


注意:MAX3420E IRQ寄存器位不论其对应的使能位(在EPIEN和USBIEN寄存器中)是否置位,均可有效置位。使能位决定是否将请求位传送到驱动INT引脚的逻辑电路。参见应用笔记3661,MAX3420E中断系统,了解更详细的信息。


USB插入后

插入USB (CONNECT = 0)后,即使USB没有通信,仍有一些USBIRQ位会置位。EPIRQ位与上面的情况一致,但是更多的USBIRQ位将置位:

USBIRQ寄存器:
  • OSCOKIRQ
  • VBUSIRQ (可能)
VBUSIRQ位指示MAX3420E通过检测VBCOMP引脚上的5V信号,探测到插入了USB电缆。这假定您已经将USB连接器的VBUS引脚连接至MAX3420E微控制器(VBUS比较器)的输入引脚。


注意:USB连接器的VBUS引脚接MAX3420E的VBCOMP输入引脚是可选项。VBCOMP引脚不对MAX3420E内部供电。它只连接至内部VBUS比较器。


设置CONNECT = 1之后

连接USB使主机发出一个总线复位信号,产生Get_Descriptor-Device请求,最终挂起总线。这些操作会置位USBIRQ寄存器中的更多IRQ位。注意,USB总线复位将清除VBUSIRQ位。

EPIRQ寄存器:
  • IN3BAVIRQ
  • IN2BAVIRQ
  • IN0BAVIRQ
  • SUDAVIRQ (通信开始后)
USBIRQ寄存器:
  • OSCOKIRQ
  • URESIRQ
  • URESDNIRQ
  • SUSPIRQ (最后)
如果将VBUS接VBCOMP引脚,USBIRQ寄存器读数为0x8D,并持续约20s,然后由于主机挂起总线,读数变为0x9D。

接下来的情况会取决于您的代码。如果您观察到的情况和前面吻合,则表明系统一切正常,可以继续往下检查您的代码。

调试方法:通过3个步骤触发中断

剩下的检查是确保固件能够正确响应PC发出的不同USB请求命令,并由MAX3420E给出相应信号。如果启动程序,插入USB后,什么也没有发生(可能会出现Windows USB错误消息),那么可能是您的程序没有处理中断。下面的调试方法可以帮助解决这些中断问题。

第1步: 轮询IRQ位

首先,编写代码直接轮询IRQ位,当关心的IRQ位置位后,使处理器进行相应操作。即使主程序循环进行直接轮询,也最好使能中断(各IEN位 = 1和IE = 1)。这样可以通过观察MAX3420E INT引脚来了解其工作情况。这一步有效地取消了微控制器中断系统(和代码)检查,使您能够集中精力实现正确的USB功能。当连续读取EPIRQ和USBIRQ寄存器时,不必担心浪费的SPI周期—这一步的目的是使USB正常工作。

第2步: 轮询INT引脚状态

一旦USB工作正常后,进行第二步,修改程序来轮询MAX3420E INT引脚状态,检查悬挂的中断。如果第1步已经验证了程序,那么在程序主循环中有部分代码一直读取EPIRQ和USBIRQ寄存器,检查悬挂的中断。插入轮询微控制器中断引脚状态(连接在MAX3420E INT引脚上)的语句,修改第1步的连续检查。如果MAX3420E INT引脚未产生中断,可以跳过读取EPIRQ和USBIRQ寄存器的语句。这种简单的检查方式极大地减少了微控制器和MAX3420E之间的SPI数据流量,这是因为只有IRQ位置位时,才对其进行测试。

第3步: 检查微控制器中断程序

第3步也是最后一步,将MAX3420E整合到微处理器的中断系统中。这通常要写一个中断向量,以自动将程序执行位置指向MAX3420E处理程序。

相关型号
MAX3420E 免费样品
下一步
EE-Mail 订阅EE-Mail,接收关于您感兴趣的新文档的自动通知。
© , Maxim Integrated Products, Inc.
The content on this webpage is protected by copyright laws of the United States and of foreign countries. For requests to copy this content, contact us.
APP 3663:
应用笔记 3663,AN3663, AN 3663, APP3663, Appnote3663, Appnote 3663