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