Перейти к содержанию
    

чтение/запись AT45DB через MSP430(SPI)

#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;

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приведите полный листинг программы, а то непонятно как (правильно ли?) вы инициализировали USART и разрешили ли прерывания от приемника USART?

P.S. только исходник приложите к своему сообщению как файл. Не стоит такой большой кусок кода копи-пастить его в тело сообщения и тем паче без оформления его тегами code.

P.P.S. если как-то поможет, от вот примеры функций из мой библиотеки для работы с DataFlash AT45. Вроде библиотека рабочая, но с особым пристрастием я ее не тестировал. :)

MSP430_AT45.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приведите полный листинг программы, а то непонятно как (правильно ли?) вы инициализировали USART и разрешили ли прерывания от приемника USART?

P.S. только исходник приложите к своему сообщению как файл. Не стоит такой большой кусок кода копи-пастить его в тело сообщения и тем паче без оформления его тегами code.

P.P.S. если как-то поможет, от вот примеры функций из мой библиотеки для работы с DataFlash AT45. Вроде библиотека рабочая, но с особым пристрастием я ее не тестировал. :)

 

 

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

записаны данные или нет?

 

DataFlash.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

записаны данные или нет?

Проверка записи - чтение и верификация после записи, разве не так?

Я очень бегло и "по диагонали" глянул. С ходу пока такие замечания.

1. если вы не работаете по прерыванию от передатчика, то зачем его разрешаете? Переход по вектору USART0TX_VECTOR вызывает сброс флага UTXIFG0, а вы его еще и в процедуре опрашиваете.

2. у вас нет процедуры проверки флага BUSY в регистре статуса DataFlash. Его нужно опрашивать после записи, перед тем как читать DataFlash собрались. Без опроса BUSY можно только с буфером (ОЗУ) DataFlash работать.

3. В прерывании от приемника не контролируется переполнение буфера (т.е. значение счетчика i2).

P.S. надо бы еще на количество фиктивных байт при записи команды обратить внимание, но это уж вы сами посчитайте :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проверка записи - чтение и верификация после записи, разве не так?

Я очень бегло и "по диагонали" глянул. С ходу пока такие замечания.

1. если вы не работаете по прерыванию от передатчика, то зачем его разрешаете? Переход по вектору USART0TX_VECTOR вызывает сброс флага UTXIFG0, а вы его еще и в процедуре опрашиваете.

2. у вас нет процедуры проверки флага BUSY в регистре статуса DataFlash. Его нужно опрашивать после записи, перед тем как читать DataFlash собрались. Без опроса BUSY можно только с буфером (ОЗУ) DataFlash работать.

3. В прерывании от приемника не контролируется переполнение буфера (т.е. значение счетчика i2).

P.S. надо бы еще на количество фиктивных байт при записи команды обратить внимание, но это уж вы сами посчитайте :)

Спасибо за замечания. Я немного откорректировал программу. Внес кое-какие изменения. Поставил задержки после записи/чтения DataFlash. Убрал прерывание по передачи. Теперь DataFlash пишет и читает. По поводу Busy не понятно. У меня микросхема без вывода RDY/BUSY. Как этот флаг проверять?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если мне не изменяет память флаг занятости можно достать из регистра статуса.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По поводу Busy не понятно. У меня микросхема без вывода RDY/BUSY. Как этот флаг проверять?

Это флаг присутствует в регистре статуса DataFlash. Для анализа BUSY нужно считывать значение регистра статуса.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это флаг присутствует в регистре статуса DataFlash. Для анализа BUSY нужно считывать значение регистра статуса.

 

Разобрался с регистром статуса DataFlash. Все работает. Большое Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разобрался с регистром статуса DataFlash. Все работает. Большое Спасибо.

 

По поводу записи/чтения возникли еще вопросы. Необходимо передавать

массив, состоящий из 1024 значений, причем для каждого значения нужно

выделить 2 байта. Получается, чтобы записать этот массив, понадобится 4

страницы. Страницы могут быть двух форматов ( 528 и 512 байт). Я использую

512В формат страницы. Каждый раз

после записи, я инкрементирую номер страницы на 1. При чтениии, значения

массива распределены не по порядку. Если инкрементировать на 2, то все

становится на свои места. С чем это связано? Как DataFlash определяет, какой

формат страницы используется?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не совсем понятно следующее

При чтениии, значения

массива распределены не по порядку. Если инкрементировать на 2, то все

становится на свои места.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...