uint16_t Readout7705( uint8_t ChannelSelect ) { uint8_t state, ResultH, ResultL; BOOL isReady; uint16_t iRetry; for ( iRetry = 20u; iRetry; --iRetry ) { ShiftOut( RS_0 + READ + ChannelSelect ); state = ShiftIn(); isReady = ( state & DRDY ) ? FALSE : TRUE; // DRDY 低电平有效 if ( isReady ) { ShiftOut( RS_3 + READ + ChannelSelect ); // do Read ResultH = ShiftIn(); ResultL = ShiftIn(); return ( ResultL + ( ResultH * 256u )); } delay( 10u ); } return 0u; // failure !!! }
BOOL Initialize7705( ) { uint8_t i; bus_SPI1xPortInit(); for( i = 7u; i != 0u; --i ) { ShiftOut( 0xFFu ); } ShiftOut( RS_4 ); // Test Register, 8 Bits ShiftOut( 0x00u ); // Default: 0x00 ShiftOut( RS_2 ); // Clock Register, 8 Bits ShiftOut( CLKDIV + FS_1_0 ); // 50Hz @ 4.9152MHz ShiftOut( RS_1 + 0u ); // 启动指定通道的自校准转换 ShiftOut( MD_1 + BIPOLAR + G_5 + BUF ); delay( 300u ); ShiftOut( RS_1 + 1u ); // 启动指定通道的自校准转换 ShiftOut( MD_1 + BIPOLAR + G_4 + BUF ); delay( 300u); return TRUE; }
void Convert7705( uint8_t ChannelSelect ) { ShiftOut( RS_1 + ChannelSelect ); // 启动指定通道的校准转换 if( 0u == ChannelSelect ) { ShiftOut( MD_0 + BIPOLAR + G_5 + BUF ); } else { ShiftOut( MD_0 + BIPOLAR + G_4 + BUF ); } ShiftOut( RS_3 + READ + ChannelSelect ); // Reset DRDY# ShiftIn(); ShiftIn(); }
int main(void){ ADCInitChar(); DDRB |= (1<<2)|(1<<0)|(1<<1); char Temp; float Hold; float Read; while(1){ Read = ADCReadChar(2); Hold = (((Read / 100.) - .75 ) * 100.) + 25; Temp = (char)(Hold); PORTB &= ~(1<<1); ShiftOut(2, 0, Temp); PORTB |= (1<<1); } }
void TD_Poll(void) // Called repeatedly while the device is idle { if(!Running) return; if(!(EP1INCS & bmEPBUSY)) { if(Pending > 0) { BYTE o, n; AUTOPTRH2 = MSB( EP1INBUF ); AUTOPTRL2 = LSB( EP1INBUF ); XAUTODAT2 = 0x31; XAUTODAT2 = 0x60; if(Pending > 0x3E) { n = 0x3E; Pending -= n; } else { n = Pending; Pending = 0; }; o = n; #ifdef USE_MOD256_OUTBUFFER AUTOPTR1H = MSB( OutBuffer ); AUTOPTR1L = FirstDataInOutBuffer; while(n--) { XAUTODAT2 = XAUTODAT1; AUTOPTR1H = MSB( OutBuffer ); // Stay within 256-Byte-Buffer }; FirstDataInOutBuffer = AUTOPTR1L; #else AUTOPTR1H = MSB( &(OutBuffer[FirstDataInOutBuffer]) ); AUTOPTR1L = LSB( &(OutBuffer[FirstDataInOutBuffer]) ); while(n--) { XAUTODAT2 = XAUTODAT1; if(++FirstDataInOutBuffer >= OUTBUFFER_LEN) { FirstDataInOutBuffer = 0; AUTOPTR1H = MSB( OutBuffer ); AUTOPTR1L = LSB( OutBuffer ); }; }; #endif SYNCDELAY; EP1INBC = 2 + o; TF2 = 1; // Make sure there will be a short transfer soon } else if(TF2) { EP1INBUF[0] = 0x31; EP1INBUF[1] = 0x60; SYNCDELAY; EP1INBC = 2; TF2 = 0; }; }; if(!(EP2468STAT & bmEP2EMPTY) && (Pending < OUTBUFFER_LEN-0x3F)) { BYTE i, n = EP2BCL; AUTOPTR1H = MSB( EP2FIFOBUF ); AUTOPTR1L = LSB( EP2FIFOBUF ); for(i=0;i<n;) { if(ClockBytes > 0) { BYTE m; m = n-i; if(ClockBytes < m) m = ClockBytes; ClockBytes -= m; i += m; if(WriteOnly) /* Shift out 8 bits from d */ { while(m--) ShiftOut(XAUTODAT1); } else /* Shift in 8 bits at the other end */ { while(m--) OutputByte(ShiftInOut(XAUTODAT1)); } } else { BYTE d = XAUTODAT1; WriteOnly = (d & bmBIT6) ? FALSE : TRUE; if(d & bmBIT7) { /* Prepare byte transfer, do nothing else yet */ ClockBytes = d & 0x3F; } else { /* Set state of output pins */ TCK = (d & bmBIT0) ? 1 : 0; TMS = (d & bmBIT1) ? 1 : 0; TDI = (d & bmBIT4) ? 1 : 0; /* Optionally read state of input pins and put it in output buffer */ if(!WriteOnly) OutputByte(2|TDO); }; i++; }; }; SYNCDELAY; EP2BCL = 0x80; // Re-arm endpoint 2 }; }