Hallo
Eine software-SPI-Kommunikation hatte ich dir schon hier gezeigt:
(Aus https://www.roboternetz.de/phpBB2/ze...=421130#421130)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); }
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







Zitieren

Lesezeichen