Finished first revision

This commit is contained in:
Marco Vitchi Thulin 2024-01-23 13:14:19 +01:00
parent 81b93a2372
commit ea0faf27c5

109
main.c
View file

@ -1,27 +1,16 @@
#include<avr/io.h> #include<avr/io.h>
#include "common.h" #include "common.h"
// XXX - ADF4350 LE // PB3 - ADF4350 LE
// PB2 - SCK to ADF4350 CLK // PB2 - SCK to ADF4350 CLK
// PB1 - DO (MOSI) to ADF4350 DATA // PB1 - DO (MOSI) to ADF4350 DATA
// XXX - ADF4350 LD // PB5 - ADF4350 LD
// PB4 - Status LED
String tosend="Test";
void Delay(uint32_t); void Delay(uint32_t);
uint8_t SendReceiveSPIData(uint8_t); uint8_t SendReceiveSPIData(uint8_t);
void SendSPIDataADF4350 (uint32_t); void SendSPIDataADF4350 (uint32_t);
void spi_setup()
{
// set direction of PB1 (DO) and PB2 (USCK) as output
DDRB=(1<<PB1)|(1<<PB2);
// set to three wire mode (SPI)
USICR=(1<<USIWM0);
//USICR=(0<<USIWM1); not needed
}
int main() int main()
{ {
// set instructions to configure the ADF4350 for a 1 GHz +5dBm output // set instructions to configure the ADF4350 for a 1 GHz +5dBm output
@ -40,7 +29,46 @@ int main()
//uint32_t ar4=0xac803c; //uint32_t ar4=0xac803c;
//uint32_t ar5=0x580005; //uint32_t ar5=0x580005;
spi_setup(); // set direction of PB1 (DO) and PB2 (USCK) as output
DDRB=(1<<PB1)|(1<<PB2);
// set to three wire mode (SPI)
USICR=(1<<USIWM0);
///USICR=(0<<USIWM1); not needed, already 0
// set direction of PB4 (status LED) as output
DDRB |= (1 << PB4);
// set direction of PB3 (LE) as open-drain output
DDRB |= (1 << PB3);
// set PB3 (LE) low
PORTB &= ~(1 << PORTB3);
// set direction of PB5 (LD Input) as input
DDRB &= ~(1 << DDB5);
// enable pull-up resistor on PB5
PORTB |= (1 << PORTB5);
// flash the Status LED (PB4) to show that everything works
PORTB |= (1 << PORTB4);
Delay(500000);
PORTB &= ~(1 << PORTB4);
Delay(100000);
// go into an endless loop waiting for frequency lock to be achieved
while (1)
{
// read the state of LD (PB5)
uint8_t ldState = PINB & (1 << PINB5);
// if LD is low, turn on the LED (PB4)
if (ldState == 0)
PORTB |= (1 << PORTB4); // Turn on the LED
else
PORTB &= ~(1 << PORTB4); // Turn off the LED
}
} }
// general purpose delay // general purpose delay
@ -59,7 +87,8 @@ uint8_t SendReceiveSPIData(uint8_t value)
uint8_t lout = 0; uint8_t lout = 0;
short int i=0; short int i=0;
for(i=0;i<=3;i++) // prob change the 8 below to len of value?
for(i=0;i<8;i++)
{ {
USIDR=value[i]; // write data bytes in Data register, will cause them to get sent on clock USIDR=value[i]; // write data bytes in Data register, will cause them to get sent on clock
while(USIOIF==0) // check USI data counter overflow flag to detect the end of transmission every byte while(USIOIF==0) // check USI data counter overflow flag to detect the end of transmission every byte
@ -69,21 +98,9 @@ uint8_t SendReceiveSPIData(uint8_t value)
USISR|=(1<<USIOIF) // clear USI data counter overflow flag USISR|=(1<<USIOIF) // clear USI data counter overflow flag
} }
// Read in a 16 bit frame (replace with proper reading response thing) // Read in a 16 bit frame
///uint16_t inbyte = *(uint32_t *)(SPI1_BASE + 0x0c); ///uint16_t inbyte = *(uint32_t *)(SPI1_BASE + 0x0c);
while (lout == 0) //return inbyte;
{
// do stuff to check response?
lout = 1;
// Read the SPI status register
///uint32_t statusSPI = *(uint32_t *)(SPI1_BASE + 0x08);
// Just bit 1 the transmit buffer empty flag - wait for this to go high then leave this function
/// &= BIT_1;
// The condition has been met so signal to get out of this loop
///if (statusSPI == BIT_1) lout = 1;
}
return inbyte;
} }
// send a 32 bit register value to the ADF4350 // send a 32 bit register value to the ADF4350
@ -100,23 +117,21 @@ void SendSPIDataADF4350 (uint32_t outval)
SendReceiveSPIData (byte2); SendReceiveSPIData (byte2);
SendReceiveSPIData (byte3); SendReceiveSPIData (byte3);
SendReceiveSPIData (byte4); SendReceiveSPIData (byte4);
uint8_t lout = 0;
// Loop waiting for the the SPI BSY flag to go low // 2 x 16 version:
while (lout == 0) // split into 2 x 16 bit words
{ ///uint16_t highWord = (outval & 0xffff0000) >> 16;
// Read the SPI status register ///uint16_t lowWord = outval & 0x0000ffff;
uint32_t statusSPI = *(uint32_t *)(SPI1_BASE + 0x08); // send these to the ADF4350 via SPI
// Just bit 7 the SPI BSY flag - wait for this to go low then leave this function ///SendReceiveSPIData (highWord);
statusSPI &= BIT_7; ///SendReceiveSPIData (lowWord);
// The condition has been met so signal to get out of this loop
if (statusSPI == 0) lout = 1; // delay so the clock has gone low before LE is taken high
}
// Add a delay here so the clock has gone low before LE is taken high
Delay(10); Delay(10);
// Take LE high to load the data into the register // pull LE high to load the data into the ADF4350 register
*(uint32_t *)(GPIOA_BASE + 0x10) = BIT_2; PORTB |= (1 << PORTB3);
// Short delay while LE is high (minimum of 20ns) // short delay while LE is high (minimum of 20ns)
Delay(30); Delay(30);
// Take LE low again // pull LE low again
*(uint32_t *)(GPIOA_BASE + 0x14) = BIT_2; PORTB &= ~(1 << PORTB3);
} }