реклама на сайте
подробности

 
 
> Память (внешняя память), Как устроена память???
satnettv
сообщение Sep 4 2007, 11:26
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 35
Регистрация: 8-08-07
Из: MockBa
Пользователь №: 29 658



Помогите разобраться как устроена память:

1. как устроена адресация памяти (т.е. как выставляются адреса для записи, чтения)
2. как записывать, читать данные.

в принципе общее устройство памяти понятно - данные забиваются в конкретные адреса памяти.

хотелось бы понять как прописывать адреса для нескольких записей в память (при чтении).

Вот, например, есть строка n-символов (пусть будет 80 бит), периодически строка меняется (кол-во символов не меняется), т.е каждую строку нужно записывать в свой конкретный адрес. как нужно учитывать это при простановке адреса для записи??

затем надо считывать записанные строки из памяти, как узнать по какому адресу находятся конкретная записанная строка???


Если можно покажите код на Си для реализации данного дела (желательно с пояснениями).

использую компилятор CodeVision, в качестве памяти используется FL25L256, микроконтроллер мега128, соединены по интерфейсу SPI.


Заранее извините за безграммотность по данному вопросу, и заранее всем спасибо!!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
vesago
сообщение Sep 4 2007, 14:48
Сообщение #2


Тутэйшы
****

Группа: Свой
Сообщений: 708
Регистрация: 30-11-04
Пользователь №: 1 263



Не совсем понятно - интересует особенности работы с данной микросхемой или идеология работы со внешней памятью. Если первое - лучьше как всегда почитать мануал. Если второе, заводите пару функций типа u8_t Read_EEPROM(u16_t addr, u8_t len, u8_t *buf); u8_t Write_EEPROM(u16_t addr, u8_t len, u8_t *buf); Если несколько одинаковых записей, в качестве addr передаете номер записи, умноженный на размер записи ну и опционально плюс смещение.
Go to the top of the page
 
+Quote Post
satnettv
сообщение Sep 4 2007, 14:56
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 35
Регистрация: 8-08-07
Из: MockBa
Пользователь №: 29 658



Цитата(vesago @ Sep 4 2007, 18:48) *
Если второе, заводите пару функций типа u8_t Read_EEPROM(u16_t addr, u8_t len, u8_t *buf); u8_t Write_EEPROM(u16_t addr, u8_t len, u8_t *buf); Если несколько одинаковых записей, в качестве addr передаете номер записи, умноженный на размер записи ну и опционально плюс смещение.




Более конкретно интересует этот вопрос. Если можно распишите пожалуйста более детально ("Если несколько одинаковых записей, в качестве addr передаете номер записи, умноженный на размер записи ну и опционально плюс смещение"). С памятью никогда не работал, а требуется сделать описанное выше. Так что более подробная инфа по данной теме никогда не помешает. Очень интересует реалиазация процедур на Си.
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Sep 5 2007, 09:48
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(satnettv @ Sep 4 2007, 18:56) *
Более конкретно интересует этот вопрос. Если можно распишите пожалуйста более детально ("Если несколько одинаковых записей, в качестве addr передаете номер записи, умноженный на размер записи ну и опционально плюс смещение"). С памятью никогда не работал, а требуется сделать описанное выше. Так что более подробная инфа по данной теме никогда не помешает. Очень интересует реалиазация процедур на Си.


Пусть у вас есть структура
typedef struct
{
///все, что угодно, в том числе ваша строка
} TStruct;
TStruct a, b, c, d;
и вам надо их хранить в памяти начиная с адреса ADDR друг за другом. Тогда адрес первой структуры будет ADDR, второй - ADDR + sizeof(TStruct), n-ой ADDR + sizeof(TStruct) * (n-1). Этот адрес вы и передете вышеуказанным ф-циям.
Как реализовать эти ф-ции для вашео типа памяти - надо почитать даташит. Скорее всего, есть некие опкоды записи и чтения, вы сначала передаете опкод, затем адрес, а затем либо пишите либо читаете информацию.
Запись может быть более сложная, если стирание происходит секторами; часто запись ограничена 1-й страницей. Но тут вам надо прочитать даташит, и если будут конкретные вопросы - задавайте.

