Gast
#3717060
Schönen Tag alle zusammen. Dies ist mein erster Eintrag in diesem Forum und schon kommen Probleme. Leider half mir dieses mal die SuFu nicht. Ich habe begonnen zu Hobbyzwecken (Synthesizer) 16bit PIC Controller zu programmieren. Ich habe bereits erfolgreich mit 8bit Typen gearbeitet. Nun ist ein für mich unerklärliches Problem aufgetreten. Ich programmiere mit MPLab X und C und brenne mit PicKit3. Ziel ist es mit SPI ein DAC anzusprechen. SPI funktioniert fast. Und hier liegt das Problem. SS und Data Output funktionieren. Am Oszilloskop kann ich die richtige Bitfolge ablesen. Nur der SPI CLK tut rein gar nichts. Ich habe ein leichtes Übersprechen (durch lange Parallele Leiterbahnen) der Data Output Leitung. Deshalb denke ich, dass der Pin nicht als Output konfiguriert ist da Hochohmig. Ich verwende den PIC pic24fj16mc101, das Pinout habe ich oben angehängt. Unten folgt der Code mit dem ich die SPI Peripherie konfiguriere. [c] #define SPI_SS_TRIS TRISBbits.TRISB4 #define SPI_SS_PORT PORTBbits.RB4 void SPI1Init(void) { //config SPI1 SPI1STATbits.SPIEN = 0; // disable SPI port SPI1STATbits.SPISIDL = 0; // Continue module operation in Idle mode SPI1BUF = 0; // clear SPI buffer IFS0bits.SPI1IF = 0; // clear interrupt flag IEC0bits.SPI1IE = 0; // disable interrupt SPI1CON1bits.DISSCK = 0; // Internal SPIx clock is enabled SPI1CON1bits.DISSDO = 0; // SDOx pin is controlled by the module SPI1CON1bits.MODE16 = 1; // set in 16-bit mode, clear in 8-bit mode SPI1CON1bits.SMP = 0; // Input data sampled at mid of data output time SPI1CON1bits.CKP = 1; // CKP and CKE is subject to change ... SPI1CON1bits.CKE = 1; // ... based on your communication mode. SPI1CON1bits.MSTEN = 1; // 1 = Master mode; 0 = Slave mode SPI1CON1bits.SPRE = 4; // Secondary Prescaler = 4:1 SPI1CON1bits.PPRE = 2; // Primary Prescaler = 4:1 SPI1CON2 = 0; // non-framed mode SPI_SS_TRIS = 0; // set SS as output SPI1STATbits.SPIEN = 1; // enable SPI port, clear status } [\c] Gesendet wird indem einfach ins entsprechende Register geschrieben wird. Den SS betätige ich momentan selber. Werde das dann noch ändern, ist aber nicht Teil des Problems. [c] unsigned short data = 0xAFAF; SPI1BUF = data; [\c] Das Programm macht nun folgendes. SS und SPO funktionieren. SPI CLK macht nichts. Ich habe versucht ohne das ganze SPI Zeugs den PIN RB7 (der PIN der mit dem SPI Clock belegt wird, falls SPI aktiv ist.) einfach mal über die entsprechenden TRIS und PORT Register auf High zu schalten. Für alle anderen Pins des B Registers gehts auch, nur nicht für diesen. Was ich bis jetzt ausschliessen kann: - Der SPI CLK kann nicht über remappable peripheral gemappet werden. (Laut Datasheet) Mir fehlt nun der Ansatz das Problem zu lösen. Falls also jemand bereits ein ähnliches Problem lösen konnte könntet ihr mir sehr helfen. Gruss Wipffinder
