mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SPI-Bits manuell auslesen?


Autor: max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey profis,

habe gerade mein praktikum angefange und habe schon folgendes problem :(

Ich soll hier ein mikrocontroller programmieren , der von einem 
AD-Wandler die daten bekommt und diese zu einem bluetooth modul schickt.

Das problem:
Ich muss einen MSP430 F 2274 benutzen. Der mikrocontroller hat leider 
SPI und UART auf den gleichen pins. SPI brauche ich um mit dem 
AD-wandler zu kommunizieren und UART um mit dem bluetooth-modul.

Ich habe mir überlegt SPI manuell in C zu programmieren, also die 
leitung auf irrgendein pin legen und diesen zu richtigen zeit abzuhören. 
Der AD-Wandler arbeitet mit 0,8 MHz und der MSP430*** ist 16MHz schnell.

Hat jemand schon erfahrungen damit? das problem kommt doch bestimmt 
öffters vor.

PS: leider habe ich noch gar nichts zu ausprobieren hier ausser MSP430F 
2274 EVO-board, das alleirdings auch noch nicht läuft

MFG max

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Peter Diener (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

nimm doch nen MSP430F2417 dafür, der hat genug Schnittstellen. Das in 
Software wird eine reine Datenschlacht.

Peter

Autor: max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für die idee.

das geht bestimmt auch mit internen schieberegistern von MSP430 F 2274.

werde mich nochmal melden, wenn was beim ausprobieren schief geht ;)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Diener wrote:
> Das in
> Software wird eine reine Datenschlacht.

Was ist denn an den paar Bytes Code ne Datenschlacht?

SPI ist sehr einfach in Software zu machen und kaum größer als der Code 
für HW-SPI.
Daher findet man auch nen Haufen Beispiele im Netz dafür.


Peter

Autor: Maria (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uint16_t Exchange(GPIO ucSS, uint8_t ucCommand, BOOL b16BitAnswer)
{
  uint16_t usMask, usAnswer;

  PSet(ucSS, FALSE);    // /SS low

  for (usMask = 0x0080; usMask; usMask >>= 1)
  {  // send 8 bit command
    PSet(GYRO_SCK, FALSE);
    PSet(GYRO_MOSI, ucCommand & usMask);
    PSet(GYRO_SCK, TRUE);
  }

  for (usAnswer = 0, usMask = b16BitAnswer ? 0x8000 : 0x0080; usMask; 
usMask >>= 1)
  {  // receive 16 bit Answer
    PSet(GYRO_SCK, FALSE);
    PSet(GYRO_SCK, TRUE);
    usAnswer = (usAnswer << 1) | PGet(GYRO_MISO);
  }

  PSet(ucSS, TRUE);    // /SS high

  return usAnswer;
}

Soft SPI: Diese Funktion sendet ein 8 Bit Kommando end empfängt 8 oder 
16 Bit als Antwort.

Die Hilfsfunktion PSet() setzt ein Port Pin high/low.
PGet() fragt ein Port Pin ab.

Autor: max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@peter diener: danke für die antwort, leider ist ein µ-controller dieser 
art doppelt so teuer wie F 2274.

@danneger : werde versuchen beispiel code zu finden. habe versucht bist 
jetzt "SPI simulieren" einzugeben, da kamm nichts gescheites raus.
aber "SPI software" ist bestimmt besser, als suchwort  ;)

danke

Autor: Jörg S. (joerg-s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ich muss einen MSP430 F 2274 benutzen. Der mikrocontroller hat leider
>SPI und UART auf den gleichen pins.
Der MSP430F2274 hat 2 USCI Channels (A0, B0) die (natürlich) auf 
verschiedene Pins gehen. Somit kannst du SPI und UART gleichzeitig 
nutzen.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Maria wrote:

> Die Hilfsfunktion PSet() setzt ein Port Pin high/low.
> PGet() fragt ein Port Pin ab.


Beim AVR-GCC geht das einfacher, da kann man direkt auf die IO-Pins per 
Bitvariablen zugreifen:
#include <avr\io.h>


struct bits {
  uint8_t b0:1;
  uint8_t b1:1;
  uint8_t b2:1;
  uint8_t b3:1;
  uint8_t b4:1;
  uint8_t b5:1;
  uint8_t b6:1;
  uint8_t b7:1;
} __attribute__((__packed__));

#define SBIT(port,pin) ((*(volatile struct bits*)&port).b##pin)


#define SPI_CLK         SBIT( PORTB, 0 )        // clock
#define SPI_CLK_DDR     SBIT( DDRB,  0 )
#define SPI_MOSI        SBIT( PORTB, 1 )        // data out
#define SPI_MOSI_DDR    SBIT( DDRB,  1 )
#define SPI_MISO_PIN    SBIT( PINB,  2 )        // data in


uint8_t shift_io( uint8_t b )   // send / receive byte
{
  uint8_t i;

  SPI_CLK_DDR = 1;              // set as output
  SPI_MOSI_DDR = 1;

  for( i = 8; i; i-- ){         // 8 bits
    SPI_MOSI = 0;
    if( b & 0x80 )              // high bit first
      SPI_MOSI = 1;
    b <<= 1;
    SPI_CLK = 1;
    if( SPI_MISO_PIN )
      b++;
    SPI_CLK = 0;
  }
  return b;
}

Sind dann riesige 26 Byte Code.


Peter

Autor: max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@jörg s.:
hier ein auszug aus data-sheet.

Pin 3.1-->USCI_B0 slave in/master out in SPI mode, SDA I2C data in I2C 
mode

Pin 3.2-->USCI_B0 slave out/master in in SPI mode, SCL I2C clock in I2C 
mode

Pin 3.3-->USCI_B0 clock input/output / USCI_A0 slave transmit enable

Pin 3.4-->USCI_A0 transmit data output inUARTmode, slave in/master out 
in SPImode

Pins 3.5-->USCI_A0 receive data input in UART mode, slave out/master in 
in SPI mode



verstehe ich da was falsch? USCI_B0 und USCI_A0 überschneiden sich soch 
am Pin 3.3, allerdings würde ja sonst usci_a0 und usci_b0 keinen sinn 
machen, hm...habe jetzt im user guide auch die bestätigung gefunden, 
dass es gehen müsste. danke

Autor: max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke nochmal an alle, habe leider noch keine erfahrung mit 
mikrocontroller, deswegen übersehe ich wohl auch gerne sachen im 
datenblatt. werde mich bestimmt wieder melden, wenn es ans basteln geht 
:)

Autor: Jörg S. (joerg-s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>deswegen übersehe ich wohl auch gerne sachen im datenblatt.
Kann passieren. Das mit der Überschneindung auf P3.3 hatte ich auch 
nicht gesehen :) Aber bei UART + SPI sollte es gehen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.