Hallo

Eine software-SPI-Kommunikation hatte ich dir schon hier gezeigt:

Code:
 // RP6 liest optischen Maussensor aus (nur x/y)(Maussensor: ADNS-2051) 22.1.09 mic

#include "RP6RobotBaseLib.h"

#define clk_h DDRC |= 1; PORTC |= 1    // Für Anschluss an SDA/CLK am XBUS
#define clk_l DDRC |= 1; PORTC &= ~1   // clk - Pin 10
                                       // data= Pin 12
#define data_h DDRC |= 2; PORTC |= 2   // Vcc - Pin 3
#define data_l DDRC |= 2; PORTC &= ~2  // GND - Pin 1
#define data_z DDRC &= ~2; PORTC &= ~2
#define data_in (PINC & 2)

/*
#define clk_h DDRA |= 1; PORTA |= 1    // Für Anschluss an ADC0/1
#define clk_l DDRA |= 1; PORTA &= ~1   // clk - ADC0
                                       // data- ADC1
#define data_h DDRA |= 2; PORTA |= 2
#define data_l DDRA |= 2; PORTA &= ~2
#define data_z DDRA &= ~2; PORTA &= ~2
#define data_in (PINA & 2)
*/

void init( void)
{
   data_z;       // Datenpin auf Eingang ohne Pullup (Status Z)
   clk_h;        // Dummyclockimpuls erzeugen
   sleep(5);
   clk_l;        // Maus wartet nun bis zum Timeot auf den nächsten Takt
   mSleep(2000); // timeout adnr2051 erzwingen => reset
}

void write_data(uint16_t data)
{
   uint8_t bit=16;
   while(bit--)
   {
      if(data & (1<<bit)) {data_h;} else {data_l;} // {}-Klammern sind hier muss!
       sleep(5);
      clk_h;       // Datenbit für Maus steht bereit
        sleep(5);  // Maus liest Datenbit
      clk_l;
       sleep(5);
   }
   data_z;
   sleep(20);
}

uint8_t read_data(uint8_t adr)
{
   uint8_t bit, data;

   bit=8;
   while(bit--)
   {
      if(adr & (1<<bit)) {data_h;} else {data_l;} // Datenbit ausgeben
       sleep(5);                                  // warten bis Pegel stabil
      clk_h;                                      // Maus darf Daten lesen
       sleep(5);                                  // warten bis Maus gelesen hat
      clk_l;                                      // Bit fertig
        sleep(5);
   }
   clk_l;
   data_z;
   sleep(20);
   bit=8;
   data=0;
   while(bit--)
   {
      clk_h;
		sleep(5);                       // Bit anforden und warten bis Pegel stabil
      if(data_in) {data |= (1<<bit);} // Bit einlesen
      clk_l;                          // Bit gelesen
		sleep(5);
   }
   sleep(20);
   return(data);
}

int main(void)
{
   uint8_t status;

   initRobotBase();
   init();

   writeString_P("Produkt-ID: ");
   writeInteger(read_data(0), 16);
   writeString_P("\n\n\r");
   while(1)
   {
      status=read_data(2);
      if(status & 128) // Bewegung erkannt?
      {
         writeString_P("Status: ");       // wenn Bit7 gesetzt ist
         writeInteger(status, 16);
         writeString_P(" x:  ");
         writeInteger(read_data(3), 10);  // können die eingefrorenen Deltawerte
         writeString_P(" y:  ");          // für x und y ausgelesen werden.
         writeInteger(read_data(4), 10);
         writeString_P("\n\r");
      }
      sleep(255);
   }
   return(0);
}
(Aus https://www.roboternetz.de/phpBB2/ze...=421130#421130)

Mit write_data() sendet man einen 16bit-Wert, Bit15-8 sind die Schreibadresse, Bit15 muss bei einem Kommando zusätzlich gesetzt sein. Bit7-0 ist das Datenbyte. Mit read_data() wird ein Wert von einer Adresse gelesen.

Wenn der Takt low ist werden die jeweiligen Daten bereitgestellt, mit einem high auf dem Takt werden sie gelesen.

Gruß

mic