Hallo
Hier erstmal die schnelle Antwort ohne großes Überprüfen deines Codes:
Code:
for (i=0; i<8; i++)
{
SCK_Low();
Delay1us(2);
if (data1 & mask)
{
SCK_High();
}
else
{
SCK_Low();
}
Delay1us(2);
mask >>= 1;
}
SPI ist eine synchrone Datenübertragung bei der ein Partner (der Master?) den gemeinsamen Takt vorgibt. Wenn der Takt low ist kann der sendende Partner das ensprechende Datenbit an seinem Ausgang bereitstellen, der Takt soll solange low bleiben bis der Sender seinen Datenpegel (high oder low)sicher ausgibt. Die minimale Zeit steht im Datenblatt, größere Werte verlangsamen die Übertragung, machen sie aber sicherer. Wenn das Taktsignal ausbleibt oder zu langsam ist erzeugt der Mauschip einen Reset!
Die Übertragung startet, wenn der Master den Takt auf high schaltet. Dann wird das Datenbit gelesen, der Empfängerpin muss dabei auf Eingang geschaltet sein. Nachdem das Bit gelesen und gespeichert wurde, wird der Takt wieder auf low gelegt, ein Bit wurde nun übertragen. Für die Länge des High-Takt gilt das selbe wie fürs Low. Am Ende der Übertragung ist der Takt immer low.
In deiner Sendefunktion wird der Takt aus dem Datenbyte erzeugt, das ist natürlich nicht richtig. Schau dir nochmal meine Funktion an:
Code:
void write_data(uint16_t data)
{
uint8_t bit=16;
while(bit--) // 16 Datenbits nacheinander Senden (MSB zuerst)
{
if(data & (1<<bit)) {data_h;} else {data_l;} // Datenbit an Ausgang ausgeben
sleep(5); // Warten bis Datenpegel sicher ausgegeben wird
clk_h; // Maus darf jetzt lesen
sleep(5); // Maus liest Datenbit
clk_l; // fertig, nächstes Datenbit vorbereiten
sleep(5); // warten bis Taktpegel sicher low ist
}
data_z; // Datenpin als Eingang ohne internen PullUp
sleep(20); // Angstverzögerung
}
Gruß
mic
[Edit]
Ähm, das ist die Anwort auf den von dir inzwischen wieder gelöschten Beitrag. Ich lasse es aber trotzdem mal so stehen ;)
Lesezeichen