память (внешняя память)

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Родился
Сообщения: 8
Зарегистрирован: Пт авг 31, 2007 17:12:34
Откуда: оттуда

Сообщение satnettv »

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

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

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

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

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

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


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

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


Заранее извините за безграммотность по данному вопросу, и заранее всем спасибо!!!
просто VIP
Контактная информация:
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 97
Зарегистрирован: Пн июл 30, 2007 08:19:02
Откуда: Екатеринбург

Сообщение Кошкелот »

Вниательно прочитал. И не понял-таки вопроса.
в принципе общее устройство памяти понятно - данные забиваются в конкретные адреса памяти.
Вот ведь - тут все уже и сказано. :)

...Ну хорошо, конкретный пример. Пусть строка начинается с адреса 1000 (совершенно условно). И содержит 10 символов, считая завершающий нуль. Тогда 1-й символ (байт) лежит по адресу 1000, 2-й - 1001, и так далее. Вот эти адреса мы и выставляем, когда хоти записать строку. И еогда хотим прочитать - их же.
Мнение автора не обязательно совпадает с его точкой зрения
Контактная информация:
Реклама
Э...
Аватара пользователя
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва

Сообщение tych »

satnettv писал(а):как устроена память
ИСЧЕРПЫВАЮЩЕ описано в КОНКРЕТНО ЕЁ даташите.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18785
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

для микросхем памяти последовательного типа (24-го и 25-го семейства, например) обычно имеется 2 принципиально разных подхода к записи: байтовый или страничный. в первом случае запись строки будет выглядеть так: выдаем команду записи байта, выдаем адрес байта, выдаем сам байт, ждем конца записи - после чего повторяем все это для каждого следующего байта. во втором случае несколько иначе, причем в чем-то проще, а в чем-то сложнее. если строка наша начинается с начала страницы и помещается целиком в нужную страницу памяти, то ее запись будет выглядеть так: выдаем команду записи в память страницы, выдаем адрес первого байта, выдаем поочереди все байты строки, выдаем команду записи страницы в память, ждем конца записи. Очевидно, что этот способ более быстродействующий - ожидание конца записи делается только один раз на целую страницу, кроме того не надо для каждого байта выдавать его адрес (он формируется автоматически). Однако проблемы могут возникнуть, если строка не с начала страницы или не умещается целиком в страницу - тут мороки больше...
Да, я описал общий принцип, однако в каждой конкретной микросхеме могут быть свои нюансы, например, не всегда адрес внутри страницы увеличивается автоматически...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Аватара пользователя
Сообщения: 97
Зарегистрирован: Пн июл 30, 2007 08:19:02
Откуда: Екатеринбург

Сообщение Кошкелот »

Признаюсь, что сначала не понял: акцент вопроса именно на формате и порядке выдачи команд-данных в SPI. Да?
Ну, тут верно сказали: все в даташите разрисовано. А Сишная реализация, конечно, будет зависеть от того, используется ли в контроллере аппаратный модуль SPI (и тогда см. описание его регистров), или же производится "ручное" дергание ножками.
Мнение автора не обязательно совпадает с его точкой зрения
Контактная информация:
Реклама
Э...
Аватара пользователя
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва

Сообщение tych »

Пример работы с память AT45 в задаче 7 под кнопкой "www".
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Контактная информация:
Реклама
Родился
Сообщения: 8
Зарегистрирован: Пт авг 31, 2007 17:12:34
Откуда: оттуда

Сообщение satnettv »

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

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

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

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

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

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


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

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


Заранее извините за безграммотность по данному вопросу, и заранее всем спасибо!!!
даташит на память - http://www.compel.ru/images/catalog/552 ... m_r2.2.pdf
постараюсь объяснить задачу:
имеется контроллер мега 128 и память вышеуказанная, соединены по SPI, программирую на CodeVision.
требуется написать процедуры чтения и записи, для того чтобы выполнялось следующее:
контроллер формирует строку - некую последовательность символов (допустим 80 символов), затем если выполнятеся условие, к примеру 1, он отсылает эту строку дальше и так далее. если же условие 1 не выолняется, то контроллер должен записать эту строку во внешнюю память. далее проверяется условие 1 по приходу следующей строки, если опять не выполняется условие 1, то записываем еще одну строку в память и так далее (при этом нужен какой-то счетчик, чтобы знать сколько записано строк в память). При выполнении условия 1, контроллер должен проверить наличие сохраннех строк в памяти, если есть то отослать их дальше, при этом следует обнулить счетчик записей в память.

ну вот, примерно я объяснил, что требуется, может что-то не понятно?
просто VIP
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 413
Зарегистрирован: Пт мар 10, 2006 12:23:05
Откуда: Moscow

