Clark Scheff / A7105TxRx

Dependents:   HubsanTX

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers A7105.cpp Source File

A7105.cpp

00001 #include "mbed.h"
00002 #include "A7105.h"
00003 
00004 A7105::A7105 (PinName mosi, PinName miso, PinName clk, PinName cs, uint32_t freqHz) :
00005         _spi(mosi, miso, clk), _cs(cs) {
00006     _spi.frequency(freqHz);
00007     // Chip select is active low so set it to high until we are ready
00008     _cs = 1;
00009 }
00010 
00011 A7105::~A7105() {}
00012 
00013 uint8_t A7105::writeRegister(uint8_t regAddr, uint8_t value) {
00014     // assert CS
00015     assertChipSelect();
00016     // write register
00017     _spi.write(regAddr);
00018     // write value into register
00019     uint8_t ret = _spi.write(value);
00020     // de-assert CS
00021     deassertChipSelect();
00022     
00023     return ret;
00024 }
00025 
00026 uint8_t A7105::readRegister(uint8_t regAddr) {
00027     // assert CS
00028     assertChipSelect();
00029     // write register and read value
00030     _spi.write(_READ(regAddr));
00031     uint8_t ret = _spi.write(0);
00032     // de-assert CS
00033     deassertChipSelect();
00034     
00035     return ret;
00036 }
00037 
00038 uint8_t A7105::strobe(enum A7105_State state) {
00039     // assert CS
00040     assertChipSelect();
00041     // write strobe command
00042     uint8_t ret = _spi.write(state);
00043     // de-assert CS
00044     deassertChipSelect();
00045     
00046     return ret;
00047 }
00048 
00049 void A7105::writeData(uint8_t* data, size_t len, uint8_t channel) {
00050     // assert CS
00051     assertChipSelect();
00052     _spi.write(A7105_RST_WRPTR);
00053     _spi.write(A7105_05_FIFO_DATA);
00054     for (size_t i = 0; i < len; i++) {
00055         _spi.write(data[i]);
00056     }
00057     // de-assert CS
00058     deassertChipSelect();
00059     
00060     writeRegister(A7105_0F_PLL_I, channel);
00061     strobe(A7105_TX);
00062 }
00063 
00064 void A7105::readData(uint8_t* buffer, size_t len) {
00065     strobe(A7105_RST_RDPTR);
00066     for (size_t i = 0; i < len; i++) {
00067         buffer[i] = readRegister(A7105_05_FIFO_DATA);
00068     }
00069 }
00070 
00071 void A7105::setId(uint32_t id) {
00072     // assert CS
00073     assertChipSelect();
00074     _spi.write(A7105_06_ID_DATA);
00075     _spi.write((uint8_t)(id >> 24) & 0xFF);
00076     _spi.write((uint8_t)(id >> 16) & 0xFF);
00077     _spi.write((uint8_t)(id >> 8) & 0xFF);
00078     _spi.write((uint8_t)id & 0xFF);
00079     // de-assert CS
00080     deassertChipSelect();
00081 }
00082 
00083 void A7105::setPower(int32_t power) {
00084    /*
00085     Power amp is ~+16dBm so:
00086     TXPOWER_100uW  = -23dBm == PAC=0 TBG=0
00087     TXPOWER_300uW  = -20dBm == PAC=0 TBG=1
00088     TXPOWER_1mW    = -16dBm == PAC=0 TBG=2
00089     TXPOWER_3mW    = -11dBm == PAC=0 TBG=4
00090     TXPOWER_10mW   = -6dBm  == PAC=1 TBG=5
00091     TXPOWER_30mW   = 0dBm   == PAC=2 TBG=7
00092     TXPOWER_100mW  = 1dBm   == PAC=3 TBG=7
00093     TXPOWER_150mW  = 1dBm   == PAC=3 TBG=7
00094     */
00095     uint8_t pac, tbg;
00096     switch(power) {
00097         case 0: pac = 0; tbg = 0; break;
00098         case 1: pac = 0; tbg = 1; break;
00099         case 2: pac = 0; tbg = 2; break;
00100         case 3: pac = 0; tbg = 4; break;
00101         case 4: pac = 1; tbg = 5; break;
00102         case 5: pac = 2; tbg = 7; break;
00103         case 6: pac = 3; tbg = 7; break;
00104         case 7: pac = 3; tbg = 7; break;
00105         default: pac = 0; tbg = 0; break;
00106     };
00107     writeRegister(A7105_28_TX_TEST, (pac << 3) | tbg);
00108 }
00109 
00110 void A7105::setTxRxMode(enum TXRX_State mode) {
00111     if(mode == TX_EN) {
00112         writeRegister(A7105_0B_GPIO1_PIN_I, 0x33);
00113         writeRegister(A7105_0C_GPIO2_PIN_II, 0x31);
00114     } else if (mode == RX_EN) {
00115         writeRegister(A7105_0B_GPIO1_PIN_I, 0x31);
00116         writeRegister(A7105_0C_GPIO2_PIN_II, 0x33);
00117     } else {
00118         //The A7105 seems to some with a cross-wired power-amp (A7700)
00119         //On the XL7105-D03, TX_EN -> RXSW and RX_EN -> TXSW
00120         //This means that sleep mode is wired as RX_EN = 1 and TX_EN = 1
00121         //If there are other amps in use, we'll need to fix this
00122         writeRegister(A7105_0B_GPIO1_PIN_I, 0x33);
00123         writeRegister(A7105_0C_GPIO2_PIN_II, 0x33);
00124     }
00125 }
00126 
00127 int8_t A7105::reset() {
00128     writeRegister(A7105_00_MODE, 0x00);
00129     wait_us(1000);
00130     
00131     // Set both GPIO as output and low
00132     setTxRxMode(TXRX_OFF);
00133     int8_t result = readRegister(A7105_10_PLL_II) == 0x9E;
00134     strobe(A7105_STANDBY);
00135     
00136     return result;
00137 }