Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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 }
Generated on Fri Jul 29 2022 08:56:12 by
1.7.2