Forum: Mikrocontroller und Digitale Elektronik C18: mit PIC18F25J10 einen Flashspeicher (ATDB041B) über SPI ansprechen


von thomas harasek (Gast)


Lesenswert?

Hallo,

ich sollte mit einem PIC18F25J10 einen Flashspeicher von ATMEL 
(ATDB041B) ansprechen (über SPI).
Da ich bisher generell wenig Erfahrung habe,
habe ich mal gegooglt, jedoch nichts gefunden, was mir wirklich 
weiterhilft
(und die zig Beispielprogramme - zumeist SPI/EEPROM - habe ich zwar 
versucht abzuändern,
jedoch ohne großen Erfolg).

In meiner main-Routine rufe ich die flash_SPI_1_Test() auf.
Die Funtion busy_polling() endet immer in einer Endlosschleife!

Kann mir bitte jemand helfen bzw. gibt es entsprechende Samplecodes?


Vielen Dank.
thomas

1
#include <p18f25j10.h>
2
#include <spi.h>
3
#include <controller.h>
4
5
void busy_polling(void);
6
void byte_write_to_buffer1(void);
7
void byte_write_to_mainmemory(void);
8
void byte_read_from_mainmemory(void);
9
unsigned char byte_read_from_buffer1(void);
10
11
12
// VARIABLE Definitions
13
unsigned char result;
14
15
extern char gInput[20];
16
17
#define SPI_CS LATCbits.LATC2
18
19
20
void flash_SPI_1_Test(void)
21
{
22
  TRISCbits.TRISC2 = 0;
23
24
  SPI_CS = 1;
25
  OpenSPI(SPI_FOSC_16, MODE_00, SMPEND);
26
  busy_polling();
27
  byte_write_to_buffer1();
28
  busy_polling();
29
  byte_write_to_mainmemory();
30
  busy_polling();
31
  byte_read_from_mainmemory();
32
  busy_polling();
33
  gInput[0] = byte_read_from_buffer1();
34
35
  gInput[1] = 0;
36
  rs485_p_Client_Output((const far rom char *) "Speicherausgabe: ");
37
  rs485_d_Client_Output((char *) gInput);
38
  rs485_p_Client_Output((const far rom char *) "\n\r");
39
40
  CloseSPI();
41
}
42
43
44
void busy_polling (void)
45
{
46
47
  unsigned char read;
48
49
  do
50
  {
51
    SPI_CS = 0;
52
    result = putcSPI(0xD7);    //Status Register Read
53
    if (result==-1)
54
      rs485_p_Client_Output((const far rom char *) "Debug: Fehler bei busy_polling() - 2\n\r");
55
56
    read = getcSPI();
57
    SPI_CS = 1;
58
59
  } while (read & 0x80);      //stay in loop until !busy
60
}
61
62
void byte_write_to_buffer1 (void)  //Opcode 0x84: x x x x x x x x x x x x x x x B B B B B B B B B
63
{
64
  SPI_CS = 0;
65
  result = putcSPI(0x84);      
66
  if (result==-1)
67
    rs485_p_Client_Output((const far rom char *) "Debug: Fehler bei byte_write_to_buffer1() - 1\n\r");
68
69
  result = putcSPI(0x00);
70
  if (result==-1)
71
    rs485_p_Client_Output((const far rom char *) "Debug: Fehler bei byte_write_to_buffer1() - 2\n\r");
72
73
  result = putcSPI(0x00);  
74
  if (result==-1)
75
    rs485_p_Client_Output((const far rom char *) "Debug: Fehler bei byte_write_to_buffer1() - 3\n\r");
76
77
  result = putcSPI(0x00);
78
  if (result==-1)
79
    rs485_p_Client_Output((const far rom char *) "Debug: Fehler bei byte_write_to_buffer1() - 4\n\r");
80
81
  result = putcSPI('B');
82
  if (result==-1)
83
    rs485_p_Client_Output((const far rom char *) "Debug: Fehler bei byte_write_to_buffer1() - 5\n\r");
84
85
  SPI_CS = 1;  
86
}
87
88
void byte_write_to_mainmemory (void)  //Opcode 0x83: r r r r P P P P P P P P P P P x x x x x x x x x
89
{
90
  SPI_CS = 0;
91
  result = putcSPI(0x83);
92
  if (result==-1)
93
    rs485_p_Client_Output((const far rom char *) "Debug: Fehler bei byte_write_to_mainmemory() - 1\n\r");
94
95
  result = putcSPI(0x00);
96
  if (result==-1)
97
    rs485_p_Client_Output((const far rom char *) "Debug: Fehler bei byte_write_to_mainmemory() - 2\n\r");
98
99
  result = putcSPI(0x00);  
100
  if (result==-1)
101
    rs485_p_Client_Output((const far rom char *) "Debug: Fehler bei byte_write_to_mainmemory() - 3\n\r");
102
103
  result = putcSPI(0x00);
104
  if (result==-1)
105
    rs485_p_Client_Output((const far rom char *) "Debug: Fehler bei byte_write_to_mainmemory() - 4\n\r");
106
107
  SPI_CS = 1;
108
}
109
110
void byte_read_from_mainmemory (void)  //Opcode 0x53: r r r r P P P P P P P P P P P x x x x x x x x x
111
{
112
  SPI_CS = 0;
113
  result = putcSPI(0x53);
114
  if (result==-1)
115
    rs485_p_Client_Output((const far rom char *) "Debug: Fehler bei byte_read_from_mainmemory() - 1\n\r");
116
117
  result = putcSPI(0x00);
118
  if (result==-1)
119
    rs485_p_Client_Output((const far rom char *) "Debug: Fehler bei byte_read_from_mainmemory() - 2\n\r");
120
121
  result = putcSPI(0x00);  
122
  if (result==-1)
123
    rs485_p_Client_Output((const far rom char *) "Debug: Fehler bei byte_read_from_mainmemory() - 3\n\r");
124
125
  result = putcSPI(0x00);
126
  if (result==-1)
127
    rs485_p_Client_Output((const far rom char *) "Debug: Fehler bei byte_read_from_mainmemory() - 4\n\r");
128
129
  SPI_CS = 1;  
130
}
131
132
unsigned char byte_read_from_buffer1 (void)  //Opcode 0xD4: x x x x x x x x x x x x x x x B B B B B B B B B
133
{
134
  unsigned char read;
135
136
  SPI_CS = 0;
137
  result = putcSPI(0xD4);
138
  if (result==-1)
139
    rs485_p_Client_Output((const far rom char *) "Debug: Fehler bei byte_read_from_buffer1() - 1\n\r");
140
141
  result = putcSPI(0x00);
142
  if (result==-1)
143
    rs485_p_Client_Output((const far rom char *) "Debug: Fehler bei byte_read_from_buffer1() - 2\n\r");
144
145
  result = putcSPI(0x00);
146
  if (result==-1)
147
    rs485_p_Client_Output((const far rom char *) "Debug: Fehler bei byte_read_from_buffer1() - 3\n\r");
148
149
  result = putcSPI(0x00);
150
  if (result==-1)
151
    rs485_p_Client_Output((const far rom char *) "Debug: Fehler bei byte_read_from_buffer1() - 4\n\r");
152
153
  read = getcSPI();
154
155
  SPI_CS = 1;  
156
157
  return read;
158
}

von thomas harasek (Gast)


Lesenswert?

Hi,

in der Funktion busy_polling() ist die While-Bedingung falsch gewesen.
Nun lauft das Programm durch,
ich kann jedoch trotzdem nicht den richtigen Speicherinhalt auslesen -
wobei ich nicht weiß, ob überhaupt das Schreiben funktioniert

lg
thomas
1
void busy_polling (void)
2
{
3
4
  unsigned char read;
5
6
  do
7
  {
8
    SPI_CS = 0;
9
    result = putcSPI(0xD7);    //Status Register Read
10
    if (result==-1)
11
      rs485_p_Client_Output((const far rom char *) "Debug: Fehler bei busy_polling() - 2\n\r");
12
13
    read = getcSPI();
14
    SPI_CS = 1;
15
16
  } while (read & 0x80);      //stay in loop until !busy
17
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.