|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jan 2003
Città: Brianza
Messaggi: 2687
|
[ELETTRONICA] microcontrollore e SPI
ciao,
sto programmando un microcontrollore MSP430 per farlo comunicare con una scheda SD e per farlo vorrei usare il protocollo SPI.. ho un grosso problema: sto usando delle librerie trovate in giro su internet per inizializzare i piedini dedicati all'SPI (in particolare vorrei usare la porta USART0) ma il grosso problema che ottengo è che non riesco a impostare il clock. Ho usato la seguente funzione per inizializzare la porta: void spi_initialize() { P3SEL = 0x00E; // Setup P3 for SPI mode P3OUT |= 0x010; // Setup P3.4 as the SS signal, active low. So, initialize it high. P3DIR |= 0x010; // Set up P3.4 as an output U0CTL = (CHAR | SYNC | MM | SWRST); // 8-bit, SPI, Master U0TCTL = (SSEL1 | STC | CKPH); // Normal polarity, 3-wire U0BR0 = 0x002; // SPICLK = SMCLK/2 (2=Minimum divisor) U0BR1 = 0x000; U0MCTL = 0x000; ME1 |= USPIE0; // Module enable U0CTL &= ~SWRST; // SPI enable } e quest'ultima per impostare la frequenza di clock della periferica SPI: /* Set the baud-rate divisor. The correct value is computed by dividing the clock rate by the desired baud rate. The minimum divisor allowed is 2. */ void spi_set_divisor(unsigned int divisor) { U0CTL |= SWRST; // Temporarily disable the SPI module U0BR1 = divisor >> 8; U0BR0 = divisor; U0CTL &= ~SWRST; // Re-enable SPI } Le funzioni vengono usate all'interno del main in questo modo: /* Initialize the SPI controller */ spi_initialize(); /* Start out with a slow SPI clock, 400kHz, as required by the SD spec (for MMC compatibility). */ spi_set_divisor(PERIPH_CLOCKRATE/400000); In questo modo dovrei avere: PIN 32 e 30 per MISO e SIMO, PIN 29 per SS e PIN 31 (P3.3) con il clock... ma così non è! infatti il piedino 31 non si schioda da massa help!
__________________
"Le prime giornate di un europeo in America possono essere paragonate alla nascita di un uomo." Franz Kafka
"Don't cry because it's over. Smile because it happened." Theodor Geisel |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2000
Messaggi: 699
|
Forse il PIN 31 (P3.3) rimane settato come ingresso
Nella riga: P3DIR |= 0x010; // Set up P3.4 as an output Setta solo il pin 4 della porta 3, prova invece a fare P3DIR |= 0x018;
__________________
Adepto del "La polvere è vita" clan. |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Jan 2003
Città: Brianza
Messaggi: 2687
|
Quote:
sai spiegarmi brevemente cosa indica quella codifica? ok, l'assegnamento tramite "OR" ok, il fatto che ciascun carattere esadecimale indica 4 bit ciò che non capisco è perchè ho 3 caratteri (quindi 12 bit, mentre i bit di ogni porta sono molti meno) e da cosa capisco se un pin è settato come input o output. 0x010=0b0000.0001.0000 0x018=0b0000.0001.1000 o sbaglio? grazie ancora
__________________
"Le prime giornate di un europeo in America possono essere paragonate alla nascita di un uomo." Franz Kafka
"Don't cry because it's over. Smile because it happened." Theodor Geisel |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Nov 2000
Messaggi: 699
|
Di niente
In effetti i 3 caratteri non hanno un senso vero e proprio Non ho davanti il datasheet ma può darsi che i registri siano a 16 bit (Se non erro l'msp430 è un 16 bit), sarebbe in effetti più "pulito" usare 0x18 o 0x0018 in base alle dimensioni del registro, più che altro per la leggibilità Comunque la conversione binaria che hai fatto è corretta
__________________
Adepto del "La polvere è vita" clan. |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Nov 2000
Messaggi: 699
|
Dimenticavo, ogni bit del registro P3DIR (port 3 direction) è associato ad un pin della porta (bit0 --> pin0, bit1 --> pin1 ecc...) se è settato a "0" o a "1" indica se è ingresso (0) o uscita (1)
Poi dipende da microcontrollore a microcontrollore, alcuni usano una logica inversa, con l' 1 per settare gli ingressi e lo "0" le uscite, ovviamente non è il tuo caso Ogni porta ha diversi registri, ad esempio il P3OUT setta i latch delle uscite, i bit che setti ad "1" sollevano il pin corrispondente, invece se lo setti a "0" l'abbassano. Nel codice che hai postato viene settato anche il P3SEL, dovrebbe attivare le funzioni alternative associate al pin (ad esempio per decidere se usarlo come normale pin o come SPI). Ti consiglio di dare un'occhiata al datasheet, magari bisogna settare altre cose, tipo impostarlo come push-pull nel caso in cui fosse settato come open-drain mentre il circuito non prevede un pull-up e quindi non è in grado di tenere alto il pin ecc...
__________________
Adepto del "La polvere è vita" clan. |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Jan 2003
Città: Brianza
Messaggi: 2687
|
Quote:
grazie per le gentili spiegazioni
__________________
"Le prime giornate di un europeo in America possono essere paragonate alla nascita di un uomo." Franz Kafka
"Don't cry because it's over. Smile because it happened." Theodor Geisel |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:19.




















