Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: чтение/запись AT45DB через MSP430(SPI)
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
maxim_P
#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;
}
rezident
Приведите полный листинг программы, а то непонятно как (правильно ли?) вы инициализировали USART и разрешили ли прерывания от приемника USART?
P.S. только исходник приложите к своему сообщению как файл. Не стоит такой большой кусок кода копи-пастить его в тело сообщения и тем паче без оформления его тегами code.
P.P.S. если как-то поможет, от вот примеры функций из мой библиотеки для работы с DataFlash AT45. Вроде библиотека рабочая, но с особым пристрастием я ее не тестировал. smile.gif
maxim_P
Цитата(rezident @ Jun 14 2007, 17:49) *
Приведите полный листинг программы, а то непонятно как (правильно ли?) вы инициализировали USART и разрешили ли прерывания от приемника USART?
P.S. только исходник приложите к своему сообщению как файл. Не стоит такой большой кусок кода копи-пастить его в тело сообщения и тем паче без оформления его тегами code.
P.P.S. если как-то поможет, от вот примеры функций из мой библиотеки для работы с DataFlash AT45. Вроде библиотека рабочая, но с особым пристрастием я ее не тестировал. smile.gif



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

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

Проверка записи - чтение и верификация после записи, разве не так?
Я очень бегло и "по диагонали" глянул. С ходу пока такие замечания.
1. если вы не работаете по прерыванию от передатчика, то зачем его разрешаете? Переход по вектору USART0TX_VECTOR вызывает сброс флага UTXIFG0, а вы его еще и в процедуре опрашиваете.
2. у вас нет процедуры проверки флага BUSY в регистре статуса DataFlash. Его нужно опрашивать после записи, перед тем как читать DataFlash собрались. Без опроса BUSY можно только с буфером (ОЗУ) DataFlash работать.
3. В прерывании от приемника не контролируется переполнение буфера (т.е. значение счетчика i2).
P.S. надо бы еще на количество фиктивных байт при записи команды обратить внимание, но это уж вы сами посчитайте smile.gif
maxim_P
Цитата(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. Как этот флаг проверять?
uriy
Если мне не изменяет память флаг занятости можно достать из регистра статуса.
rezident
Цитата(maxim_P @ Jun 18 2007, 14:55) *
По поводу Busy не понятно. У меня микросхема без вывода RDY/BUSY. Как этот флаг проверять?

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


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


По поводу записи/чтения возникли еще вопросы. Необходимо передавать
массив, состоящий из 1024 значений, причем для каждого значения нужно
выделить 2 байта. Получается, чтобы записать этот массив, понадобится 4
страницы. Страницы могут быть двух форматов ( 528 и 512 байт). Я использую
512В формат страницы. Каждый раз
после записи, я инкрементирую номер страницы на 1. При чтениии, значения
массива распределены не по порядку. Если инкрементировать на 2, то все
становится на свои места. С чем это связано? Как DataFlash определяет, какой
формат страницы используется?
rezident
Не совсем понятно следующее
Цитата(maxim_P @ Jun 19 2007, 18:35) *
При чтениии, значения
массива распределены не по порядку. Если инкрементировать на 2, то все
становится на свои места.

Если для чтения вы используете команду Continuous Array Read, то в этом режиме нет разбиения на страницы. Вся память DataFlash представлена как "гладкая" память. И естественно 16-разрядные слова представлены как пара байтов расположенные последовательно. Впрочем это зависит от того в каком порядке вы их записываете. Вы смотрели мои исходники, которые я приложил в сообщении #2? У меня там вроде бы есть функция записи с автоматическим выравниванием на размер страницы. Т.е. этой функцией можно записать до 64кБ в DataFlash разом, передав ей в качестве одного из параметров указатель на исходный буфер.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.