maxim_P 0 14 июня, 2007 Опубликовано 14 июня, 2007 · Жалоба #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 0 14 июня, 2007 Опубликовано 14 июня, 2007 · Жалоба Приведите полный листинг программы, а то непонятно как (правильно ли?) вы инициализировали USART и разрешили ли прерывания от приемника USART? P.S. только исходник приложите к своему сообщению как файл. Не стоит такой большой кусок кода копи-пастить его в тело сообщения и тем паче без оформления его тегами code. P.P.S. если как-то поможет, от вот примеры функций из мой библиотеки для работы с DataFlash AT45. Вроде библиотека рабочая, но с особым пристрастием я ее не тестировал. :) MSP430_AT45.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
maxim_P 0 15 июня, 2007 Опубликовано 15 июня, 2007 · Жалоба Приведите полный листинг программы, а то непонятно как (правильно ли?) вы инициализировали USART и разрешили ли прерывания от приемника USART? P.S. только исходник приложите к своему сообщению как файл. Не стоит такой большой кусок кода копи-пастить его в тело сообщения и тем паче без оформления его тегами code. P.P.S. если как-то поможет, от вот примеры функций из мой библиотеки для работы с DataFlash AT45. Вроде библиотека рабочая, но с особым пристрастием я ее не тестировал. :) вот осходник. Идентификационный код читается без проблем. Можно ли как-нибудь проверить записаны данные или нет? DataFlash.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 15 июня, 2007 Опубликовано 15 июня, 2007 · Жалоба вот осходник. Идентификационный код читается без проблем. Можно ли как-нибудь проверить записаны данные или нет? Проверка записи - чтение и верификация после записи, разве не так? Я очень бегло и "по диагонали" глянул. С ходу пока такие замечания. 1. если вы не работаете по прерыванию от передатчика, то зачем его разрешаете? Переход по вектору USART0TX_VECTOR вызывает сброс флага UTXIFG0, а вы его еще и в процедуре опрашиваете. 2. у вас нет процедуры проверки флага BUSY в регистре статуса DataFlash. Его нужно опрашивать после записи, перед тем как читать DataFlash собрались. Без опроса BUSY можно только с буфером (ОЗУ) DataFlash работать. 3. В прерывании от приемника не контролируется переполнение буфера (т.е. значение счетчика i2). P.S. надо бы еще на количество фиктивных байт при записи команды обратить внимание, но это уж вы сами посчитайте :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
maxim_P 0 18 июня, 2007 Опубликовано 18 июня, 2007 · Жалоба Проверка записи - чтение и верификация после записи, разве не так? Я очень бегло и "по диагонали" глянул. С ходу пока такие замечания. 1. если вы не работаете по прерыванию от передатчика, то зачем его разрешаете? Переход по вектору USART0TX_VECTOR вызывает сброс флага UTXIFG0, а вы его еще и в процедуре опрашиваете. 2. у вас нет процедуры проверки флага BUSY в регистре статуса DataFlash. Его нужно опрашивать после записи, перед тем как читать DataFlash собрались. Без опроса BUSY можно только с буфером (ОЗУ) DataFlash работать. 3. В прерывании от приемника не контролируется переполнение буфера (т.е. значение счетчика i2). P.S. надо бы еще на количество фиктивных байт при записи команды обратить внимание, но это уж вы сами посчитайте :) Спасибо за замечания. Я немного откорректировал программу. Внес кое-какие изменения. Поставил задержки после записи/чтения DataFlash. Убрал прерывание по передачи. Теперь DataFlash пишет и читает. По поводу Busy не понятно. У меня микросхема без вывода RDY/BUSY. Как этот флаг проверять? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uriy 5 18 июня, 2007 Опубликовано 18 июня, 2007 · Жалоба Если мне не изменяет память флаг занятости можно достать из регистра статуса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 18 июня, 2007 Опубликовано 18 июня, 2007 · Жалоба По поводу Busy не понятно. У меня микросхема без вывода RDY/BUSY. Как этот флаг проверять? Это флаг присутствует в регистре статуса DataFlash. Для анализа BUSY нужно считывать значение регистра статуса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
maxim_P 0 19 июня, 2007 Опубликовано 19 июня, 2007 · Жалоба Это флаг присутствует в регистре статуса DataFlash. Для анализа BUSY нужно считывать значение регистра статуса. Разобрался с регистром статуса DataFlash. Все работает. Большое Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
maxim_P 0 19 июня, 2007 Опубликовано 19 июня, 2007 · Жалоба Разобрался с регистром статуса DataFlash. Все работает. Большое Спасибо. По поводу записи/чтения возникли еще вопросы. Необходимо передавать массив, состоящий из 1024 значений, причем для каждого значения нужно выделить 2 байта. Получается, чтобы записать этот массив, понадобится 4 страницы. Страницы могут быть двух форматов ( 528 и 512 байт). Я использую 512В формат страницы. Каждый раз после записи, я инкрементирую номер страницы на 1. При чтениии, значения массива распределены не по порядку. Если инкрементировать на 2, то все становится на свои места. С чем это связано? Как DataFlash определяет, какой формат страницы используется? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 19 июня, 2007 Опубликовано 19 июня, 2007 · Жалоба Не совсем понятно следующее При чтениии, значения массива распределены не по порядку. Если инкрементировать на 2, то все становится на свои места. Если для чтения вы используете команду Continuous Array Read, то в этом режиме нет разбиения на страницы. Вся память DataFlash представлена как "гладкая" память. И естественно 16-разрядные слова представлены как пара байтов расположенные последовательно. Впрочем это зависит от того в каком порядке вы их записываете. Вы смотрели мои исходники, которые я приложил в сообщении #2? У меня там вроде бы есть функция записи с автоматическим выравниванием на размер страницы. Т.е. этой функцией можно записать до 64кБ в DataFlash разом, передав ей в качестве одного из параметров указатель на исходный буфер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться