Ich möchte einen externen Flash Speicher (AT25F2048) von einem
ATMEGA1281 über SPI ansprechen. Dazu möchte ich die USART 0
Schnittstelle des MC im SPI Mode verwenden.
Der Speicher und der Mikrokontroller sind über vier Leitungen verbunden:
USART0_RXD -- SO
USART0_TXD -- SI
USART0_CLK -- SCK
PE2 -- CS (Chipselect)
Für die Initialisierung verwende ich folgenden Code:
1 | void uart_spi_init()
|
2 | {
|
3 | UBRR0 = 0;
|
4 | DDRE |= (1 << PE2);
|
5 | UCSR0C = (1 << UMSEL01) | (1 << UMSEL00) | (0 << UCSZ00) | (0 << UCPOL0);
|
6 | UCSR0B = (1 << RXEN0) | (1 << TXEN0);
|
7 | UBRR0 = BRREG;
|
8 | }
|
Um nun ein byte zu senden, verwende ich folgende Methode:
1 | uint8_t uart_spi_transfer( uint8_t data )
|
2 | {
|
3 | while (!(UCSR0A & (1 << UDRE0));
|
4 | UDR0 = data;
|
5 | while (!(UCSR0A & (1 << RXC0)));
|
6 | return UDR0;
|
7 | }
|
Mein Main Programm sieht dann so aus:
1 | int main()
|
2 | {
|
3 | // Set up our CS as output and bring it high
|
4 | CS_DDR |= (1 << CS);
|
5 | CS_PORT |= (1 << CS);
|
6 |
|
7 | uart_spi_init();
|
8 |
|
9 | uint8_t ret = 0;
|
10 |
|
11 | for(;;)
|
12 | {
|
13 | uint8_t data = 0x15;
|
14 | // Bring CS low
|
15 | CS_PORT &= ~(1 << CS);
|
16 | // Transmit data
|
17 | ret = uart_spi_transfer(data);
|
18 | // Bring CS high to end transmission
|
19 | CS_PORT |= (1 << CS);
|
20 | }
|
21 | }
|
Nun habe ich folgendes Problem. Der Returnwert bleibt immer 0x00. Ich
habe festegstellt, dass nach der Datenübertragung (8 SPI-Clockcycles)
das RX Complete Flag sofort gesetzt wird. Danach bricht auch die Clock
ab. Der Flashspeicher kann also nie eine Antwort senden, weil das
Clocksignal ja vom MC aus kommt.
Ich bin nun seit einigen Tagen an diesem Problem dran und weiss wirklich
nicht mehr weiter. Vielen Dank für eure Hilfe im voraus.