www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik R8C - SPI - Transmit bei ext. clock klappt nicht


Autor: Timo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe hier ein R8C/25 StarterKit.
Den UART0 als SPI programmiert mit externen clock:
void init_UART0(void)
{
  /* Port direction */        
  EE_CS_PD = 0;      /* Port P1_3(CS) direction = input */

  pd1_4 = 1;         /* Port P1_4(TxD0) direction = output */
  pd1_5 = 0;         /* Port P1_5(RxD0) direction = input */
  pd1_6 = 0;         /* Port P1_6(CLK0) direction = External clock select */

  u0mr = 0x09;       /* Clock synchronous serial I/O mode , External clock , 1stop bit , parity disabled */
 
  u0c0 = 0x81;       /* f8 select, MSB First */
  u0c1 = 0x05;       /* receive enabled, transmit enabled */
  
  u0brg = 17;        /* UART0 BRG :  clk = 69.4kHz*/
  
  /* Interrupt */
  s0tic = 0x00;      /* UART0 transmit interrupt : Priority level-0(interrupt disable) , Interrupt request = clear */
  s0ric = 0x00;      /* UART0 recive interrupt : Priority level-0(interrupt disable) , Interrupt request = clear */  
     
}

Der Empfang klappt wunderbar - aber der sendemodus nicht.
Habe schon verschiedene Varianten getestet. Einmal mit U0RRM = 1 bzw. 0
Immoment habe ich RRM = 0 und vorm receive mache ich einen dummy send.

Leider funktioniert bei dieser Variante das senden so gut wie gar nicht.
Wenn durch den CS Port ein Int ausgelößt wurde, dann wird zum bsp in 
folgende routine gespriungen (kopiere nur rel. daten hierein)
#pragma vector = KEY
__interrupt void KEY_ISR (void)
 
  u_8 tmp;
  
  u0tb = 0x00;           // dummy send
  while (!ri_u0c1)       /* wait for completion */
    ;
  tmp = u0rb;
  
  s0tic = 0;
  u0tb = tmp;        // start data transmission              
  while (!(txept_u0c0)) // wait for completion
    asm("nop");
}


Der Mikrocontroller (M32C) welcher die Daten an diesen R8C schickt, der 
führt 2 sendebefehle aus, einmal die daten und einmal einen dummy send, 
damit der clock auch beim R8C ankommt.

Leider finde ich im Hardware Manual nur ein Timing diagramm zu receive 
data when external clock is on - und nicht transmit

Hoffe konnte die Problematik erläutern, denn ich wollte nicht zu viel 
drum herum erzählen.

Gruß Timo

PS: Bei der Variante RRM=0 zum Beispiel, da habe ich das dummy send vorm 
receiven entfernt. Da ist es dann auch, dass receven wunderbar klappt. 
senden tut er dann auch, aber da ist es dann so, dass er dann die daten 
bei jedem clock sendet. ok das wäre nur halb so schlimm aber die 
problematik ist, dass wenn dann etwas anderes gesendet werden soll, dass 
er es erst nach 2 angekommen takten ändert, der muss des irgendwie im 
puffer haben. find das auch komisch.

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.