Library for interfacing with the AMICCOM A7105 2.4GHz FSK/GFSK Transceiver.
Diff: A7105.cpp
- Revision:
- 4:ca02a935e8eb
- Parent:
- 3:cd7f899f155f
- Child:
- 6:44b04880717b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/A7105.cpp Thu Jan 01 19:13:10 2015 +0000 @@ -0,0 +1,139 @@ +#include "mbed.h" +#include "A7105.h" + +A7105::A7105(PinName mosi, PinName miso, PinName clk, PinName cs, uint32_t freqHz) : + _spi(mosi, miso, clk), _cs(cs) { + _spi.frequency(freqHz); + // Chip select is active low so set it to high until we are ready + _cs = 1; +} + +A7105::~A7105() {} + +uint8_t A7105::writeRegister(uint8_t regAddr, uint8_t value) { + // assert CS + _cs = 0; + // write register + _spi.write(regAddr); + // write value into register + uint8_t ret = _spi.write(value); + // de-assert CS + wait_us(1); + _cs = 1; + + return ret; +} + +uint8_t A7105::readRegister(uint8_t regAddr) { + // assert CS + _cs = 0; + // write register and read value + uint8_t ret = _spi.write(_READ(regAddr)); + // de-assert CS + wait_us(1); + _cs = 1; + + return ret; +} + +uint8_t A7105::strobe(enum A7105_State state) { + // assert CS + _cs = 0; + // write strobe command + uint8_t ret = _spi.write(state); + // de-assert CS + wait_us(1); + _cs = 1; + + return ret; +} + +void A7105::writeData(uint8_t* data, size_t len) { + // assert CS + _cs = 0; + _spi.write(A7105_RST_WRPTR); + _spi.write(A7105_05_FIFO_DATA); + for (size_t i = 0; i < len; i++) { + _spi.write(data[i]); + } + + // de-assert CS + wait_us(1); + _cs = 1; +} + +void A7105::readData(uint8_t* buffer, size_t len) { + strobe(A7105_RST_RDPTR); + for (size_t i = 0; i < len; i++) { + buffer[i] = readRegister(A7105_05_FIFO_DATA); + } +} + +void A7105::setId(uint32_t id) { + // assert CS + _cs = 0; + _spi.write(A7105_06_ID_DATA); + _spi.write((uint8_t)(id >> 24) & 0xFF); + _spi.write((uint8_t)(id >> 16) & 0xFF); + _spi.write((uint8_t)(id >> 8) & 0xFF); + _spi.write((uint8_t)id & 0xFF); + // de-assert CS + wait_us(1); + _cs = 1; +} + +void A7105::setPower(int32_t power) { + /* + Power amp is ~+16dBm so: + TXPOWER_100uW = -23dBm == PAC=0 TBG=0 + TXPOWER_300uW = -20dBm == PAC=0 TBG=1 + TXPOWER_1mW = -16dBm == PAC=0 TBG=2 + TXPOWER_3mW = -11dBm == PAC=0 TBG=4 + TXPOWER_10mW = -6dBm == PAC=1 TBG=5 + TXPOWER_30mW = 0dBm == PAC=2 TBG=7 + TXPOWER_100mW = 1dBm == PAC=3 TBG=7 + TXPOWER_150mW = 1dBm == PAC=3 TBG=7 + */ + uint8_t pac, tbg; + switch(power) { + case 0: pac = 0; tbg = 0; break; + case 1: pac = 0; tbg = 1; break; + case 2: pac = 0; tbg = 2; break; + case 3: pac = 0; tbg = 4; break; + case 4: pac = 1; tbg = 5; break; + case 5: pac = 2; tbg = 7; break; + case 6: pac = 3; tbg = 7; break; + case 7: pac = 3; tbg = 7; break; + default: pac = 0; tbg = 0; break; + }; + writeRegister(A7105_28_TX_TEST, (pac << 3) | tbg); +} + +void A7105::setTxRxMode(enum TXRX_State mode) { + if(mode == TX_EN) { + writeRegister(A7105_0B_GPIO1_PIN_I, 0x33); + writeRegister(A7105_0C_GPIO2_PIN_II, 0x31); + } else if (mode == RX_EN) { + writeRegister(A7105_0B_GPIO1_PIN_I, 0x31); + writeRegister(A7105_0C_GPIO2_PIN_II, 0x33); + } else { + //The A7105 seems to some with a cross-wired power-amp (A7700) + //On the XL7105-D03, TX_EN -> RXSW and RX_EN -> TXSW + //This means that sleep mode is wired as RX_EN = 1 and TX_EN = 1 + //If there are other amps in use, we'll need to fix this + writeRegister(A7105_0B_GPIO1_PIN_I, 0x33); + writeRegister(A7105_0C_GPIO2_PIN_II, 0x33); + } +} + +int8_t A7105::reset() { + writeRegister(A7105_00_MODE, 0x00); + wait_us(1000); + + // Set both GPIO as output and low + setTxRxMode(TXRX_OFF); + int8_t result = readRegister(A7105_10_PLL_II) == 0x9E; + strobe(A7105_STANDBY); + + return result; +} \ No newline at end of file