HARDWARE: - /CS des MAX1402 liegt auf Ground --> einziger Slave - SClK an SCK1 - DIN an MOSI1 - DOUT an MISO1 - /RESET an 5V - SSEL1 des LPC2124 an 3.3V ________________________________________________________________________________________________________________________________________ cclk (Prozessortakt) soll 58,982400 MHZ sein bei einem Quarz mit 14.7456 mhz (Olimex LPC-P2106) ________________________________________________________________________________________________________________________________________ **************************************************************************************************************************************** --> SCB_PLLCFG = 0x23; **************************************************************************************************************************************** _______________________________________________________________________________________________________________ Initialisierung der SPI-Schnittstelle: - SClK der SPI-Schnittstelle soll 2,457600 MHZ sein, daher wird der Prozessortakt durch 24 geteilt (0x18) - µC als Master, MSB zuerst CPOL=1 und CPHA=1 _______________________________________________________________________________________________________________ *************************************************************************************************************** void initSPI(void) { SPI1_SPCCR = 0x18; //Set SCLK = 2,457600 MHZ SPI1_SPCR |= (1<<5)|(1<<4)|(1<<3); //No Interrupt generated; MSB first out; MasterMode(5); Cpol=1; CPHA=1 (3) } *************************************************************************************************************** _______________________________________________________________________________________________________________ Funktion zum Schreiben von 2 Bytes. Wird aber auch zum Lesen benutzt, dann ist des gesendete Byte ein 0xFF _______________________________________________________________________________________________________________ *************************************************************************************************************** void writeTwoBytesToADC(unsigned short firstSend, unsigned short secondSend, unsigned short *firstReceived, unsigned short *secondReceived) { unsigned short statusDummy; /*************** First Byte ***********************/ SPI1_SPDR = firstSend; //Write to Data Register --> starts transfer while (!(SPI1_SPSR & 0x80)) {} // Wait for SPIF to be set 1 --> then transfer is finished statusDummy = SPI1_SPSR; // reading clears SPIF-Flag (transfer complete flag *firstReceived = SPI1_SPDR; // read received Data from Data Register /*************** Second Byte **********************/ SPI1_SPDR = secondSend; //Write to Data Register --> starts transfer while (!(SPI1_SPSR & 0x80)) {} // Wait for SPIF to be set 1 --> then transfer is finished statusDummy = SPI1_SPSR; // reading clears SPIF-Flag (transfer complete flag) *secondReceived = SPI1_SPDR; // read received Data from Data Register } ***************************************************************************************************************** _________________________________________________________________________________________________________________ Test-Schleife: Es werden Bytes in verschiedene Register des ADC geschrieben. Beim Auslesen kommen nicht immer die richtigen Werte zurück. Wenn aber Werte kommen, dann genau die, die reingeschrieben wurden (also bei GSR2 kommt dann auch wirklich 0x08). Falsche Werte sind meistens 0x00 oder 0xFF. _________________________________________________________________________________________________________________ ***************************************************************************************************************** while(1){ writeTwoBytesToADC(WRITE_GSR1, 0x0A, &firstReceived, &secondReceived); // Schreibe 0x0A nach GSR1 (WRITE_GSR1 = 0x10) writeTwoBytesToADC(READ_GSR1, 0xFF, &firstReceived, &secondReceived); // Lese GSR1 writeTwoBytesToADC(WRITE_GSR2, 0x08, &firstReceived, &secondReceived); // Schreibe 0x0A nach GSR2 (WRITE_GSR2 = 0x20) writeTwoBytesToADC(READ_GSR2, 0xFF, &firstReceived, &secondReceived); // Lese GSR1 writeTwoBytesToADC(WRITE_TF1, 0xE1, &firstReceived, &secondReceived); // Schreibe 0x0A nach TF1 (WRITE_GSR1 = 0x40) writeTwoBytesToADC(READ_TF1, 0xFF, &firstReceived, &secondReceived); // Lese GSR1 } ******************************************************************************************************************