Hallo,
leider ist es eine Vorgabe, dass ich das "selber" mache. Aber wenigstens
habe ich jetzt schon einmal einen Ablauf, wie ich vorgehen kann.
Schreibe nämlich gerade meine Abschlussarbeit.
Eine Frage zum schreiben in den RAM:
Wenn ich versuche die Adresse zu setzen, dann übernimmt er das LSB, aber
nicht das MSB (bleibt immer 0x00). Mein Code dazu sieht wie folgt aus:
1 | uint8_t SPI_TxRx(uint8_t cData)
|
2 | {
|
3 | SPDR = cData;
|
4 | while(!(SPSR & (1<<SPIF)));
|
5 | return SPDR;
|
6 | }
|
7 |
|
8 | uint8_t SPI_RxRam(uint16_t Address)
|
9 | {
|
10 | uint8_t status;
|
11 | uint16_t data;
|
12 |
|
13 | PORTB &= ~(1<<DD_CS); // CS\ low
|
14 |
|
15 | _delay_us(25);
|
16 |
|
17 | status = SPI_TxRx((uint8_t)(Address>>8));
|
18 | SPI_TxRx((uint8_t)(Address & 0x00ff));
|
19 | data = (SPI_TxRx(0xff)<<8);
|
20 | data = data + (SPI_TxRx(0xff) & 0x00ff);
|
21 |
|
22 | PORTB |= 1<<DD_CS; // CS\ high
|
23 | return data;
|
24 | }
|
25 |
|
26 | void SPI_TxRam(uint16_t Address, uint16_t data)
|
27 | {
|
28 | uint8_t status;
|
29 |
|
30 | PORTB &= ~(1<<DD_CS); // CS\ low
|
31 |
|
32 | _delay_us(25);
|
33 |
|
34 | status = SPI_TxRx((uint8_t)(Address>>8));
|
35 | SPI_TxRx((uint8_t)(Address & 0x00ff));
|
36 | SPI_TxRx((uint8_t)(data>>8));
|
37 | SPI_TxRx((uint8_t)(data & 0x00ff));
|
38 |
|
39 | PORTB |= 1<<DD_CS; // CS\ high
|
40 | }
|
und in der main rufe ich es so auf:
1 | SPI_TxRam(0xda80, 0xabcd); // 0x016a
|
2 |
|
3 | _delay_ms(1000);
|
4 |
|
5 | USART_Tx((uint8_t)(SPI_RxRam(0xdaa0)>>8)); // 0x016a MSB
|
6 | USART_Tx((uint8_t)(SPI_RxRam(0xdaa0) & 0x00ff)); // 0x016a LSB
|
Hoffe das es nur ein kleiner Fehler ist...
Grüße
Dennis