Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 #include "Max3421e.h"
00033 
00034 
00035 static byte vbusState;
00036 
00037 
00038 
00039 #define INT             PE6
00040 #define INT_PORT        PORTE
00041 #define INT_DDR         DDRE
00042 #define INT_PIN         PINE
00043 
00044 #define RST             PJ2
00045 #define RST_PORT        PORTJ
00046 #define RST_DDR         DDRJ
00047 #define RST_PIN         PINJ
00048 
00049 #define GPX             PJ3
00050 #define GPX_PORT        PORTJ
00051 #define GPX_DDR         DDRJ
00052 #define GPX_PIN         PINJ
00053 
00054 
00055 void MAX3421E::setRST(uint8_t val)
00056 {
00057         if (val == LOW)
00058                 RST_PORT &= ~_BV(RST);
00059         else
00060                 RST_PORT |= _BV(RST);
00061 }
00062 
00063 uint8_t MAX3421E::readINT(void)
00064 {
00065         return INT_PIN & _BV(INT) ? HIGH : LOW;
00066 }
00067 
00068 uint8_t MAX3421E::readGPX(void)
00069 {
00070         
00071         return LOW;
00072 }
00073 
00074 
00075 void MAX3421E::pinInit(void)
00076 {
00077         INT_DDR &= ~_BV(INT);
00078         RST_DDR |= _BV(RST);
00079         digitalWrite(MAX_SS,HIGH);   
00080         setRST(HIGH);
00081 }
00082 
00083 
00084 
00085 MAX3421E::MAX3421E()
00086 {
00087     spi_init();  
00088         pinInit();
00089 }
00090 
00091 byte MAX3421E::getVbusState( void )
00092 { 
00093     return( vbusState );
00094 }
00095 
00096 
00097 
00098 
00099 
00100 
00101 
00102 
00103 
00104 
00105 
00106 
00107 
00108 
00109 
00110 
00111 
00112 
00113 
00114 
00115 
00116 
00117 
00118 
00119 
00120 void MAX3421E::regWr( byte reg, byte val)
00121 {
00122       digitalWrite(MAX_SS,LOW);
00123       SPDR = ( reg | 0x02 );
00124       while(!( SPSR & ( 1 << SPIF )));
00125       SPDR = val;
00126       while(!( SPSR & ( 1 << SPIF )));
00127       digitalWrite(MAX_SS,HIGH);
00128       return;
00129 }
00130 
00131 
00132 char * MAX3421E::bytesWr( byte reg, byte nbytes, char * data )
00133 {
00134     digitalWrite(MAX_SS,LOW);
00135     SPDR = ( reg | 0x02 );
00136     while( nbytes-- ) {
00137       while(!( SPSR & ( 1 << SPIF )));  
00138       SPDR = ( *data );               
00139       data++;                         
00140     }
00141     while(!( SPSR & ( 1 << SPIF )));
00142     digitalWrite(MAX_SS,HIGH);
00143     return( data );
00144 }
00145 
00146 
00147 
00148 void MAX3421E::gpioWr( byte val )
00149 {
00150     regWr( rIOPINS1, val );
00151     val = val >>4;
00152     regWr( rIOPINS2, val );
00153     
00154     return;     
00155 }
00156 
00157 byte MAX3421E::regRd( byte reg )    
00158 {
00159   byte tmp;
00160     digitalWrite(MAX_SS,LOW);
00161     SPDR = reg;
00162     while(!( SPSR & ( 1 << SPIF )));
00163     SPDR = 0; 
00164     while(!( SPSR & ( 1 << SPIF )));
00165     digitalWrite(MAX_SS,HIGH); 
00166     return( SPDR );
00167 }
00168 
00169 
00170 char * MAX3421E::bytesRd ( byte reg, byte nbytes, char  * data )
00171 {
00172     digitalWrite(MAX_SS,LOW);
00173     SPDR = reg;      
00174     while(!( SPSR & ( 1 << SPIF )));    
00175     while( nbytes ) {
00176       SPDR = 0; 
00177       nbytes--;
00178       while(!( SPSR & ( 1 << SPIF )));
00179       *data = SPDR;
00180       data++;
00181     }
00182     digitalWrite(MAX_SS,HIGH);
00183     return( data );   
00184 }
00185 
00186 
00187 byte MAX3421E::gpioRd( void )
00188 {
00189  byte tmpbyte = 0;
00190     tmpbyte = regRd( rIOPINS2 );            
00191     tmpbyte &= 0xf0;                        
00192     tmpbyte |= ( regRd( rIOPINS1 ) >>4 ) ;  
00193     return( tmpbyte );
00194 }
00195 
00196 boolean MAX3421E::reset()
00197 {
00198   byte tmp = 0;
00199     regWr( rUSBCTL, bmCHIPRES );                        
00200     regWr( rUSBCTL, 0x00 );                             
00201     while(!(regRd( rUSBIRQ ) & bmOSCOKIRQ )) {          
00202         tmp++;                                          
00203         if( tmp == 0 ) {
00204             return( false );
00205         }
00206     }
00207     return( true );
00208 }
00209 
00210 
00211 
00215 boolean MAX3421E::vbusPwr ( boolean action )
00216 {
00217 
00218 
00219 
00220 
00221 
00222 
00223 
00224 
00225 
00226 
00227 
00228 
00229 
00230 
00231 
00232     return( true );                                             
00233 }
00234 
00235 void MAX3421E::busprobe( void )
00236 {
00237  byte bus_sample;
00238     bus_sample = regRd( rHRSL );            
00239     bus_sample &= ( bmJSTATUS|bmKSTATUS );      
00240     switch( bus_sample ) {                          
00241         case( bmJSTATUS ):
00242             if(( regRd( rMODE ) & bmLOWSPEED ) == 0 ) {
00243                 regWr( rMODE, MODE_FS_HOST );       
00244                 vbusState = FSHOST;
00245             }
00246             else {
00247                 regWr( rMODE, MODE_LS_HOST);        
00248                 vbusState = LSHOST;
00249             }
00250             break;
00251         case( bmKSTATUS ):
00252             if(( regRd( rMODE ) & bmLOWSPEED ) == 0 ) {
00253                 regWr( rMODE, MODE_LS_HOST );       
00254                 vbusState = LSHOST;
00255             }
00256             else {
00257                 regWr( rMODE, MODE_FS_HOST );       
00258                 vbusState = FSHOST;
00259             }
00260             break;
00261         case( bmSE1 ):              
00262             vbusState = SE1;
00263             break;
00264         case( bmSE0 ):              
00265                 regWr( rMODE, bmDPPULLDN|bmDMPULLDN|bmHOST|bmSEPIRQ);
00266             vbusState = SE0;
00267             break;
00268         }
00269 }
00270 
00271 void MAX3421E::powerOn()
00272 {
00273     
00274     regWr( rPINCTL,( bmFDUPSPI + bmINTLEVEL + bmGPXB ));    
00275     if( reset() == false ) {                                
00276         Serial.println("Error: OSCOKIRQ failed to assert");
00277     }
00278 
00279     
00280     regWr( rMODE, bmDPPULLDN|bmDMPULLDN|bmHOST|bmSEPIRQ );      
00281     regWr( rHIEN, bmCONDETIE|bmFRAMEIE );                                             
00282     
00283     regWr( rHCTL,bmSAMPLEBUS );                                             
00284     while(!(regRd( rHCTL ) & bmSAMPLEBUS ));                                
00285     busprobe();                                                             
00286     regWr( rHIRQ, bmCONDETIRQ );                                            
00287     regWr( rCPUCTL, 0x01 );                                                 
00288 }
00289 
00290 byte MAX3421E::Task( void )
00291 {
00292  byte rcode = 0;
00293  byte pinvalue;
00294     
00295     
00296  pinvalue = readINT();
00297  if( pinvalue  == LOW ) {
00298         rcode = IntHandler();
00299     }
00300     pinvalue = readGPX();
00301     if( pinvalue == LOW ) {
00302         GpxHandler();
00303     }
00304 
00305     return( rcode );   
00306 }   
00307 byte MAX3421E::IntHandler()
00308 {
00309  byte HIRQ;
00310  byte HIRQ_sendback = 0x00;
00311     HIRQ = regRd( rHIRQ );                  
00312     
00313     
00314     
00315     if( HIRQ & bmCONDETIRQ ) {
00316         busprobe();
00317         HIRQ_sendback |= bmCONDETIRQ;
00318     }
00319     
00320     regWr( rHIRQ, HIRQ_sendback );
00321     return( HIRQ_sendback );
00322 }
00323 byte MAX3421E::GpxHandler()
00324 {
00325  byte GPINIRQ = regRd( rGPINIRQ );          
00326 
00327 
00328 
00329 
00330 
00331 
00332     return( GPINIRQ );
00333 }
00334 
00335 
00336 
00337 
00338 
00339