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

 
 
 
Reply to this topicStart new topic
> чтение/запись AT45DB через MSP430(SPI), не могу прочитать флешку
maxim_P
сообщение Jun 14 2007, 14:01
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 14-06-07
Из: Минск, Беларусь
Пользователь №: 28 436



#pragma vector=USART0RX_VECTOR
__interrupt void SPI0_rx (void)
{
_NOP();
akn[i2] = RXBUF0;
i2++;
}

#pragma vector=USART0TX_VECTOR
__interrupt void SPI0_tx (void)
{
_NOP();
}
void readAT45DX()
{
P3OUT &= ~ 0x01;
while ((U0TCTL&TXEPT)!= TXEPT);
TXBUF0 = 0x03; // îòïðàâèòü êîììàíäó
while ((U0TCTL&TXEPT)!= TXEPT);
TXBUF0 = 0x00; // îòïðàâèòü àäðåñ
while ((U0TCTL&TXEPT)!= TXEPT);
TXBUF0 = 0x02;
while ((U0TCTL&TXEPT)!= TXEPT);
TXBUF0 = 0x01;
while ((U0TCTL&TXEPT)!= TXEPT);
for (i1 = 0; i1 != 10; i1++)
{
while ((U0TCTL&TXEPT)!= TXEPT);
TXBUF0 = 0x00;
}
P3OUT |= 0x01;
}

void write_buf_1_AT45DX()
{
P3OUT &= ~ 0x01;
while ((U0TCTL&TXEPT)!= TXEPT);
TXBUF0 = 0x84; // îòïðàâèòü êîììàíäó
while ((U0TCTL&TXEPT)!= TXEPT);
TXBUF0 = 0x00; // îòïðàâèòü àäðåñ
while ((U0TCTL&TXEPT)!= TXEPT);
TXBUF0 = 0x00;
while ((U0TCTL&TXEPT)!= TXEPT);
TXBUF0 = 0x01;
while ((U0TCTL&TXEPT)!= TXEPT);
for (i1 = 0; i1 != 10; i1++)
{
U0TXBUF = P[i1];
while ((U0TCTL&TXEPT)!= TXEPT);
_NOP();
_NOP();
}
P3OUT |= 0x01;
}

void write_mem_AT45DX()
{
P3OUT &= ~ 0x01;
while ((U0TCTL&TXEPT)!= TXEPT);
TXBUF0 = 0x83; // îòïðàâèòü êîììàíäó
while ((U0TCTL&TXEPT)!= TXEPT);
TXBUF0 = 0x00; // îòïðàâèòü àäðåñ
while ((U0TCTL&TXEPT)!= TXEPT);
TXBUF0 = 0x02;
while ((U0TCTL&TXEPT)!= TXEPT);
TXBUF0 = 0x00;
while ((U0TCTL&TXEPT)!= TXEPT);
P3OUT |= 0x01;
}
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 14 2007, 14:49
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Приведите полный листинг программы, а то непонятно как (правильно ли?) вы инициализировали USART и разрешили ли прерывания от приемника USART?
P.S. только исходник приложите к своему сообщению как файл. Не стоит такой большой кусок кода копи-пастить его в тело сообщения и тем паче без оформления его тегами code.
P.P.S. если как-то поможет, от вот примеры функций из мой библиотеки для работы с DataFlash AT45. Вроде библиотека рабочая, но с особым пристрастием я ее не тестировал. smile.gif
Прикрепленные файлы
Прикрепленный файл  MSP430_AT45.zip ( 21.32 килобайт ) Кол-во скачиваний: 180
 
Go to the top of the page
 
+Quote Post
maxim_P
сообщение Jun 15 2007, 06:19
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 14-06-07
Из: Минск, Беларусь
Пользователь №: 28 436



Цитата(rezident @ Jun 14 2007, 17:49) *
Приведите полный листинг программы, а то непонятно как (правильно ли?) вы инициализировали USART и разрешили ли прерывания от приемника USART?
P.S. только исходник приложите к своему сообщению как файл. Не стоит такой большой кусок кода копи-пастить его в тело сообщения и тем паче без оформления его тегами code.
P.P.S. если как-то поможет, от вот примеры функций из мой библиотеки для работы с DataFlash AT45. Вроде библиотека рабочая, но с особым пристрастием я ее не тестировал. smile.gif



вот осходник. Идентификационный код читается без проблем. Можно ли как-нибудь проверить
записаны данные или нет?

Прикрепленный файл  DataFlash.zip ( 1.54 килобайт ) Кол-во скачиваний: 322
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 15 2007, 11:08
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(maxim_P @ Jun 15 2007, 12:19) *
вот осходник. Идентификационный код читается без проблем. Можно ли как-нибудь проверить
записаны данные или нет?

