Hallo iedereen,

Ik ben al een tijdje bezig met de aduc 832 te laten communiceren via spi met een mrf24j40 module. Ik heb al veel gelezen over spi en ik begin het te snappen. Alleen snap ik nog een paar dingen in de datasheet niet.

Dit staat beschreven bij in master mode.

In master mode, a byte transmission or reception is initiated by
a write to SPIDAT. Eight clock periods are generated via the
SCLOCK pin and the SPIDAT byte being transmitted via MOSI.
With each SCLOCK period, a data bit is also sampled via MISO.
After eight clocks, the transmitted byte is completely transmitted
and the input byte waits in the input shift register. The ISPI flag
is set automatically and an interrupt occurs if enabled. The
value in the shift register is latched into SPIDAT.

1) Ik snap hier niet waarom de data wordt gesampled via de miso. De data moet toch gewoon verzonden worden?
2) IK snap ook niet wat ze bedoelen met "the input byte waits in the input shift register" en The
value in the shift register is "latched into SPIDAT?"
3) Laatste vraag, hoe kan ik nu bijvoorbeeld 12 bits versturen. Kan dit door een 8 bit woord te versturen gevolgd door een 4 bit woord?

Alvast bedankt want ik zit vast.

1: De SPI bus is een full duplex interface.
In dit geval betekent dit, dat terwijl een bit van de data op de MOSI (Master Out, Slave In) lijn klaargezet wordt ter verzending naar de ontvanger, er tegelijkertijd wordt gekeken naar een databit die de slave op dat moment ook klaar heeft gezet op de MISO lijn (Master In, Slave Out).
De SCLOCK en MOSI lijnen zijn dus uitgangen van de master, en de MISO is een ingang.

2: "the input byte waits in the input shift register": Als er 8 bits verstuurd zijn, zijn er ook tegelijk 8 bits ontvangen van de slave. Die 8 bits zijn verzameld in een schuifregister. Als het verzenden (en ontvangen) klaar is, dan wordt de ontvangst waarde die in het schuifregister verzameld was automatisch naar een ander register SPIDAT gekopieerd.

3: weet ik niet. Als ik de tekst lees, lijkt het dat er alleen maar veelvouden van 8 verstuurd kunnen worden.

Bedankt voor de informatie. Ik moet bijvoorbeeld naar de MRF24J40 de hexadecimale code 0x24 doorsturen. Om aan te geven voor de MRF24J40 moet ik er een nul voor zetten en als de transactie gedaan ook een nul plaatsen. Dan wordt de hexadecimale code dus 0x48.

Dit is het testprogramma dat ik al heb.
int main (void){

PLLCON = 0x07; // 0b00000111 // configuratie PLLCON
SPICON = 0x37; //0b00110111 //configuratie SPICON

P3_4 = 0; //cs laag maken
SPIDAT = 0x48;
P3_4 = 1; //cs hoog maken
return 0;
}

Ik steek dus de boodschap 0x48 in SPIDAT. Deze wordt verzonden naar de module. De module kan toch pas weten na het adres dat ik heb opgestuurd wat hij moet terugsturen? Moet je daarom een dummy 8 0bits opsturen?

Alvast bedankt voor de moeite