TTK4155 Lab Node 1
Term project in the NTNU course TTK4155 Embedded and Industrial Computer Systems Design
Loading...
Searching...
No Matches
External Memory (SRAM)

Macros

#define XMEM_3KB   0
#define MEM_OFFSET   0x1800u
#define XMEM_SIZE   0x0800u

Functions

int xmem_init (void)
 Initializes external SRAM (2KB or 3KB depending on XMEM_3KB).
int SRAM_test (void)
 Tests external SRAM and prints a report.

Detailed Description

Macro Definition Documentation

◆ MEM_OFFSET

#define MEM_OFFSET   0x1800u

#include <xmem.h>

Base address for external SRAM

Definition at line 26 of file xmem.h.

Referenced by SRAM_test().

◆ XMEM_3KB

#define XMEM_3KB   0

#include <xmem.h>

Set to 1 if using 3KB memory instead of 2KB

Definition at line 15 of file xmem.h.

◆ XMEM_SIZE

#define XMEM_SIZE   0x0800u

#include <xmem.h>

Size of external SRAM: 2KB

Definition at line 27 of file xmem.h.

Referenced by SRAM_test().

Function Documentation

◆ SRAM_test()

int SRAM_test ( void )

#include <xmem.h>

Tests external SRAM and prints a report.

Returns
0 if memory is OK
-1 if write phase failed
-2 if retrieval phase failed

Definition at line 43 of file xmem.c.

43 {
44 int status = 0;
45
46 volatile uint8_t *ext_ram = (uint8_t *)MEM_OFFSET; // Start adress for SRAM
47 const uint16_t ext_ram_size = XMEM_SIZE;
48
49 uint16_t write_errors = 0;
50 uint16_t retrieval_errors = 0;
51
52 LOG_INF("Starting SRAM test...");
53
54 // rand() stores internal state; use it once to vary the seed each run
55 uint16_t seed = (uint16_t)rand();
56
57 // Write phase: write and verify immediately
58 srand(seed);
59 for (uint16_t i = 0; i < ext_ram_size; i++) {
60 uint8_t value = (uint8_t)rand();
61 ext_ram[i] = value;
62 uint8_t retrieved = ext_ram[i];
63 if (retrieved != value) {
64 // printf("Write phase error: ext_ram[%4u] = 0x%02X (should be
65 // 0x%02X)\n\r",
66 // i, (unsigned)retrieved, (unsigned)value);
67 write_errors++;
68 }
69 }
70
71 // Retrieval phase: ensure values didn't change after writes
72 srand(seed); // reset PRNG to same sequence
73 for (uint16_t i = 0; i < ext_ram_size; i++) {
74 uint8_t value = (uint8_t)rand();
75 uint8_t retrieved = ext_ram[i];
76 if (retrieved != value) {
77 // printf(
78 // "Retrieval phase error: ext_ram[%4u] = 0x%02X (should be
79 // 0x%02X)\n\r", i, (unsigned)retrieved, (unsigned)value);
80 retrieval_errors++;
81 }
82 }
83
84 LOG_INF("SRAM test completed");
85
86 // printf(
87 // "SRAM test completed with\n\r%4u errors in write phase and\n\r%4u
88 // errors " "in retrieval phase\n\r\n\r", write_errors, retrieval_errors);
89
90 if (write_errors) {
91 return -1;
92 }
93 if (retrieval_errors) {
94 return -2;
95 }
96
97 return 0;
98}
#define LOG_INF(msg)
Definition log.h:59
#define XMEM_SIZE
Definition xmem.h:27
#define MEM_OFFSET
Definition xmem.h:26

Referenced by main().

◆ xmem_init()

int xmem_init ( void )

#include <xmem.h>

Initializes external SRAM (2KB or 3KB depending on XMEM_3KB).

Returns
0 on success, non-zero on error

Definition at line 12 of file xmem.c.

12 {
13 // SpecialFunction IO Register
14 // Enable external memory interface, datasheet ATmega162 pg18 & 26
15 MCUCR |= (1 << SRE);
16
17 // Release pins used for JTAG
18 // The pins in range PC7-PC4 is reserved for JTAG, and XMBK to stop pins from
19 // floating see pg32 datasheet
20 // SFIOR =
21 // (SFIOR & ~((1 << XMM1) | (1 << XMM0))) | ((1 << XMM2) /* | (1 <<
22 // XMBK)*/);
23 SFIOR |= (1 << XMM2);
24
25 // Extended MCU Control Register pg30 datasheet
26 // Setting SRL2-SRL0 as 1 gives the sectors lower sector= 0x1100-0xDFFF & high
27 // sector =0xE000-=xFFFF Setting SRW01 & SRW00 as 1 gives waitstate 2 cycles
28 // before writing and 1 cycle before sending new address, see pg 31
29 // EMCUCR =
30 // (1 << SRW01) | (1 << SRW00) & ~(1 << SRL2) & ~(1 << SRL1)6(1 << SRL0);
31
32 // EMCUCR = (1 << SRW11 | 1 << SRW10) & ~(SRL0) & ~(SRL1) & ~(SRL2);
33 // EMCUCR = 0;
34
35 // MCU Control Register pg30
36 // Same as EMCUCR but for upper sector, set to wait 1 cycle for read & write,
37 // see table at pg31
38 // MCUCR = (MCUCR & ~(1 << SRW11)) | (1 << SRW10);
39 return 0;
40}

Referenced by main().