Podle datasheetu začne instrukce log “1” na vývodu CS za současného start bitu v log “1”.
na začátku je tedy 1 start bit a 2 bity kódu.
Abych si to zjednodušil tak vysílám na začátku 8 bitů z nichž nejnižší 3 jsou star bit a kód instrukce. Vyšší bity jsou v log “0”. Zde je daný kód
#define F_CPU 16E6
#define MISO 3
#define MOSI 2
#define SCK 1
#define SS 0
#include <avr/io.h>
#include <util/delay.h>
#include “bitove_operace.h”
void SPI_MasterInit(void)
{
/* Nastaví MOSI, SCK a SS jako výstupní piny, ostatní na portu B jsou jako vstupní */
sbi(DDRB,MOSI);
sbi(DDRB,SCK);
sbi(DDRB,SS);
cbi(DDRB,MISO);
/* Zapnutí SPI, nastaví AVR jako Master, hodinový kmitočet je fck/128 /
/ tedy 125kHz */
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1)|(0<CPOL)|(0<CPHA);
}
void SPI_MasterTransmit(unsigned char cData)
{
/* Start transmission /
SPDR = cData;
/ Wait for transmission complete */
while(!(SPSR & (1<<SPIF)))
;
}
char SPI_MasterReceive(void)
{
SPDR = 0xff;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)))
;
return SPDR;
}
int main()
{
unsigned char dataHI,dataLO;
SPI_MasterInit();
while(1)
{
sbi(PORTB,SS);
_delay_us(5);
SPI_MasterTransmit(0b00000110); // budeme číst
SPI_MasterTransmit(10); // na adresu 10
dataHI=SPI_MasterReceive(); // mělo by to být číslo 0
dataLO=SPI_MasterReceive(); // mělo by to být číslo 5
cbi(PORTB,SS);
_delay_us(1);
PORTA=dataLO;
_delay_us(30);
};
}
sbi a cbi nastaví či vynulují daný bit.
Tahle nekonečná smyčka by měla číst adresu 10(organiyace po 16 bitech) a zobrazovat ji na portu A. Vždycky přečtě 0xFF ale snad jsem zapsal na tuto adresu číslo 5.
Je možné to udělat jak to tady je?