Dziś przypadkowo znalazłem w szufladzie pamięć AT29C020 (2Mb = 8x256k). Przy okazji nauki obsługi kolorowego wyświetlacza LCD pomyślałem, że ta pamięć nada się idealnie. Przyszedł więc czas na napisanie protokołu komunikacji z pamięcią. Otwarłem więc notę katalogową i na jej podstawie postanowiłem napisać program do obsługi (w C).
Harware:
ATMEGA32 + AT29C020
PORTA jako linia adresowa (na razie tylko 8 bitów bo zabrakło mi już kabelków do łączenia na płytce testowej) PORTA.0-7 -> A.0-7, A.8-17 pływajace
PORTC jako linia danych (8 bitów do wysyłania i odbierania danych) PORTC.0-7 -> D.7-0 (odwrócone)
PORTD2 = !CE
PORTD3 = !OE
PORTD4 = !WE
Software:
Program an na razie jest w stanie odczytać jeden pierwsze 256 bajtów zapisanych w pamięci. Teoretycznie te same 256 bajtów powinien być w stanie zapisać.
Problem jest w tym, że nie działa zapis. Co do odczytu tez mam wątpliwości, bo w zależności od ustawienia !CE i OE! zwraca mi różne wartości. Co do zapisu to w ogóle nie działa bo odczyt ciągle zwraca te same wartości co przed zapisem.
Odpowiedź układu w terminalu RS-232:
Wszystkie odczytane wartości w tym momencie to powinny być 0xFF (lub 0, bo podłączyłem odwrotnie linie danych) a są różne.
Najlepiej jakby ktoś napisał gdzie są błędy. W najgorszym wypadku będę musiał Was poprosić o jakiś gotowy działający kod.
P.S. Pamięć ta zostalą z czegoś wyciągnięta jakiś czas temu więc raczej nie bezie pusta dlatego wartości odczytanie nie są równe.
Harware:
ATMEGA32 + AT29C020
PORTA jako linia adresowa (na razie tylko 8 bitów bo zabrakło mi już kabelków do łączenia na płytce testowej) PORTA.0-7 -> A.0-7, A.8-17 pływajace
PORTC jako linia danych (8 bitów do wysyłania i odbierania danych) PORTC.0-7 -> D.7-0 (odwrócone)
PORTD2 = !CE
PORTD3 = !OE
PORTD4 = !WE
Software:
#include "func.h"
#include "uart.h"
#include <util/delay.h>
#define adrDIR DDRA
#define adrPORT PORTA
#define dtaDIR DDRC
#define dtaPORT PORTC
#define dtaPIN PINC
#define setPORT PORTD
#define setDIR DDRD
#define CE (1<<PD2)
#define OE (1<<PD3)
#define WE (1<<PD4)
void InitMEM(void)
{
adrDIR = 0xFF; // addresing port as OUT
adrPORT = 0x00; // set addres 0
setDIR = 0xFF;
}
int read_mem(int adrx)
{
PrintString("\r\n\r\n");
dtaDIR = 0x00; // data IN
dtaPORT = 0xFF; // pull up to +
_delay_us(500);
int mem = 0;
int adr = 0;
int licznik = 0;
while(adr<0xFF)
{
adrPORT = adr;
setPORT &= ~CE;
setPORT &= ~OE;
setPORT &= ~WE;
_delay_ms(4);
int q = 255 - dtaPIN;
adrPORT = 0x00;
setPORT |= CE;
setPORT |= OE;
if(q<10) PrintString(" ");
if(q<100) PrintString(" ");
PrintString(itoch(q));
PrintString(" ");
adr++;
licznik++;
if(licznik>10)
{
licznik = 0;
PrintString("\r\n");
}
}
return mem;
}
void write_mem(int adrx, int value)
{
PrintString("\r\n\r\n");
dtaDIR = 0xFF; // data OUT
dtaPORT = 0x00; // reset data port
int adr = 0;
int licznik = 0;
while(adr<0xFF)
{
setPORT |= OE; //OE HIGH
adrPORT = adr; //set addres
dtaPORT = value; //data to write
_delay_us(100);
setPORT &= ~CE; //CE LOW
_delay_us(200);
setPORT &= ~WE; //WE LOW
_delay_ms(4); //wait for writing
setPORT |= WE; //WE HIGH
setPORT &= ~OE; //OE LOW
setPORT |= CE; //CE HIGH
PrintString(">");
adr++;
}
}
int main(void)
{
InitMEM();
InitRS();
RSspeed(19200);
PrintString("\r\n\r\n\r\n------- START ------- \r\n\r\n");
write_mem(-1,0xFF);
_delay_ms(200);
read_mem(-1);
PrintString("\r\n\r\n-------- END -------- \r\n");
while(1);
return 0;
}
Program an na razie jest w stanie odczytać jeden pierwsze 256 bajtów zapisanych w pamięci. Teoretycznie te same 256 bajtów powinien być w stanie zapisać.
Problem jest w tym, że nie działa zapis. Co do odczytu tez mam wątpliwości, bo w zależności od ustawienia !CE i OE! zwraca mi różne wartości. Co do zapisu to w ogóle nie działa bo odczyt ciągle zwraca te same wartości co przed zapisem.
Odpowiedź układu w terminalu RS-232:
------- START -------
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 32 32 32 32 32 32
32 96 32 32 32 96 32 96 224 96 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 32 32 32 96 32 224 224
96 32 96 224 96 224 96 96 96 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 32 32 32 224 32 224 224 96
32 96 224 96 224 96 96 96 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 32 224 224 96 224 96 224 96 224
96 96 96 224 96 96 96 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 32 32 32 96 32 224 96 224 32 224
224 96 224 96 96 96 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
32 224 224 96 224 96 96 96 224 224 224
224 96 224 224 96 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 32
224 224 224 224 96 224 224 224 224 96 224
224 224 224 96 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 224 96
224 224 224 224 224 96 224 224 224 96 96
96 224
-------- END --------
Wszystkie odczytane wartości w tym momencie to powinny być 0xFF (lub 0, bo podłączyłem odwrotnie linie danych) a są różne.
Najlepiej jakby ktoś napisał gdzie są błędy. W najgorszym wypadku będę musiał Was poprosić o jakiś gotowy działający kod.
P.S. Pamięć ta zostalą z czegoś wyciągnięta jakiś czas temu więc raczej nie bezie pusta dlatego wartości odczytanie nie są równe.