Last active
January 16, 2022 10:55
-
-
Save sp5wwp/c612fc8fe612e99c11f9b65cd50bca3c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//----------------------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