|
f149 UART1(SPI mode)&DataFlash - грабли |
|
|
|
Jun 10 2005, 07:28
|
Частый гость
 
Группа: Свой
Сообщений: 96
Регистрация: 10-06-05
Из: Новосибирск
Пользователь №: 5 890

|
Пытаюсь отработать процедуры для AT45DB161. UART0 - SerialPort, UART1 SPI 3-wire. Чтение и запись обоих буферов DataFlash проходит, есть грабельки, но не смертельные. Прямое чтение страницы MM из DataFlash как и запись MM через оба буфера - вообще без проблем. Операции стирания страниц, запись содержимого любого из буферов в любую страницу MM, загрузка любой страницы MM в любой буфер - не проходят вообще. Перебор уровней оптимизации IAR-овского компайлера не влияет, процедуры то простенькие, существенной разницы в ассемблерных листингах нет. Передрал несколько вариантов инициализации порта, вот так выглядит самый устойчивый. Код // - initialisation spi1 UART module ----------- void spi1_init (void) { U1CTL |= CHAR + SYNC + MM + SWRST; // 8-bit, SPI, Master U1TCTL |= CKPL + SSEL1 + STC; // Polarity, SMCLK, 3-wire U1BR0 = 0x02; // SPICLK = SMCLK/2 ~ 4MHz U1BR1 = 0x00; U1MCTL = 0x00; ME2 |= USPIE1; // Module enable U1CTL &= ~SWRST; // Restart USART SPI, SPI enable // IE2 |= URXIE1 + UTXIE1; // RX and TX interrupt enable } Опыта работы с DataFlash не так много. Собственно сами процедуры работы перенес с HiTech для pic18-го и DF AT45D011 Вторую неделю бъюсь и здравых мыслей уже нет. Остались только дурацкий колпак и бубен ...
|
|
|
|
|
Jun 10 2005, 08:03
|

Частый гость
 
Группа: Свой
Сообщений: 138
Регистрация: 1-06-04
Из: Nighny Novgorod
Пользователь №: 27

|
Цитата(O.L. @ Jun 10 2005, 10:28) Вторую неделю бъюсь и здравых мыслей уже нет. Остались только дурацкий колпак и бубен ... телепаты тоже в отпуске - что за "не смертельные грабельки и процедуры простенькие"?
--------------------
|
|
|
|
|
Jun 10 2005, 08:29
|
Частый гость
 
Группа: Свой
Сообщений: 96
Регистрация: 10-06-05
Из: Новосибирск
Пользователь №: 5 890

|
"Несмертельные" грабли, Это при записи страницы в нулевой байт всегда пишется 0. А простенькие процедуры они завсегда тривиальные, типа такого: Код // - erasing DataFlash ------------------------- void erasing (unsigned int page_cnt) { RLedOn; // Led red anabled _DINT(); while(!(P5IN & DF_RDY_BUSY)); // waite P5OUT &= ~DF_CHIP_SEL; // enabled DataFlash TXBUF1 = PAGE_ERASE; while ((IFG2&UTXIFG1)!=UTXIFG1); // USART1 TX buffer ready? TXBUF1 = (char)(page_cnt>>8); while ((IFG2&UTXIFG1)!=UTXIFG1); // USART1 TX buffer ready? TXBUF1 = (char)page_cnt; while ((IFG2&UTXIFG1)!=UTXIFG1); // USART1 TX buffer ready? TXBUF1 = 0x00; while ((IFG2&UTXIFG1)!=UTXIFG1); // USART1 TX buffer ready? P5OUT |= DF_CHIP_SEL; // disabled DataFlash _EINT();
} и ассемблер у ней соответствующий: Код \ __code void erasing(unsigned int) \ erasing: \ 000000 B012.... CALL #??Subroutine3_0 \ ??erasing_0: \ 000004 D2B33000 BIT.B #0x1, &0x30 \ 000008 FD2B JNC ??erasing_0 \ 00000A F2C020003100 BIC.B #0x20, &0x31 \ 000010 F24081007F00 MOV.B #0x81, &0x7f \ ??erasing_1: \ 000016 F2B020000300 BIT.B #0x20, &0x3 \ 00001C FC2B JNC ??erasing_1 \ 00001E B012.... CALL #??Subroutine6_0 \ ??erasing_2: \ 000022 F2B020000300 BIT.B #0x20, &0x3 \ 000028 FC2B JNC ??erasing_2 \ 00002A C24C7F00 MOV.B R12, &0x7f \ ??erasing_3: \ 00002E F2B020000300 BIT.B #0x20, &0x3 \ 000034 FC2B JNC ??erasing_3 \ 000036 .... JMP ??Subroutine0_0
// 6_0 \ ??Subroutine6_0: \ 000000 0F4C MOV.W R12, R15 \ 000002 8F10 SWPB R15 \ 000004 C24F7F00 MOV.B R15, &0x7f \ 000008 3041 RET // 3_0 \ ??Subroutine3_0: \ 000000 E2C22100 BIC.B #0x4, &0x21 \ 000004 32C2 DINT \ 000006 0343 NOP \ 000008 3041 RET // 0_0 \ ??Subroutine0_0: \ 00001C C2437F00 MOV.B #0x0, &0x7f \ ??write_page_flash_4: \ 000020 F2B020000300 BIT.B #0x20, &0x3 \ 000026 FC2B JNC ??write_page_flash_4 // 8_0 \ ??Subroutine8_0: \ 000000 F2D020003100 BIS.B #0x20, &0x31 \ 000006 32D2 EINT \ 000008 3041 RET Все как надо, только не работает ...
|
|
|
|
|
Jun 10 2005, 10:00
|
Частый гость
 
