Hallo Rolf,
ich werde noch wahnsinnig. Bei folgendem Progrämmchen passiert einfach nix. Hab natürlich zuerst mal an mir gezweifelt, aber mein Oszi sagt auch: auf MOSI kommt nichts raus. Clock ist da. CS und Reset funktionieren auch wie erwartet. Habs auch mal auf PortB versucht: das gleiche.
Gruss
Harry
Program DDT;
{$NOSHADOW}
{$WG} {global Warnings off}
Device = mega644, VCC=5;
{ $BOOTRST $07000} {Reset Jump to $07000}
Import SysTick, SPIDriver1;
From System Import;
Define
ProcClock = 20000000; {Hertz}
SysTick = 10; {msec}
StackSize = $0100, iData;
FrameSize = $0100, iData;
SPIdriver1 = PortD, 0, 1, 2; // SCK, MOSI, MISO
SPIorder1 = MSB;
SPIcPHA1 = 0;
SPIcPol1 = 0;
Implementation
{$IDATA}
{------------------------------------------------------------------------------}
{ Type Declarations }
Type
{------------------------------------------------------------------------------}
{ Const Declarations }
Const
DDInit : Array[0..2] of Byte = ($B1, $08, $18);
WSData : Array[0..7] of Byte = ($A1, $55, $AA, $5A, $A5, $B2, $00, $00);
{------------------------------------------------------------------------------}
{ Var Declarations }
Var
CS[@PortD,3] : Bit;
Reset[@PortD,4] : Bit;
{$IDATA}
{------------------------------------------------------------------------------}
{ functions }
{------------------------------------------------------------------------------}
Procedure InitPorts;
Begin
DDRD:= %00011011; // x x x /Reset /CS MISO MOSI SCK
PortD:= %00011000;
End InitPorts;
{------------------------------------------------------------------------------}
{ Main Program }
{$IDATA}
{------------------------------------------------------------------------------}
Begin
EnableInts;
InitPorts;
CS:=1;
Reset:=1; // Reset & CS = 1
mDelay(10);
Reset:=0; // Reset = 0
mDelay(10);
Reset:=1; // Reset & CS = 1
mDelay(50);
CS:=0;
SPIOut1(@DDInit,3);
CS:=1;
mDelay(50);
Loop
CS:=0; // /CS
mDelay(1);
SPIOut1(@WSData,6);
mDelay(1);
CS:=1; // /CS
mDelay(1000);
EndLoop;
End DDT.
So kommt was raus:
For Counter:=0 to 5 do
SPIOutByte1(WSData[Counter]);
EndFor;
Und noch was, was ich auch nicht verstehe:
SPIorder1 = MSB;
bedeutet doch, daß das höherwertige Bit D7 (most significant bit) zuerst gesendet wird. Bei
SPIorder1 = LSB;
ist es dann D0. Wenn ich nun meinen Code von MSB auf LSB ändere passiert was seltsames. Bei MSB ist der Pegel, wenn ich grad nichts sende, auf Low (0V). Bei LSB ist er auf High (5V). Was hat das damit zu tun?
Frag jetzt nicht wieso ich einen Mega644 und den Software-Treiber verwende - es ist eben so und muß ja auch funktionieren.
ich werde noch wahnsinnig. Bei folgendem Progrämmchen passiert einfach nix. Hab natürlich zuerst mal an mir gezweifelt, aber mein Oszi sagt auch: auf MOSI kommt nichts raus. Clock ist da. CS und Reset funktionieren auch wie erwartet. Habs auch mal auf PortB versucht: das gleiche.
Gruss
Harry
Code
Program DDT;
{$NOSHADOW}
{$WG} {global Warnings off}
Device = mega644, VCC=5;
{ $BOOTRST $07000} {Reset Jump to $07000}
Import SysTick, SPIDriver1;
From System Import;
Define
ProcClock = 20000000; {Hertz}
SysTick = 10; {msec}
StackSize = $0100, iData;
FrameSize = $0100, iData;
SPIdriver1 = PortD, 0, 1, 2; // SCK, MOSI, MISO
SPIorder1 = MSB;
SPIcPHA1 = 0;
SPIcPol1 = 0;
Implementation
{$IDATA}
{------------------------------------------------------------------------------}
{ Type Declarations }
Type
{------------------------------------------------------------------------------}
{ Const Declarations }
Const
DDInit : Array[0..2] of Byte = ($B1, $08, $18);
WSData : Array[0..7] of Byte = ($A1, $55, $AA, $5A, $A5, $B2, $00, $00);
{------------------------------------------------------------------------------}
{ Var Declarations }
Var
CS[@PortD,3] : Bit;
Reset[@PortD,4] : Bit;
{$IDATA}
{------------------------------------------------------------------------------}
{ functions }
{------------------------------------------------------------------------------}
Procedure InitPorts;
Begin
DDRD:= %00011011; // x x x /Reset /CS MISO MOSI SCK
PortD:= %00011000;
End InitPorts;
{------------------------------------------------------------------------------}
{ Main Program }
{$IDATA}
{------------------------------------------------------------------------------}
Begin
EnableInts;
InitPorts;
CS:=1;
Reset:=1; // Reset & CS = 1
mDelay(10);
Reset:=0; // Reset = 0
mDelay(10);
Reset:=1; // Reset & CS = 1
mDelay(50);
CS:=0;
SPIOut1(@DDInit,3);
CS:=1;
mDelay(50);
Loop
CS:=0; // /CS
mDelay(1);
SPIOut1(@WSData,6);
mDelay(1);
CS:=1; // /CS
mDelay(1000);
EndLoop;
End DDT.
So kommt was raus:
Code
For Counter:=0 to 5 do
SPIOutByte1(WSData[Counter]);
EndFor;
Und noch was, was ich auch nicht verstehe:
SPIorder1 = MSB;
bedeutet doch, daß das höherwertige Bit D7 (most significant bit) zuerst gesendet wird. Bei
SPIorder1 = LSB;
ist es dann D0. Wenn ich nun meinen Code von MSB auf LSB ändere passiert was seltsames. Bei MSB ist der Pegel, wenn ich grad nichts sende, auf Low (0V). Bei LSB ist er auf High (5V). Was hat das damit zu tun?
Frag jetzt nicht wieso ich einen Mega644 und den Software-Treiber verwende - es ist eben so und muß ja auch funktionieren.