interrupt handling
readerComm.cpp
- Committer:
- rwclough
- Date:
- 2015-03-02
- Revision:
- 1:1eb96189824d
- Child:
- 2:bd5afc5aa139
File content as of revision 1:1eb96189824d:
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Filename: readerComm.c Description: Functions used to communicate with the TRF7970 eval bd. Communication is by means of an SPI interface between the nRF51-DK board (nRF51422 MCU) and the TRF7970 eval bd. Copyright (C) 2015 Gymtrack, Inc. Author: Ron Clough Date: 2015-02-27 Changes: Rev Date Who Details ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 0.0 2015-02-2 RWC Original version. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #include "mbed.h" #include "readerComm.h" extern SPI spi; // main.cpp extern DigitalOut CS; // main.cpp void firstComm(void) { // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // firstComm() // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * int mod_control[2]; mod_control[0] = SOFT_INIT; directCommand(mod_control); mod_control[0] = IDLE; directCommand(mod_control); mod_control[0] = MODULATOR_CONTROL; mod_control[1] = 0x21; writeSingle(mod_control, 2); mod_control[0] = MODULATOR_CONTROL; readSingle(mod_control, 1); } // End of firstComm() void directCommand(int *buffer) { // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // directCommand() // Description: Transmit a Direct Command to the reader chip. // Parameter: *buffer = the direct command. // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *buffer = (0x80 | *buffer); // Setup command mode *buffer = (0x9f & *buffer); // Setup command mode CS = SELECT; spi.write(*buffer); CS = DESELECT; } // End of directCommand() void writeSingle(int *buffer, int length) { // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // writeSingle() // Description: Writes to specified reader registers. // Parameters: *buffer = addresses of the registers followed by the // contends to write. // length = number of registers * 2. // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * int i=0; CS = SELECT; while(length > 0) { *buffer = (0x1f & *buffer); // Register address for(i = 0; i < 2; i++) { spi.write(*buffer); buffer++; length--; } // if } // while CS = DESELECT; } // End of writeSingle() void readSingle(int *buffer, int number) { // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // readSingle() // Description: Reads specified reader chip registers and // writes register contents to *buffer. // Parameters: *buffer = addresses of the registers. // number = number of registers. // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * int temp; CS = SELECT; while(number > 0) { *buffer = (0x40 | *buffer); // Address, read, single *buffer = (0x5f & *buffer); // Register address temp = spi.write(*buffer); *buffer = spi.write(0x00); buffer++; number--; } // while CS = DESELECT; } // End of readSingle() void turnRfOn(void) { // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // turnRfOn() // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * int command[2]; command[0] = CHIP_STATUS_CONTROL; command[1] = CHIP_STATUS_CONTROL; readSingle(&command[1], 1); command[1] &= 0x3F; command[1] |= 0x20; writeSingle(command, 2); } // End of turnRfOn() void turnRfOff(void) { // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // turnRfOff() // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * int command[2]; command[0] = CHIP_STATUS_CONTROL; command[1] = CHIP_STATUS_CONTROL; readSingle(&command[1], 1); command[1] &= 0x1F; writeSingle(command, 2); } // End of turnRfOff() void writeIsoControl(int iso_control) { // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // writeIsoControl() // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * int write[4]; // if((iso_control & BIT5) == BIT5) // { // return; // } write[0] = ISO_CONTROL; write[1] = iso_control; // write[1] &= ~BIT5; writeSingle(write, 2); iso_control &= 0x1F; } // End of writeIsoControl() void resetIrqStatus(void) { // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // resetIrqStatus() // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * } void iso15693FindTag(void) { // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // iso15693FindTag() // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * turnRfOn(); writeIsoControl(0x02); // The VCD should wait at least 1 ms after it activated the // powering field before sending the first request, to // ensure that the VICCs are ready to receive it. (ISO15693-3) wait_ms(6); // flags = SIXTEEN_SLOTS; // flags = ONE_SLOT; // buf[20] = 0x00; // Iso15693Anticollision(&buf[20], 0x00); // Send Inventory request turnRfOff(); resetIrqStatus(); // Clear any IRQs } // End of iso15693FindTag() void Iso15693Anticollision(int *mask, int length) { // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // Iso15693Anticollision() // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * } // End of Iso15693Anticollision()