Skip to content

Instantly share code, notes, and snippets.

@sp5wwp
Last active January 16, 2022 10:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sp5wwp/c612fc8fe612e99c11f9b65cd50bca3c to your computer and use it in GitHub Desktop.
Save sp5wwp/c612fc8fe612e99c11f9b65cd50bca3c to your computer and use it in GitHub Desktop.
//----------------------funcs----------------------
//write 8-bit register at "long", 16-bit address
void AX5043_WriteRegister16(uint16_t addr, uint8_t val)
{
addr |= 0xF000; //MSB set to 1 for writing, 3 further bits has to be set to 1
uint8_t msg[3]={addr>>8, addr&0xFF, val};
HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, 0);
HAL_SPI_Transmit(&hspi1, msg, 3, 100);
HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, 1);
}
//write 8-bit register at 8-bit address
void AX5043_WriteRegister8(uint8_t addr, uint8_t val)
{
addr |= 0x80; //MSB set to 1 for writing
uint8_t msg[2]={addr, val};
HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, 0);
HAL_SPI_Transmit(&hspi1, msg, 2, 100);
HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, 1);
}
//write "long", 16-bit register at 8-bit address
void AX5043_WriteLongRegister(uint8_t addr, uint16_t val)
{
addr |= 0x80; //MSB set to 1 for writing
uint8_t msg[3]={addr, val>>8, val&0xFF};
HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, 0);
HAL_SPI_Transmit(&hspi1, msg, 3, 100);
HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, 1);
}
void AX5043_Reset(void)
{
//set CS (SEL) to high for at least 1 us
HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, 1);
HAL_Delay(1);
HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, 0);
//set RST bit for a while
AX5043_WriteRegister8(0x02, 0x40);
HAL_Delay(1); //~1ms delay
AX5043_WriteRegister8(0x02, 0x00);
HAL_Delay(1); //~1ms delay
//set POWERDOWN
AX5043_WriteRegister8(0x02, 0x60);
}
//freq in Hz
void AX5043_FreqSet(uint32_t freq)
{
uint32_t N=0;
N=(uint32_t)((float)freq/12000000*(1<<24)+0.5);
AX5043_WriteRegister8( 0x034, (N>>24)&0xFF);
AX5043_WriteRegister8( 0x035, (N>>16)&0xFF);
AX5043_WriteRegister8( 0x036, (N>>8)&0xFF);
AX5043_WriteRegister8( 0x037, N&0xFF);
}
//perform PLL ranging
void AX5043_Ranging(void)
{
uint8_t addr[2]={0,0};
//uint8_t rcv=0;
//uint8_t pll_loop=0, pll_cpi=0;
//retrieve PLL registers
addr[0]=0x30;
HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, 0);
HAL_SPI_TransmitReceive(&hspi1, addr, rcv, 2, 3);
HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, 1);
pll_loop=rcv[1];
addr[0]=0x31;
HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, 0);
HAL_SPI_TransmitReceive(&hspi1, addr, rcv, 2, 3);
HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, 1);
pll_cpi=rcv[1];
//set defaults
AX5043_WriteRegister8(0x030, 0x09);
AX5043_WriteRegister8(0x031, 0x08);
addr[0]=0x33;
AX5043_WriteRegister8( 0x033, 0x18); //PLL ranging
do
{
HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, 0);
HAL_SPI_TransmitReceive(&hspi1, addr, rcv, 2, 3);
HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, 1);
}
while(rcv[1]&(1<<4));
//restore
AX5043_WriteRegister8(0x030, pll_loop);
AX5043_WriteRegister8(0x031, pll_cpi);
}
//returns the state of PLL lock flag
uint8_t AX5043_Poll_PLL_Lock(void)
{
uint8_t addr[2]={0x33,0};
uint8_t rcv[2]={0,0};
HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, 0);
HAL_SPI_TransmitReceive(&hspi1, addr, rcv, 2, 3);
HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, 1);
return (rcv[1]&(1<<6))>>6;
}
//returns the PLL range
uint8_t AX5043_Poll_PLL_Range(void)
{
uint8_t addr[2]={0x33,0};
uint8_t rcv[2]={0,0};
HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, 0);
HAL_SPI_TransmitReceive(&hspi1, addr, rcv, 2, 3);
HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, 1);
return rcv[1]&0xF;
}
//returns the PLL range error flag
uint8_t AX5043_Poll_PLL_RangeErr(void)
{
uint8_t addr[2]={0x33,0};
uint8_t rcv[2]={0,0};
HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, 0);
HAL_SPI_TransmitReceive(&hspi1, addr, rcv, 2, 3);
HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, 1);
return (rcv[1]>>5)&1;
}
//returns the RSSI
int8_t AX5043_Poll_RSSI(void)
{
uint8_t addr[2]={0x40,0};
uint8_t rcv[2]={0,0};
int8_t tmp=0;
HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, 0);
HAL_SPI_TransmitReceive(&hspi1, addr, rcv, 2, 3);
HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, 1);
memcpy(&tmp, &rcv[1], 1);
return tmp;
}
//returns the AGC gain value
int8_t AX5043_Poll_AGC(void)
{
uint8_t addr[2]={0x43,0};
uint8_t rcv[2]={0,0};
HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, 0);
HAL_SPI_TransmitReceive(&hspi1, addr, rcv, 2, 3);
HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, 1);
return rcv[1];
}
//according to application note AND9313/D
void AX5043_Config(void)
{
//this is from notblackmagic.com
AX5043_WriteRegister16(0xF10, 0x04); //config TCXO and stuff
AX5043_WriteRegister16(0xF11, 0x00); //
AX5043_WriteRegister16(0xF35, 0x10); //
AX5043_WriteRegister8( 0x032, 0x00); //
AX5043_WriteRegister8( 0x021, 0x05); //generate f_xtal/2 at SYSCLK pin (it works)
AX5043_WriteRegister8( 0x002, 0x65); //PWRMODE -> STANDBY (turn on CLK)
//AX5043_WriteRegister16(0x180, 0x99); //VCOI
//AX5043_WriteRegister16(0x183, 0x05); //PLLRNGCLK
//AX5043_WriteRegister8( 0x031, 0x02); //PLLCPI
//AX5043_WriteRegister16(0xF00, 0x0F); //???
//AX5043_WriteRegister16(0xF18, 0x06); //???
AX5043_WriteRegister16(0xF34, 0x08); //PERFTUNE52
AX5043_WriteRegister8( 0x032, 0x30); //PLLVCODIV
}
//freq in Hz, power in 0..0xFFF range (0xFFF -> around 15..16dBm)
void AX5043_SetTX(uint32_t freq, uint16_t pwr)
{
AX5043_FreqSet(freq);
AX5043_Ranging();
AX5043_WriteRegister8( 0x010, 0x0B); //analog FM
AX5043_WriteRegister16(0x161, 0x00); //
AX5043_WriteRegister16(0x162, 0xC0); //some crazy ADC settings (magic)
AX5043_WriteRegister16(0x163, 0x07); //frequency deviation of around 47kHz (cant get lower). the exact value is f_xtal/(2^(7+1))
AX5043_WriteRegister16(0x16A, pwr>>8); //power setting
AX5043_WriteRegister16(0x16B, pwr&0xFF);//default is max (0x0FFF)
AX5043_WriteRegister16(0x301, 0x07); //tx rate -> sampling rate of the ADC. around 53.6kHz (f_xtal/32/7). >=48kHz, so we are happy
AX5043_WriteRegister16(0x300, 0x06); //continuous ADC sampling
AX5043_WriteRegister8( 0x023, 0x04); //PA always ON (continuous TX mode)
AX5043_WriteRegister8( 0x002, 0x0D); //PWRMODE -> FULLTX
}
void AX5043_SetRX(uint32_t freq)
{
AX5043_FreqSet(freq);
AX5043_Ranging();
//all this was taken from AND9313/D
AX5043_WriteRegister8( 0x010, 0x0B); //MODULATION -> analog FM
AX5043_WriteRegister16(0x100, 0x08); //IFFREQ -> 25kHz (12MHz tcxo)
AX5043_WriteRegister16(0x101, 0x89); //IFFREQ
AX5043_WriteRegister16(0x117, 0x00); //RXPARAMSETS
AX5043_WriteRegister16(0x124, 0x00); //TIMEGAIN0
AX5043_WriteRegister16(0x125, 0x00); //DRGAIN0
AX5043_WriteRegister16(0x106, 0x00); //MAXDROFFSET
AX5043_WriteRegister16(0x107, 0x00); //MAXDROFFSET
AX5043_WriteRegister16(0x108, 0x00); //MAXDROFFSET
AX5043_WriteRegister16(0x109, 0x80); //MAXRFOFFSET2 -> 6.5kHz (12MHz tcxo)
AX5043_WriteRegister16(0x10A, 0x23); //MAXRFOFFSET2
AX5043_WriteRegister16(0x10B, 0x80); //MAXRFOFFSET2
AX5043_WriteRegister16(0x127, 0x0F); //FREQGAINA0 - OFF
AX5043_WriteRegister16(0x128, 0x02); //FREQGAINB0, this is the actual demod part
AX5043_WriteRegister16(0x129, 0x1F); //FREQGAINC0 - OFF
AX5043_WriteRegister16(0x12A, 0x1F); //FREQGAIND0, maybe we should disable this - 0x1F (was set to 0x08)
AX5043_WriteRegister16(0x116, 0x04); //FREQLEAK=FREQGAINB0+2
AX5043_WriteRegister16(0x332, 0x03); //DACCONFIG
AX5043_WriteRegister16(0x330, 0x00); //DACVALUE1
AX5043_WriteRegister16(0x331, 0x0C); //DACVALUE0
AX5043_WriteRegister8( 0x026, 0x05); //PINFUNCPWRAMP
AX5043_WriteRegister8( 0x002, 0x09); //PWRMODE
AX5043_WriteRegister16(0x121, 100); //AGC target - 118 is the default value
AX5043_WriteRegister16(0x102, 13); //baseband decimation (default = 13)
AX5043_WriteRegister16(0x103, 0); //0 - 0x103..0x105 is the rx rate
AX5043_WriteRegister16(0x104, 10); //61
AX5043_WriteRegister16(0x105, 0); //138
}
//----------------------sample init & usage----------------------
delay(500);
AX5043_Reset();
AX5043_Config();
//try out one of those
//AX5043_SetTX(435000000, 0x07F);
AX5043_SetRX(435000000);
while(1)
{
//pll_lock=AX5043_Poll_PLL_Lock();
//pll_range=AX5043_Poll_PLL_Range();
//pll_range_error=AX5043_Poll_PLL_RangeErr();
rssi=AX5043_Poll_RSSI();
agc_gain=AX5043_Poll_AGC();
delay(100);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment