Beispiel #1
0
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;
Beispiel #2
0
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;
	}
  }
}