interrupt handling
interruptStuff.cpp
- Committer:
- soumi_ghsoh
- Date:
- 2015-04-02
- Revision:
- 6:3c510c297e2f
- Parent:
- 5:93c612f43ec2
File content as of revision 6:3c510c297e2f:
///* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // Filename: interruptHandler.cpp // Description: Handles interrupt from TRF7970 // Copyright (C) 2015 Gymtrack, Inc. // Author: Ron Clough // Date: 2015-03-03 // // Changes: // Rev Date Who Details // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // 0.0 2015-03-03 RWC Original version. // //* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ // //#include "mbed.h" ////#include "main.h" //#include "interruptStuff.h" //#include "readerComm.h" // //InterruptIn readerInt(p7); // Interrupt from TRF7970 ////DigitalIn irqPin(p7, PullDown); //extern DigitalOut debug1LED; // "Debug" LED //extern DigitalOut debug2LED; //extern DigitalOut heartbeatLED; //extern DigitalOut testPin; //extern Serial pc; // main.cpp //extern DigitalOut ISO15693LED; //extern uint8_t irqRegister; // Interrupt register (main.cpp) //extern uint8_t buf[300]; //extern int16_t nfc_state; //extern uint8_t nfc_protocol; //extern uint8_t active; //extern int8_t rxtxState; //extern uint8_t rxErrorFlag; //extern uint8_t tagFlag; //volatile extern uint8_t irqFlag; //extern uint8_t irqCount; // //extern uint8_t buffer; // //extern uint8_t debugBuffer[1000]; // Capture data for analysis //extern uint8_t bufIdx; // //void trf797xSetupIrq(void) //// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //// trf797xSetupIrq() //// Description: Interrupt from TRF7970 appears at pin 7 of //// on nRF51-DK eval board. trf7970IrqHandler() is called //// when a rising edge is detected. //// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //{ // readerInt.rise(&trf797xIrqHandler); // Interrupt on rising edge, call trf7970IrqHandler() // readerInt.disable_irq(); //} // End of trf797xSetupIrq() // //void trf797xReadIrqStatus(uint8_t *buffer) //// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //// trf797xReadIrqStatus() //// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //{ // *buffer = IRQ_STATUS; // *(buffer + 1) = IRQ_MASK; // trf797xReadContinuous(buffer, 2); //} // End of trf797xReadIrqStatus() // //void trf797xResetIrqStatus(void) //// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //// trf797xResetIrqStatus() //// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //{ // uint8_t irq_status[4]; // // irq_status[0] = IRQ_STATUS; // irq_status[1] = IRQ_MASK; // trf797xReadContinuous(irq_status, 2); // Read second register as dummy read //} // End of trf797xResetIrqStatus() // // // ///*======================================nfc mode SG //void trf797xNfcModeIsr(uint8_t *Register) //// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //// trf797xNfcModeIsr() //// bit0 - RF collision avoidance error //// bit1 - RF collision avoidance OK //// bit2 - Change in RF field level //// bit3 - SDD OK //// bit4 - Communication error //// bit5 - FIFO high/low //// bit6 - RX //// bit7 - TX //// //// irqRegister is used for signaling to the protocol functions //// irqRegister = 0x00 - OK //// irqRegister = 0x01 - progress //// irqRegister = 0x02 - error //// irqRegister = 0xFF - end of RX //// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //{ // if (*Register == BIT0) { // irqRegister = 0x02; // } // else if (*Register == BIT1) { // irqRegister = 0x00; // } // else if (*Register == BIT3) { // irqRegister = 0x00; // } // else if ((*Register & BIT4) == BIT4) { // *Register = RX_SPECIAL_SETTINGS; // Check filter and gain // trf797xReadSingle(Register, 1); // trf797xStopDecoders(); // irqRegister = 0x02; // } // else if (*Register == BIT7) { // TX complete // irqRegister = 0x00; // trf797xReset(); // } // else if (*Register == 0x40 || *Register == 0x44) { // RX flag means that EOF has been received and // // the number of unread bytes is in FIFOstatus register // *Register = RX_SPECIAL_SETTINGS; // Check filter and gain // trf797xReadSingle(Register, 1); // *Register = FIFO_CONTROL; // trf797xReadSingle(Register, 1); // *Register = 0x7F & *Register; // buf[nfc_state] = FIFO; // Write the received bytes to the correct place in the buffer // trf797xReadContinuous(&buf[nfc_state], *Register); // nfc_state = nfc_state + *Register; // trf797xReset(); // Reset the FIFO after last byte has been read out // irqRegister = 0xFF; // Signal to the receive function that these are the last bytes // trf797xResetIrqStatus(); // } // else if ((*Register == 0x60) || (*Register == 0x64)) { // RX and FIFO interrupt // irqRegister = 0x01; // } // else if (*Register == 0x48) { // SDD complete // irqRegister = 0x00; // } //} // End of trf797xNfcModeIsr() //*/ // ///*==============================================================================target SG //void trf797xTargetIsr(uint8_t *Register) //// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //// trf797xTargetIsr() //// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //{ // uint8_t command, i; // // if (*Register == 0x48) { // TargetProtocol: // // Determine the NFC target protocol // command = NFC_TARGET_PROTOCOL; // trf797xReadSingle(&command, 1); //read the NFCtargetprotocol register // command &= 0x3F; // buf[50] = ISO_CONTROL; // if (command == 0x09) { // nfc_protocol = 0x01; // *Register = FIFO_CONTROL; // trf797xReadSingle(Register, 1); // Determine the number of bytes left in FIFO // *Register = 0x7F & *Register; // buf[nfc_state] = FIFO; // Write the received bytes to the correct place in the buffer // trf797xReadContinuous(&buf[nfc_state], *Register); // nfc_state = nfc_state + *Register; // irqRegister = 0xFF; // } // else { // *Register = FIFO_CONTROL; // trf797xReadSingle(Register, 1); // Determine the number of bytes left in FIFO // *Register = 0x7F & *Register; // buf[nfc_state] = FIFO; // Write the received bytes to the correct place in the buffer // trf797xReadContinuous(&buf[nfc_state], *Register); // nfc_state = nfc_state + *Register; // irqRegister = 0xFF; // if ((command == 0x01)) { // 14443A - active // buf[51] = NFC106AC; // trf797xWriteSingle(&buf[50], 2); // nfc_protocol = 0x02; // active = 0xFF; // } // else if (command == 0x05) { // 14443B - tag emulation // buf[51] = TAG14443B; // trf797xWriteSingle(&buf[50], 2); // nfc_protocol = 0x07; // active = 0x00; // } // else if (command == 0x12) { // if(buf[1] == 0x06) { // Felica 212 - passive // buf[51] = NFC212PA; // trf797xWriteSingle(&buf[50], 2); // nfc_protocol = 0x03; // active = 0x00; // } // else { // Felica 212 - active // buf[51] = NFC212AC; // trf797xWriteSingle(&buf[50], 2); // nfc_protocol = 0x04; // active = 0xFF; // } // } // if (command == 0x12) // else if (command == 0x13) { // if(buf[1] == 0x06) { //Felica 424 - passive // buf[51] = NFC424PA; // trf797xWriteSingle(&buf[50], 2); // nfc_protocol = 0x05; // active = 0x00; // } // else { // Felica 424 - active // buf[51] = NFC424AC; // trf797xWriteSingle(&buf[50], 2); // nfc_protocol = 0x06; // active = 0xFF; // } // if (buf[1] == 0x06) // } // if (command == 0x13) // } // if (command == 0x09) // } // if (*Register == 0x48) // else if (*Register == 0x60) { // irqRegister = 0x01; // buf[nfc_state] = FIFO; // trf797xReadContinuous(&buf[nfc_state], FIFO_MORE); // Read FIFO_MORE bytes from FIFO // nfc_state = nfc_state + FIFO_MORE; // trf797xResetIrqStatus(); // } // else if ((*Register & BIT3) == BIT3) { // SDD finished // irqRegister = 0xFF; // for(i = 0; i < 255; i++); // nfc_protocol = 0x01; // trf797xReset(); // trf797xStopDecoders(); // trf797xRunDecoders(); // } // else if (*Register == 0x44) { // trf797xReadIrqStatus(Register); // if (*Register == 0x40) { // goto TargetProtocol; // } // else if (*Register == 0x00) { // goto RFfieldChange; // } // } // else if (*Register == BIT2) { // RF field change // RFfieldChange: // trf797xReset(); // trf797xStopDecoders(); // trf797xRunDecoders(); // } // trf797xResetIrqStatus(); //} // End of trf797xTargetIsr() //*/ //void trf797xISR(uint8_t *irq_status) //// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //// trf797xISR() //// Description: The Interrupt Handler determines how the IRQ should //// be handled. The Trf797x IRQ status register is read //// to determine the cause of the IRQ. //// Conditions are checked and appropriate actions taken. //// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //{ // //debug2LED = LED_ON; //printf(" IRQ_STATUS %d \r\n",irq_status[0]); // printf(" IRQ_MASK %d \r\n",irq_status[1]); // if (*irq_status == 0xA0) { printf( "BIT5 and BIT7, TX active and only 3 bytes left in FIFO \r\n"); // BIT5 and BIT7, TX active and only 3 bytes left in FIFO // irqRegister = 0x00; // } // else if (*irq_status == BIT7) { printf( " TX complete \r\n"); // TX complete // always comes here SG // // irqRegister = 0x00; // trf797xReset(); // Reset the FIFO after TX // } // else if ((*irq_status & BIT1) == BIT1) {printf( "Collision error \r\n"); // Collision error // comes here when tag is detected SG // // irqRegister = 0x02; // RX complete // trf797xStopDecoders(); // trf797xReset(); // trf797xResetIrqStatus(); //// // IRQ_CLR; // } // else if (*irq_status == BIT6) { printf( "BIT6 INTERRUPT \r\n"); // RX flag means that EOF has been received // does not come here 3G // // and the number of unread bytes is in FIFOstatus register // // if (rxErrorFlag == 0x02) { // irqRegister = 0x02; // return; // } // *irq_status = FIFO_CONTROL; // trf797xReadSingle(irq_status, 1); // Determine the number of bytes left in FIFO // *irq_status = 0x7F & *irq_status; // buf[rxtxState] = FIFO; // Write the received bytes to the correct place in the buffer // trf797xReadContinuous(&buf[rxtxState], *irq_status); // rxtxState = rxtxState + *irq_status; // trf797xReset(); // Reset the FIFO after last byte has been read out // irqRegister = 0xFF; // Signal to the receive funnction that these are the last bytes // } // else if (*irq_status == 0x60) { printf( "RX active and 9 bytes already in FIFO \r\n"); // RX active and 9 bytes already in FIFO // // irqRegister = 0x01; // buf[rxtxState] = FIFO; // trf797xReadContinuous(&buf[rxtxState], 86); // Read 86 bytes from FIFO // rxtxState = rxtxState + 86; // if (readerInt) { //ISO15693LED = LED_ON; // If IRQ pin high // chnaged irqpin to readerInt // trf797xReadIrqStatus(irq_status); //// // IRQ_CLR // if (*irq_status == 0x40) { // End of recieve // *irq_status = FIFO_CONTROL; // trf797xReadSingle(irq_status, 1); // Determine the number of bytes left in FIFO // *irq_status = 0x7F & *irq_status; // buf[rxtxState] = FIFO; // Write the received bytes to the correct place in the buffer // trf797xReadContinuous(&buf[rxtxState], *irq_status); // rxtxState = rxtxState + *irq_status; // irqRegister = 0xFF; // Signal to the receive funnction that these are the last bytes // trf797xReset(); // Reset the FIFO after last byte has been read out // } // else if(*irq_status == 0x50) { printf( "End of receive and error \r\n"); // End of receive and error // irqRegister = 0x02; // } // } // else { // trf797xReadIrqStatus(irq_status); // if(irq_status[0] == 0x00) { // irqRegister = 0xFF; // } // } // } // else if ((*irq_status & BIT4) == BIT4) { printf( "BIT4 INTERRUPT \r\n"); // CRC error // if ((*irq_status & BIT5) == BIT5) { printf( "BIT5 INTERRUPT \r\n"); // irqRegister = 0x01; // RX active // rxErrorFlag = 0x02; // } // if ((*irq_status & BIT6) == BIT6) { printf( "BIT4/BIT 6 INTERRUPT \r\n"); // 4 Bit receive // buf[200] = FIFO; // Write the received bytes to the correct place in the buffer // trf797xReadContinuous(&buf[200], 1); // trf797xReset(); // irqRegister = 0x02; // End of RX // rxErrorFlag = 0x02; // } // else // { // irqRegister = 0x02; // End of RX // } // } // else if ((*irq_status & BIT2) == BIT2) { printf( "BIT2 INTERRUPT \r\n"); // Byte framing error // if ((*irq_status & BIT5) == BIT5) { // irqRegister = 0x01; // RX active // rxErrorFlag = 0x02; // } // else // irqRegister = 0x02; // End of RX // } // else if ((*irq_status == BIT0)) {printf( "No response interrupt \r\n"); // No response interrupt // irqRegister = 0x00; // } // else { // Interrupt register not properly set // printf ("Interrupt Error\r\n"); // // irqRegister = 0x02; // trf797xStopDecoders(); // Reset the FIFO after TX // trf797xReset(); // trf797xResetIrqStatus(); // // Original code clears the IRQ flag here. // } // // wait_ms(10); ////debug2LED = LED_OFF; ////================================================================================= //} // End of trf797xISR() // // ////============================interrupt call back test //void trf797xIrqHandlerCallback(void) // { wait_ms(10); // debug1LED = LED_OFF; // // } ////==============================SG // // // // // //void trf797xIrqHandler(void) //// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //// trf7970IrqHandler() //// __interrupt void Trf797xPortB(void) in original source file trf797x.c //// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //{ //======================works $SG // debug1LED = LED_ON; // // uint8_t irqStatus[2], iso_control; // irqFlag = 0x02; // // trf797xIrqHandlerCallback(); // //===================================================================================== // // do { //// //// iso_control = ISO_CONTROL; //// trf797xReadSingle(&iso_control, 1); //// trf797xReadIrqStatus(irqStatus); //reads IRQ_STATUS register SG //// //// if (*irqStatus == 0xA0) { // TX active and only 3 bytes left in FIFO //// break; //// } //// //// if ((iso_control & BIT5) != BIT5) { // RFID mode //// //// trf797xISR(irqStatus);} // // //========================================================================== // // } //// else { // NFC mode //// if ((iso_control & BIT2) == BIT2) { //// // Tag emulation //// tagFlag = 1; //// trf797xNfcModeIsr(irqStatus); //// //// } //// else { //// if ((iso_control & BIT4) == BIT4) { // Active mode //// //// trf797xNfcModeIsr(irqStatus); //// //// } //// else { // Passive mode //// trf797xTargetIsr(irqStatus); //// //// } //// } //// } // // } while(readerInt); // While IRQ pin is high ********** chnaged irq to readerInt // // // wait_ms(10); // debug1LED = LED_OFF; // //} // // // // //