R8C - SPI - Transmit bei ext. clock klappt nicht

Gast #918708
Hallo,
ich habe hier ein R8C/25 StarterKit.
Den UART0 als SPI programmiert mit externen clock:
1
void init_UART0(void)
2
{
3
  /* Port direction */        
4
  EE_CS_PD = 0;      /* Port P1_3(CS) direction = input */
5

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

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

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)
1
#pragma vector = KEY
2
__interrupt void KEY_ISR (void)
3
 
4
  u_8 tmp;
5
  
6
  u0tb = 0x00;           // dummy send
7
  while (!ri_u0c1)       /* wait for completion */
8
    ;
9
  tmp = u0rb;
10
  
11
  s0tic = 0;
12
  u0tb = tmp;        // start data transmission              
13
  while (!(txept_u0c0)) // wait for completion
14
    asm("nop");
15
}


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

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.