Finished first revision
This commit is contained in:
parent
81b93a2372
commit
ea0faf27c5
1 changed files with 62 additions and 47 deletions
109
main.c
109
main.c
|
@ -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);
|
||||||
}
|
}
|
Loading…
Reference in a new issue