Проверка записи - чтение и верификация после записи, разве не так?
Я очень бегло и "по диагонали" глянул. С ходу пока такие замечания.
1. если вы не работаете по прерыванию от передатчика, то зачем его разрешаете? Переход по вектору USART0TX_VECTOR вызывает сброс флага UTXIFG0, а вы его еще и в процедуре опрашиваете.
2. у вас нет процедуры проверки флага BUSY в регистре статуса DataFlash. Его нужно опрашивать после записи, перед тем как читать DataFlash собрались. Без опроса BUSY можно только с буфером (ОЗУ) DataFlash работать.
3. В прерывании от приемника не контролируется переполнение буфера (т.е. значение счетчика i2).
P.S. надо бы еще на количество фиктивных байт при записи команды обратить внимание, но это уж вы сами посчитайте smile.gif
Go to the top of the page
 
+Quote Post
maxim_P
сообщение Jun 18 2007, 08:55
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 14-06-07
Из: Минск, Беларусь
Пользователь №: 28 436



Цитата(rezident @ Jun 15 2007, 14:08) *
Проверка записи - чтение и верификация после записи, разве не так?
Я очень бегло и "по диагонали" глянул. С ходу пока такие замечания.
1. если вы не работаете по прерыванию от передатчика, то зачем его разрешаете? Переход по вектору USART0TX_VECTOR вызывает сброс флага UTXIFG0, а вы его еще и в процедуре опрашиваете.
2. у вас нет процедуры проверки флага BUSY в регистре статуса DataFlash. Его нужно опрашивать после записи, перед тем как читать DataFlash собрались. Без опроса BUSY можно только с буфером (ОЗУ) DataFlash работать.
3. В прерывании от приемника не контролируется переполнение буфера (т.е. значение счетчика i2).
P.S. надо бы еще на количество фиктивных байт при записи команды обратить внимание, но это уж вы сами посчитайте smile.gif

Спасибо за замечания. Я немного откорректировал программу. Внес кое-какие изменения. Поставил задержки после записи/чтения DataFlash. Убрал прерывание по передачи. Теперь DataFlash пишет и читает. По поводу Busy не понятно. У меня микросхема без вывода RDY/BUSY. Как этот флаг проверять?
Go to the top of the page
 
+Quote Post
uriy
сообщение Jun 18 2007, 09:21
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



Если мне не изменяет память флаг занятости можно достать из регистра статуса.
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 18 2007, 10:45
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(maxim_P @ Jun 18 2007, 14:55) *
По поводу Busy не понятно. У меня микросхема без вывода RDY/BUSY. Как этот флаг проверять?

Это флаг присутствует в регистре статуса DataFlash. Для анализа BUSY нужно считывать значение регистра статуса.
Go to the top of the page
 
+Quote Post
maxim_P
сообщение Jun 19 2007, 07:32
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 14-06-07
Из: Минск, Беларусь
Пользователь №: 28 436



Цитата(rezident @ Jun 18 2007, 13:45) *
Это флаг присутствует в регистре статуса DataFlash. Для анализа BUSY нужно считывать значение регистра статуса.


Разобрался с регистром статуса DataFlash. Все работает. Большое Спасибо.
Go to the top of the page
 
+Quote Post
maxim_P
сообщение Jun 19 2007, 12:35
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 14-06-07
Из: Минск, Беларусь
Пользователь №: 28 436



Цитата(maxim_P @ Jun 19 2007, 10:32) *
Разобрался с регистром статуса DataFlash. Все работает. Большое Спасибо.


По поводу записи/чтения возникли еще вопросы. Необходимо передавать
массив, состоящий из 1024 значений, причем для каждого значения нужно
выделить 2 байта. Получается, чтобы записать этот массив, понадобится 4
страницы. Страницы могут быть двух форматов ( 528 и 512 байт). Я использую
512В формат страницы. Каждый раз
после записи, я инкрементирую номер страницы на 1. При чтениии, значения
массива распределены не по порядку. Если инкрементировать на 2, то все
становится на свои места. С чем это связано? Как DataFlash определяет, какой
формат страницы используется?
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 19 2007, 12:50
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Не совсем понятно следующее
Цитата(maxim_P @ Jun 19 2007, 18:35) *
При чтениии, значения
массива распределены не по порядку. Если инкрементировать на 2, то все
становится на свои места.

Если для чтения вы используете команду Continuous Array Read, то в этом режиме нет разбиения на страницы. Вся память DataFlash представлена как "гладкая" память. И естественно 16-разрядные слова представлены как пара байтов расположенные последовательно. Впрочем это зависит от того в каком порядке вы их записываете. Вы смотрели мои исходники, которые я приложил в сообщении #2? У меня там вроде бы есть функция записи с автоматическим выравниванием на размер страницы. Т.е. этой функцией можно записать до 64кБ в DataFlash разом, передав ей в качестве одного из параметров указатель на исходный буфер.
Go to the top of the page
 
+Quote Post

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

 


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


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