Группа: Свой
Сообщений: 96
Регистрация: 10-06-05
Из: Новосибирск
Пользователь №: 5 890

|
Цитата(kpv @ Jun 10 2005, 16:05) при таком варианте, по опросу, попробуй использовать TXEPT UxTXBUF and TX shift register are empty Слабоват я пока в знании матчасти, а в том, что вы написали, определенно есть смысл. Переписал все, erasing теперь работает, но в буфер ни в первый, ни во второй данные записываться перестали ... В общем дело двинулось, и это уже неплохо.
|
|
|
|
|
Jun 10 2005, 10:06
|

Частый гость
 
Группа: Свой
Сообщений: 138
Регистрация: 1-06-04
Из: Nighny Novgorod
Пользователь №: 27

|
Цитата(O.L. @ Jun 10 2005, 13:00) Слабоват я пока в знании матчасти на русском почитайте - лучше, может быть, усвоится www.gaw.ru у меня на сайте старенький перевод лежит. Цитата(O.L. @ Jun 10 2005, 13:00) но в буфер ни в первый, ни во второй данные записываться перестали код в студию, ассемблерный не надоть...
--------------------
|
|
|
|
|
Jun 10 2005, 10:11
|

Частый гость
 
Группа: Свой
Сообщений: 138
Регистрация: 1-06-04
Из: Nighny Novgorod
Пользователь №: 27

|
Цитата(O.L. @ Jun 10 2005, 12:53) У меня кварц 7 372 800, но при U1BR1 = 0x00, а U1BR0 = 0x03, U1BR0 = 0x04 и т.д. регистр статуса микросхемы просто не читается. всё сходится - spi работает на большой скорости и пока, по опросу, бит освобождения UxTXBUF проверяется, есть большая вероятность, что за это время и передача закончится, в случае низких скоростей, получается так, что не успевает на 100%
--------------------
|
|
|
|
|
Jun 10 2005, 10:20
|
Частый гость
 
Группа: Свой
Сообщений: 96
Регистрация: 10-06-05
Из: Новосибирск
Пользователь №: 5 890

|
Цитата(kpv @ Jun 10 2005, 17:06) Цитата(O.L. @ Jun 10 2005, 13:00) Слабоват я пока в знании матчасти на русском почитайте - лучше, может быть, усвоится www.gaw.ru у меня на сайте старенький перевод лежит. Цитата(O.L. @ Jun 10 2005, 13:00) но в буфер ни в первый, ни во второй данные записываться перестали код в студию, ассемблерный не надоть... да совственно все без затей по Serial получаем порцию данных 512+служебка засовываем все это в буфер DataFlash Код // - write max page size 528byte to buffer DataFlash - void write_to_buffer (unsigned char * sprt, unsigned char a_buff) { unsigned int buffer_cnt = 0; RLedOn; // Led red anabled _DINT(); while(!(P5IN & DF_RDY_BUSY)); // waite blok cleared P5OUT &= ~DF_CHIP_SEL; // enabled DataFlash if (a_buff == BUFFER_1) // if active Buffer1 TXBUF1 = BUFFER_1_WRITE; else TXBUF1 = BUFFER_2_WRITE; while ((IFG2&UTXIFG1)!=UTXIFG1); TXBUF1 = 0x00; // don't care 8 bits while ((IFG2&UTXIFG1)!=UTXIFG1); // USART1 TX buffer empty? TXBUF1 = (char)(buffer_cnt>>8); // first two byte buffer addr while ((IFG2&UTXIFG1)!=UTXIFG1); // USART1 TX buffer empty? TXBUF1 = (char)buffer_cnt; // buffer addr(max. 2^8 = 256 pages) while ((U1TCTL&TXEPT)!= TXEPT); // USART1 TX buffer is empty? while(++buffer_cnt < (MAX_LEN+1)) { TXBUF1 = *sprt++; while ((U1TCTL&TXEPT)!= TXEPT); // USART1 TX buffer is empty? } P5OUT |= DF_CHIP_SEL; // disabled DataFlash _EINT(); }
|
|
|
|
|
Jun 10 2005, 10:30
|

Частый гость
 
Группа: Свой
Сообщений: 138
Регистрация: 1-06-04
Из: Nighny Novgorod
Пользователь №: 27

|
все, как было, можно было и оставить, только перед самым концом, когда #cs поднимаешь, добавить это Код while ((U1TCTL&TXEPT)!= TXEPT); а лучше, конечно, работать через прерывание
--------------------
|
|
|
|
|
Jun 10 2005, 10:59
|
Частый гость
 
Группа: Свой
Сообщений: 96
Регистрация: 10-06-05
Из: Новосибирск
Пользователь №: 5 890

|
Всяко по прерываниям лучше, я ж не спорю. Доберусь и до них, с буферами только разберусь  . Но похоже, где то в программе я сам с переключениями буферов лажанулся. Запись в память через буфер работает, мне его очисти потом не удается. Смысл DataFlas-ки в проекте такой. Нулевая страница для бэкапа, на экстренный случай. Последняя - примитивная файловая таблица. А все остальное пространство под хранение нескольких файлов. Какие то записываются один раз, какие то динамические. Вобщем флаги, пнризнаки, семафорчики ... сейчас чайку попью и алгоритм из разрухи начну восстанавливать. Часиков шесть у меня еще есть  Спасибо за помощь.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|