
Ska inte CE sättas hög i Init?
Kod: Markera allt
PUB Init
dira |= PIN_MASK ' Set output
outa[CE] := 1 ' Disable device, set CE high
outa[SCK] := 0 ' Set clock to low initial state
Kod: Markera allt
PUB Init
dira |= PIN_MASK ' Set output
outa[CE] := 1 ' Disable device, set CE high
outa[SCK] := 0 ' Set clock to low initial state
Kod: Markera allt
void SPI_MasterInit(void)
{
// Set MOSI and SCK output, all others input
DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_CE);
// Enable SPI, Master, set clock rate fck/16
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
// Make sure that CE is high(device disabled)
PORT_SPI |= (1<<DD_CE);
}
Hur kan du påstå att det är enkelt att odla blommor!? Jag har försökt mig på det flera gånger, utan resultat.. Elektronik är en baggis jämfört med blommor!BEEP skrev:Börjar bli lite för gammal för att hålla på med saker som kräver tankeverksamhet, tror att jag ska skaffa mig någon annan enklare hobby som frimärkessamling, fågelskådning eller blomsterodling
Kod: Markera allt
#include <avr/io.h>
#define DDR_SPI DDRB
#define PORT_SPI PORTB
#define DD_CE PORTB2
#define DD_MOSI PORTB3
#define DD_SCK PORTB5
void SPI_MasterInit(void);
char SPI_MasterTransmit(char);
void CE_High(void);
void CE_Low(void);
void WREN(void);
unsigned char RDSR();
void WREN_Check(void);
int main()
{
DDRC = 0xFF; // Set unused ports as outputs
DDRD = 0xFF; // to not have them as "antennas"
SPI_MasterInit(); //Initiate SPI Master
WREN(); //Write Enable
WREN_Check(); //Lights a LED if Write is enabled
}
void SPI_MasterInit(void)
{
// Set MOSI and SCK output, all others input
DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_CE)|(1<<PORTB0);
// Enable SPI, Master, set clock rate fck/2
SPCR = (1<<SPE)|(1<<MSTR);
SPSR = (1<<SPI2X);
// Make sure that CE is high(device disabled)
PORT_SPI |= (1<<DD_CE);
}
char SPI_MasterTransmit(char data)
{
// Start transmission
SPDR = data;
// Wait for transmission complete
while(!(SPSR & (1<<SPIF)));
// Return the received byte
return (SPDR);
}
void CE_High(void)
{
PORT_SPI |= (1<<DD_CE);
}
void CE_Low(void)
{
PORT_SPI &= ~(1<<DD_CE);
}
void WREN(void)
{
CE_Low();
SPI_MasterTransmit(0x06);
CE_High();
}
unsigned char RDSR()
{
unsigned char byte = 0;
CE_Low();
SPI_MasterTransmit(0x05);
byte = SPI_MasterTransmit(0xFF);
CE_High();
return (byte);
}
void WREN_Check(void)
{
unsigned char status = 0;
status = RDSR();
if (status & 0x02)
{
PORTB |= (1<<PORTB0);
}else{
PORTB &= ~(1<<PORTB0);
}
}
Kör du systemklocka på 8MHz?BEEP skrev:Jag har plockat fram STK500 och gjort ett litet snabb test med din kod. Det som händer är att status blir 0xFF både med eller utan minnet inkopplat, vilket gör att "if (status & 0x02)" tänder lysdioden.