Сообщение отредактировал Непомнящий Евгений - Sep 5 2007, 09:48
Go to the top of the page
 
+Quote Post
satnettv
сообщение Sep 5 2007, 10:11
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 35
Регистрация: 8-08-07
Из: MockBa
Пользователь №: 29 658



Цитата(Непомнящий Евгений @ Sep 5 2007, 13:48) *
Пусть у вас есть структура
typedef struct
{
///все, что угодно, в том числе ваша строка
} TStruct;
TStruct a, b, c, d;
и вам надо их хранить в памяти начиная с адреса ADDR друг за другом. Тогда адрес первой структуры будет ADDR, второй - ADDR + sizeof(TStruct), n-ой ADDR + sizeof(TStruct) * (n-1). Этот адрес вы и передете вышеуказанным ф-циям.
Как реализовать эти ф-ции для вашео типа памяти - надо почитать даташит. Скорее всего, есть некие опкоды записи и чтения, вы сначала передаете опкод, затем адрес, а затем либо пишите либо читаете информацию.
Запись может быть более сложная, если стирание происходит секторами; часто запись ограничена 1-й страницей. Но тут вам надо прочитать даташит, и если будут конкретные вопросы - задавайте.



Со структорой не совсем понятно как-то (если можно распишите на примере). По поводу оп-кодов для памяти все изучил, смысл общий понятен.
У меня задача состоит в следующем:
написать 2 процедуры чтения и записи в память (т.е. в какой-то момент формируются строки по n-символов, далее их нужно записывать в память, как-то считать кол-во строк записанных в память, а затем в какой-то момент времени считать все строки из памяти). Вот в принципе что мне надо. Если вас не затруднит не могли бы ли вы расписать этот процесс по подробнее.


а еще интересует процесс упаовки данных (т.е. какое-то примитивное сжатие данных) перед тем как посылать в память.
Go to the top of the page
 
+Quote Post
satnettv
сообщение Sep 5 2007, 14:29
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 35
Регистрация: 8-08-07
Из: MockBa
Пользователь №: 29 658



Цитата(satnettv @ Sep 5 2007, 14:11) *
Со структорой не совсем понятно как-то (если можно распишите на примере). По поводу оп-кодов для памяти все изучил, смысл общий понятен.
У меня задача состоит в следующем:
написать 2 процедуры чтения и записи в память (т.е. в какой-то момент формируются строки по n-символов, далее их нужно записывать в память, как-то считать кол-во строк записанных в память, а затем в какой-то момент времени считать все строки из памяти). Вот в принципе что мне надо. Если вас не затруднит не могли бы ли вы расписать этот процесс по подробнее.
а еще интересует процесс упаовки данных (т.е. какое-то примитивное сжатие данных) перед тем как посылать в память.



#include <mega128.h>
#include <stdio.h>
#include <spi.h>
#include <delay.h>

#define WREN 0x06 //Set Write Enable Latch
#define WRDI 0x04 //Write Disable
#define RDSR 0x05 //Read Status Register
#define WRSR 0x01 //Write Status Register
#define READ 0x03 //Read Memory Data
#define WRITE 0x02 //Write Memory Data
#define Ready 1;
#define SPIF 0x80 //Флаг прерывания по SPI
#define Zapis 80 //размер строки
#define Dop 30 // смещение

char Zap[128] //запись из памяти
char nmbzap=0; //количество записей в памяти

char TOP_ADDR=256;
unsigned char temp = 0x80;

// SPI interrupt service routine
interrupt [SPI_STC] void spi_isr(void)
{
unsigned char data;
data=SPDR;
}


/* проверка занятости интерфейса SPI*/

char ReadySPI(void)
{
return (SPSR>>7); // 1 - ready
}

/* чтение из памяти одного или нескольких байт */

/* Чтение записи*/
char ReadSPI(int address)

{

if ((address) <= TOP_ADDR)
{
if (SPSR & temp) // проверка занятости интерфейса SPI
{
SPCR = 0x00; //запрет прерывания по SPI
SPDR = READ; //передать оп-код READ
return SPDR;
}
}
}


