极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12450|回复: 2

Arduino 控制USB设备(2)硬件测试篇

[复制链接]
发表于 2015-6-22 09:54:29 | 显示全部楼层 |阅读模式
这篇文章目标是让你知道你买的USB Host Shield能否正常工作。

我们要运行一段代码来确保板子工作正常。从经验的角度来看,这个非常必要,对于很多卖家来说,板子之间的差别只有进货价格的高低,他们对于质量一无所知。

下面例子中的代码来自 http://www.circuitsathome.com/mcu/arduino-usb-host-part-2-classes

第一个代码是测试SPI通信是否正常

  1. /* MAX3421E USB Host controller SPI test */
  2. /* This sketch tests SPI communication between Arduino and MAX3421E USB host controller */
  3. #include <spi.h>
  4. #include "max3421e.h"

  5. void setup();
  6. void loop();

  7. byte i;
  8. byte j = 0;
  9. byte gpinpol_copy;

  10. MAX3421E Max;

  11. void setup()
  12. {
  13.     Serial.begin( 9600 );
  14.     Max.powerOn();
  15.     delay(200);
  16. }

  17. void loop()
  18. {
  19.   gpinpol_copy = Max.regRd( rGPINPOL );
  20.   Serial.println("SPI test. Each  '.' indicates 64K transferred. Press any key to stop.");
  21.   while( Serial.available() == 0 ) {
  22.     for( i = 0; i < 255; i++ ) {
  23.       Max.regWr( rGPINPOL, i );
  24.       if( Max.regRd( rGPINPOL ) != i ) {
  25.         Serial.println("SPI transmit/receive mismatch");
  26.       }
  27.     }//for( i = 0; i < 255; i++
  28.       j++;
  29.       if( j == 0 ) {
  30.         Serial.print(".");
  31.       }
  32.   }//while( Serial.available() == 0
  33.   Max.regWr( rGPINPOL, gpinpol_copy );
  34.   Serial.println("\r\nStopped.");
  35.   while( 1 );    //stop here
  36. }
复制代码


运行结果



下面这个代码测试的是 MAX3421E 寄存器是否正常
  1. /* This sketch dumps MAX3421E registers */
  2. #include <spi.h>
  3. #include "max3421e.h"

  4. MAX3421E Max;  //MAX3421E instance

  5. /* Regiser names/numbers for MAX3421E register dump */
  6. typedef struct {
  7.   const char* name;
  8.   char number;
  9. }
  10. REGISTER_OUTPUT;

  11. REGISTER_OUTPUT max_register[] = {
  12.   { "\r\nRCVFIFO:\t",   rRCVFIFO    },
  13.   { "\r\nSNDFIFO:\t",   rSNDFIFO    },
  14.   { "\r\nSUDFIFO:\t",   rSUDFIFO    },
  15.   { "\r\nRCVBC:\t",     rRCVBC      },
  16.   { "\r\nSNDBC:\t",     rSNDBC      },
  17.   { "\r\nUSBIRQ:\t",    rUSBIRQ     },
  18.   { "\r\nUSBIEN:\t",    rUSBIEN     },
  19.   { "\r\nUSBCTL:\t",    rUSBCTL     },
  20.   { "\r\nCPUCTL:\t",    rCPUCTL     },
  21.   { "\r\nPINCTL:\t",    rPINCTL     },
  22.   { "\r\nREVISION:\t",  rREVISION   },
  23.   { "\r\nIOPINS1:\t",   rIOPINS1    },
  24.   { "\r\nIOPINS2:\t",   rIOPINS2    },
  25.   { "\r\nGPINIRQ:\t",   rGPINIRQ    },
  26.   { "\r\nGPINIEN:\t",   rGPINIEN    },
  27.   { "\r\nGPINPOL:\t",   rGPINPOL    },
  28.   { "\r\nHIRQ:\t",      rHIRQ       },
  29.   { "\r\nHIEN:\t",      rHIEN       },
  30.   { "\r\nMODE:\t",      rMODE       },
  31.   { "\r\nPERADDR:\t",   rPERADDR    },
  32.   { "\r\nHCTL:\t",      rHCTL       },
  33.   { "\r\nHXFR:\t",      rHXFR       },
  34.   { "\r\nHRSL:\t",      rHRSL       }
  35. };


  36. void setup()
  37. {
  38.   Serial.begin( 9600 );
  39.   Max.powerOn();
  40. }

  41. void loop()
  42. {
  43.   unsigned char i;
  44.   unsigned char numregs = sizeof( max_register )/sizeof( REGISTER_OUTPUT);
  45.   for( i = 0; i < numregs; i++ ) {
  46.     Serial.print( max_register[ i ].name);
  47.     print_hex( Max.regRd( max_register[ i ].number ), 8 );
  48.   }
  49.   while(1);

  50. }

  51. /* prints hex numbers with leading zeroes */
  52. // copyright, Peter H Anderson, Baltimore, MD, Nov, '07
  53. // source: [url]http://www.phanderson.com/arduino/arduino_display.html[/url]
  54. void print_hex(int v, int num_places)
  55. {
  56.   int mask=0, n, num_nibbles, digit;

  57.   for (n=1; n<=num_places; n++)
  58.   {
  59.     mask = (mask << 1) | 0x0001;
  60.   }
  61.   v = v & mask; // truncate v to specified number of places

  62.   num_nibbles = num_places / 4;
  63.   if ((num_places % 4) != 0)
  64.   {
  65.     ++num_nibbles;
  66.   }

  67.   do
  68.   {
  69.     digit = ((v >> (num_nibbles-1) * 4)) & 0x0f;
  70.     Serial.print(digit, HEX);
  71.   }
  72.   while(--num_nibbles);

  73. }
复制代码


运行结果



下面这个代码测试的是 USB 当前状态

  1. /* MAX3421E interrupt loop */
  2. #include <spi.h>
  3. #include "max3421e.h"

  4. MAX3421E Max;

  5. byte rcode;
  6. byte vbus_state;

  7. void setup()
  8. {
  9.   Serial.begin( 9600 );
  10.   Serial.println("Start");
  11.   Max.powerOn();
  12. }

  13. void loop()
  14. {
  15.   Max.Task();
  16.   print_vbus_state();
  17. }

  18. void print_vbus_state( void )
  19. {
  20.   char* vbus_states[] = { "Disconnected", "Illegal", "Full speed", "Low speed" };
  21.   byte tmpbyte;
  22.   static byte last_state = 4;
  23.     tmpbyte = Max.getVbusState();
  24.     if( tmpbyte != last_state ) {
  25.       last_state = tmpbyte;
  26.       Serial.println( vbus_states[ tmpbyte ] );
  27.     }
  28.     return;
  29. }
复制代码


刚开始没有插任何设备,显示为 Disconnected 状态。之后插入一个USB鼠标,识别为Low Speed设备。拔掉之后再插入两个不同的U盘,因为IC本身不支持High Speed,所以都显示为Full Speed设备。



最后,三个修改后的完整代码可以在这里下载:




经过上述测试,可以确定你的板子没问题。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2015-6-23 18:35:34 | 显示全部楼层
谢谢分享学习一下
回复 支持 反对

使用道具 举报

发表于 2015-9-13 19:18:50 | 显示全部楼层
支持一下 在看lz 的Arduino 控制USB设备系列
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-17 00:23 , Processed in 0.048792 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表