Сообщение Mozart »

всё понятно... а в чём собственно вопрос?
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
Контактная информация:
Родился
Сообщения: 8
Зарегистрирован: Пт авг 31, 2007 17:12:34
Откуда: оттуда

Сообщение satnettv »

Mozart писал(а):всё понятно... а в чём собственно вопрос?

вопрос как правильно написать процедуры чтения и записи во внешнюю память. с памятью никогда не работал, с SPI интерфейсом тоже. В программировании особо тоже не силен. Но хотелось бы посмотреть пример реализации данной задачи, чтобы самому разобраться как и зачем, вот.
просто VIP
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 413
Зарегистрирован: Пт мар 10, 2006 12:23:05
Откуда: Moscow

Сообщение Mozart »

значит пишется всё очень просто... открываете даташит на МК открывается страничка SPI... внимательно читаем... и что вам не понятно...

знчит передача данных начинается когда вы кладёте данные в SPDR ... и проверяете флаг который говорит о готовности принять следующий байт или флаг который говорит что идёт передача что-от подобное... с этим все...
открываете даташит на память и тоже внимательно читаем как должен быть настроен СПИ... там как мне помнится есть 4режима... смотрим на них на даташит и настраиваем...
потом читаем какие комманды и как воспринимает память...

p.s. прочитайте лишним не будет... а когда напишите и ничего не получится тогда давайте вашу задачку... решим вместе
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
Контактная информация:
Родился
Сообщения: 8
Зарегистрирован: Пт авг 31, 2007 17:12:34
Откуда: оттуда

Сообщение satnettv »

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

#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 ( ust1==gotov ) //' это так для примера
{
if (nmbzap!=0) //есть записи в памяти?
{
for(i=0; i<nmbzap; i++) // считываем сохраненные записи из памяти
{
Zap = ReadSPI(i*Zapis+Dop); // i-я строка из памяти
}
nmbzap=0;
}
}
/******************************/


вот пример моего кода, объясните, что я делаю не так.
я никак не могу понять как правильно выставлять адрес для заполнения памяти, а также как правильно организовать счетчик записи нескольких строк в память (т.е. я на каком-то этапе делаю несколько записей (строки по 80 символов) в память, считаю сколько строк я записал, а затем по какой-то команде мне нужно считать эти строки из памяти). Ну вот как мне это сделать?????
просто VIP
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 413
Зарегистрирован: Пт мар 10, 2006 12:23:05
Откуда: Moscow

Сообщение Mozart »

во-первых,

Код: Выделить всё

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++; // счетчик записей в памяти 
		} 
	} 
} 
это не очень правильно... почему? когда вы записываете в SPDR данные то перед тем как туда что-то записать вы должны проверить пуст ли ваш буффер... здесь этого не происходит...
между

Код: Выделить всё

SPDR = WREN; // оп-код подготовки записи 
SPDR = WRITE; // оп-код записи 
между этим нужно проверять готовность SPI к принятию следующего байта...
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 413
Зарегистрирован: Пт мар 10, 2006 12:23:05
Откуда: Moscow

Сообщение Mozart »

во-вторых,

Код: Выделить всё

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

if ( ust1==gotov ) //' это так для примера 
{ 
	if (nmbzap!=0) //есть записи в памяти? 
	{ 
		for(i=0; i<nmbzap; i++) // считываем сохраненные записи из памяти 
		{ 
			Zap[i] = ReadSPI(i*Zapis+Dop); // i-я строка из памяти 
		} 
		nmbzap=0; 
	} 
}
это что такое? функция?? тогда почему она начинается с if??
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 413
Зарегистрирован: Пт мар 10, 2006 12:23:05
Откуда: Moscow

Сообщение Mozart »

слушайте... что-то у вас код вообще какой-то левый...
вот это что ??

Код: Выделить всё

...
#define SPIF 0x80 //Флаг прерывания по SPI 
...
unsigned char temp = 0x80; 
....
if (SPSR & temp) // проверка занятости интерфейса SPI 
зачем создавать переменную temp??? если вы объявили SPIF... хотя если вы посмотрите в заголовочный файл mega128.h то этот флаг SPIF там уже объявлен и не надо его второй раз переобъявлять...
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
Контактная информация:
Родился
Сообщения: 8
Зарегистрирован: Пт авг 31, 2007 17:12:34
Откуда: оттуда

Сообщение satnettv »

Mozart писал(а):во-вторых,

Код: Выделить всё

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

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

в дальнейшем это будет функция, а if  это пока так для примера
	} 
}
это что такое? функция?? тогда почему она начинается с if??
просто VIP
Контактная информация:
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»