TTK4155 Lab Node 1
Term project in the NTNU course TTK4155 Embedded and Industrial Computer Systems Design
Loading...
Searching...
No Matches
xmem.c
Go to the documentation of this file.
1#include <avr/io.h>
2// #include <stdio.h>
3// #include <string.h>
4
5#include "log.h"
6#include "uart.h"
7#include "xmem.h"
8
10
11// Initialize external memory
12int xmem_init(void) {
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}
41
42// Test taken from Lab-tasks
43int SRAM_test(void) {
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 LOG_MODULE_DEFINE(name)
Definition log.h:39
int SRAM_test(void)
Tests external SRAM and prints a report.
Definition xmem.c:43
#define XMEM_SIZE
Definition xmem.h:27
#define MEM_OFFSET
Definition xmem.h:26
int xmem_init(void)
Initializes external SRAM (2KB or 3KB depending on XMEM_3KB).
Definition xmem.c:12
Logging interface for debug messages.
UART communication driver.
External SRAM interface for ATmega microcontrollers.