/* Запись */
char WriteSPI(int mesto, char Dzap)
{
if (start_add <= TOP_ADDR)
{
if (SPSR & temp) // проверка занятости интерфейса SPI
{
SPDR = WREN; // оп-код подготовки записи
SPDR = WRITE; // оп-код записи
SPAR = nmbzap*Zapis+Dop; // адрес (номер записи, ус\множенный на размер записи + смещение)
SPDR = Dzap; // данные
nmbzap++; // счетчик записей в памяти
}
}
}


/*передача данных из памяти дальше*/

if ( 1==1 ) //если есть коннект
{
if (nmbzap!=0) //есть записи в памяти?
{
for(i=0; i<nmbzap; i++) // считываем сохраненные записи из памяти
{
Zap[i] = ReadSPI(i*Zapis+Dop); // i-я строка из памяти
}
nmbzap=0;
}
}
/******************************/


вот пример моего кода, объясните, что я делаю не так.
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Sep 5 2007, 15:05
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Все smile.gif
Цитата(satnettv @ Sep 5 2007, 18:29) *
// SPI interrupt service routine
interrupt [SPI_STC] void spi_isr(void)
{
unsigned char data;
data=SPDR;
}

Зачем вам прерывание, если вы его не используете?

Цитата
/* Чтение записи*/
char ReadSPI(int address)

{

if ((address) <= TOP_ADDR)
{
if (SPSR & temp) // проверка занятости интерфейса SPI
{
SPCR = 0x00; //запрет прерывания по SPI
SPDR = READ; //передать оп-код READ
return SPDR;
}
}
}


По-моему, должно быть примерно так:
Код
/* Чтение записи*/
char ReadSPI(int address)

{
  
  if ((address) <= TOP_ADDR)
  {
    SPDR = READ;             //передать оп-код  READ
    while (!ReadySPI());
    SPDR = address; // это если адрес однобайтовый. Иначе см даташит
    while (!ReadySPI());
    return SPDR;
  }
  return 0;
}


Эта процедура считывает 1 байт. Разумнее считывать сразу несколько байт в буфер. Примерно так:
Код
/* Чтение записи*/
void ReadSPIToBuf(int address, char *buf, int length)
{
  if ((address) <= TOP_ADDR)
  {
    SPDR = READ;             //передать оп-код  READ
    while (!ReadySPI());
    SPDR = address; // это если адрес однобайтовый. Иначе см даташит
    while (!ReadySPI());
    while (length--)
    {
       *buf++ = SPDR;
       while (!ReadySPI());
    }
  }
}

Запись переделайте в том-же духе. Надо посмотреть аташит, сколько длится запись. Возможно придется считывать статусный регистр памяти и анализировать...
Насчет структур - примерно так:
Код
typedef struct
{
  char str[10];
}TStruct;
TStruct a;

ReadSPIToBuf(0, (char*)&a, sizeof(TStruct));
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- satnettv   Память (внешняя память)   Sep 4 2007, 11:26
- - satnettv   Делаю для себя, микроконтроллер mega128, внешняя п...   Sep 5 2007, 14:36
|- - satnettv   Цитата(satnettv @ Sep 5 2007, 18:36) Дела...   Sep 6 2007, 11:46
- - satnettv   Цитата(satnettv @ Sep 4 2007, 15:26) Помо...   Sep 6 2007, 11:45
- - satnettv   даташит на память - http://www.compel.ru/images/ca...   Sep 6 2007, 12:21
|- - thorium   Цитата(satnettv @ Sep 6 2007, 15:21) дата...   Sep 6 2007, 12:33
- - Kuzmi4   Ну и зачем плодить кучу тем??   Sep 6 2007, 12:32
- - zltigo   Moderator: Все темы объеденены в разделе "В п...   Sep 6 2007, 12:44
- - Непомнящий Евгений   Уважаемый satnettv! Насколько я понимаю, вы по...   Sep 7 2007, 06:31
- - Devin 001   Помоему такую тему уже видел.   Sep 11 2007, 16:29


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 23:17
Рейтинг@Mail.ru


Страница сгенерированна за 0.02108 секунд с 7
ELECTRONIX ©2004-2016