DSTATUS disk_initialize ( BYTE drv /* Physical drive nmuber (0) */ ) { UINT cmd, n; DWORD resp[4]; BYTE ty; if (drv) return STA_NOINIT; /* Supports only single drive */ if (Stat & STA_NODISK) return Stat; /* No card in the socket */ power_on(); /* Force socket power on */ MCI_CLOCK = 0x100 | (PCLK/MCLK_ID/2-1); /* Set MCICLK = MCLK_ID */ for (Timer[0] = 2; Timer[0]; ); LEDR_ON(); send_cmd(CMD0, 0, 0, NULL); /* Enter idle state */ CardRCA = 0; /*---- Card is 'idle' state ----*/ Timer[0] = 1000; /* Initialization timeout of 1000 msec */ if (send_cmd(CMD8, 0x1AA, 1, resp) /* SDC Ver2 */ && (resp[0] & 0xFFF) == 0x1AA) { /* The card can work at vdd range of 2.7-3.6V */ do { /* Wait while card is busy state (use ACMD41 with HCS bit) */ if (!Timer[0]) goto di_fail; } while (!send_cmd(ACMD41, 0x40FF8000, 1, resp) || !(resp[0] & 0x80000000)); ty = (resp[0] & 0x40000000) ? CT_SD2 | CT_BLOCK : CT_SD2; /* Check CCS bit in the OCR */ } else { /* SDC Ver1 or MMC */ if (send_cmd(ACMD41, 0x00FF8000, 1, resp)) { ty = CT_SD1; cmd = ACMD41; /* ACMD41 is accepted -> SDC Ver1 */ } else { ty = CT_MMC; cmd = CMD1; /* ACMD41 is rejected -> MMC */ } do { /* Wait while card is busy state (use ACMD41 or CMD1) */ if (!Timer[0]) goto di_fail; } while (!send_cmd(cmd, 0x00FF8000, 1, resp) || !(resp[0] & 0x80000000)); } CardType = ty; /* Save card type */ bswap_cp(&CardInfo[32], resp); /* Save OCR */ /*---- Card is 'ready' state ----*/ if (!send_cmd(CMD2, 0, 2, resp)) goto di_fail; /* Enter ident state */ for (n = 0; n < 4; n++) bswap_cp(&CardInfo[n * 4 + 16], &resp[n]); /* Save CID */ /*---- Card is 'ident' state ----*/ if (ty & CT_SDC) { /* SDC: Get generated RCA and save it */ if (!send_cmd(CMD3, 0, 1, resp)) goto di_fail; CardRCA = (WORD)(resp[0] >> 16); } else { /* MMC: Assign RCA to the card */ if (!send_cmd(CMD3, 1 << 16, 1, resp)) goto di_fail;
int main(void) { uint8_t i; uint8_t ChkSum; cli(); //#asm("cli"); DDRB = 0x00; //PB INPUT; DDRD = 0x00; //PD INPUT; //POWER ON indication: both LEDR and LEDG blink 3 times LEDG_OFF(); LEDR_OFF(); LEDG_OUTPUT(); LEDR_OUTPUT(); for (i=0; i<3; i++) { _delay_ms(200); //Delay_ms(200); LEDG_ON(); LEDR_ON(); _delay_ms(200); //Delay_ms(200); LEDG_OFF(); LEDR_OFF(); } LEDG_OFF(); LEDR_OFF(); RFXX_PORT_INIT(); RF12_INIT(); DDRD |= (1 << RF12_DATA); PORTD |= (1 << RF12_DATA); // SET nFFS pin HI when using TX register DDRD &= ~(1 << DDD2); // PD2(INT0) while (1) { LEDR_ON(); rfxx_wrt_cmd(0x0000); //read status register rfxx_wrt_cmd(0x8239); //!er,!ebb,ET,ES,EX,!eb,!ew,DC ChkSum=0; rf12_send(0xAA); //PREAMBLE rf12_send(0xAA); //PREAMBLE rf12_send(0xAA); //PREAMBLE rf12_send(0x2D); //SYNC HI BYTE rf12_send(0xD4); //SYNC LOW BYTE // send data bytes for (i = 0x30; i<=0x3F; ++i) { rf12_send(i); ChkSum += i; } /* rf12_send(0x30); //DATA BYTE 0 ChkSum+=0x30; rf12_send(0x31); //DATA BYTE 1 ChkSum+=0x31; rf12_send(0x32); ChkSum+=0x32; rf12_send(0x33); ChkSum+=0x33; rf12_send(0x34); ChkSum+=0x34; rf12_send(0x35); ChkSum+=0x35; rf12_send(0x36); ChkSum+=0x36; rf12_send(0x37); ChkSum+=0x37; rf12_send(0x38); ChkSum+=0x38; rf12_send(0x39); ChkSum+=0x39; rf12_send(0x3A); ChkSum+=0x3A; rf12_send(0x3B); ChkSum+=0x3B; rf12_send(0x3C); ChkSum+=0x3C; rf12_send(0x3D); ChkSum+=0x3D; rf12_send(0x3E); ChkSum+=0x3E; rf12_send(0x3F); //DATA BYTE 15 ChkSum+=0x3F; */ rf12_send(ChkSum); //send chek sum rf12_send(0xAA); //DUMMY BYTE rf12_send(0xAA); //DUMMY BYTE rf12_send(0xAA); //DUMMY BYTE rfxx_wrt_cmd(0x8201); LEDR_OFF(); LEDG_OFF(); //for(i=0;i<10000;i++) // for(j=0;j<123;j++); //sleep 1 second appr. _delay_ms(1000); } }
void main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; TA1CCTL0 = CCIE; // CCR0 interrupt enabled TA1CCR0 = 50000; TA1CTL = TASSEL_2 + MC_1 + TACLR; // SMCLK, upmode, clear TAR __bis_SR_register(GIE); //WDTCTL = WDT_ARST_250; //SFRIE1 |= WDTIE; // Enable WDT interrupt // Increase PMMCOREV level to 2 for proper radio operation SetVCore(2); ResetRadioCore(); InitRadio(); InitButtonLeds(); InitUart(); ReceiveOn(); receiving = 1; _EINT(); while (1) { //WDTCTL = WDT_ARST_250; // __bis_SR_register( LPM3_bits + GIE ); __no_operation(); if((!(BUTTON_IN & (1<<BUTTON_BIT)))) { _NOP(); delayms(30); if(!(BUTTON_IN & (1<<BUTTON_BIT))) { _NOP(); buttonPressed = 1; LEDR_ON(); ReceiveOff(); receiving = 0; Transmit( (unsigned char*)TxBuffer,sizeof TxBuffer); transmitting = 1; while(!(BUTTON_IN & (1<<BUTTON_BIT))); } } if(!transmitting) { ReceiveOn(); receiving = 1; } if(buttonPressed && transmit == 1) { LEDR_ON(); ReceiveOff(); receiving = 0; Transmit( (unsigned char*)TxBuffer,sizeof TxBuffer); transmitting = 1; transmit = 0; receive = 1; delayms(500); buttonPressed = 0; } if(count == 20 && buttonPressed == 0 && receive == 1) { buttonPressed = 1; count = 0; transmit = 1; receive = 0; } } }