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.