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


von Timo (Gast)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.