Här är min lilla testapplikation:
Kod: Markera allt
#define uint16 uint16_t
#define uint8 uint8_t
#define SET_LED() PORTE|=(1<<PE6)
#define CLR_LED() PORTE&=~(1<<PE6)
#define TGL_LED() PORTE^=(1<<PE6)
#define CS_ENABLE() PORTE|=(1<<PE0)
#define CS_DISABLE() PORTE&=~(1<<PE0)
#define DDR_SPI (DDRB)
#define DD_MOSI (PB2)
#define DD_SCK (PB1)
#define DD_CS (PE0)
#define AVR_SS (PB0)
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdbool.h>
ISR(SPI_STC_vect)
{
TGL_LED();
}
void delay_ms(uint16 delay);
void SPI_MasterInit(void);
void SPI_MasterTransmit(uint8 cData);
bool MAX5482_Send(uint16 WiperValue);
int main(void)
{
DDRE = 0xFF;
SREG |= (1<<SREG_I);
SPI_MasterInit();
while(1)
{
MAX5482_Send(0);
delay_ms(3000);
MAX5482_Send(125);
delay_ms(3000);
MAX5482_Send(250);
delay_ms(3000);
MAX5482_Send(512);
delay_ms(3000);
MAX5482_Send(1023);
while(1)
;
}
return 0;
}
void delay_ms(uint16 delay)
{
while(delay--)
_delay_ms(1);
}
void SPI_MasterInit(void)
{
// Set MOSI, SCK and SS output, all others input
DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK) | (1<<AVR_SS);
PORTB |= (1<<AVR_SS);
// Enable SPI, Master, set clock rate fck/128 --- Detta fungerar inte!!!
SPCR = (1<<MSTR) | (1<<SPE) | (1<<SPIE) | (1<<SPR1) | (1<<SPR0) | (1<<CPOL);
// Enable SPI, Master, set clock rate fck/64 --- Detta fungerar
//SPCR = (1<<MSTR) | (1<<SPE) | (1<<SPIE) | (1<<SPR1) | (1<<CPOL);
}
void SPI_MasterTransmit(uint8 cData)
{
cData = ~cData;
// Start transmission
SPDR = cData;
// Wait for transmission complete
while(!(SPSR & (1<<SPIF)))
;
}
bool MAX5482_Send(uint16 WiperValue)
{
bool RetVal;
RetVal = true;
if(WiperValue>1023)
RetVal = false;
CS_ENABLE();
_delay_us(5);
SPI_MasterTransmit(0x00);
SPI_MasterTransmit((WiperValue>>2));
SPI_MasterTransmit((WiperValue<<8));
_delay_us(5);
CS_DISABLE();
_delay_ms(12);
return RetVal;
}