Hab deinen Code im Debugger getestet, und so wie er jetzt hier steht läuft er meiner Meinung nach einwandfrei!
Wenn es immer noch nicht geht, dann versuch es doch mal mit einer niedrigeren Übertragungsrate am SPI, um eventuelle Störungen auf den Leitungen auszuschliessen und mach mal das Strobe-Signal länger.
Gruß, Claus
Code:
#include <avr/io.h>
#include <stdint.h>
#ifndef F_CPU
# define F_CPU 16000000L
#endif
#define SPIPORT PORTB
#define SPIDDR DDRB
#define CSPORT SPIPORT
#define CSDDR DDRB
#define MISO PB6
#define MOSI PB5
#define SCK PB7
#define CS PB4
#define SETSTROBE() (CSPORT) |= (1<<CS)
#define CLRSTROBE() (CSPORT) &= ~(1<<CS)
void spi_init(void)
{
SPIDDR = (1<<MOSI)|(1<<SCK)|(1<<CS);
SPIPORT = (1<<MISO);
// SPI als Master
// MSB zuerst
// SCK Ruhepegel ist im Datenblatt LOW!
SPCR = (1 << SPE) | (1 << MSTR);
}
void spi_put_byte( uint8_t data)
{
SPDR = data;
while(!(SPSR & (1<<SPIF)))
;
}
void set_a6833(uint32_t data)
{
int8_t i;
uint8_t tmp;
for(i=3;i >= 0; i--){
tmp = (data >> (8*i));
spi_put_byte(tmp);
}
SETSTROBE();
asm volatile ("nop");
CLRSTROBE();
}
int main(void)
{
spi_init();
set_a6833(0x5500ff0fL);
for(;;)
;
return 0;
}
Lesezeichen