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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> f149 UART1(SPI mode)&DataFlash - грабли
O.L.
сообщение Jun 10 2005, 07:28
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 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
Вторую неделю бъюсь и здравых мыслей уже нет. Остались только дурацкий колпак и бубен ...
Go to the top of the page
 
+Quote Post
kpv
сообщение Jun 10 2005, 08:03
Сообщение #2


Частый гость
**

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



Цитата(O.L. @ Jun 10 2005, 10:28)
Вторую неделю бъюсь и здравых мыслей уже нет. Остались только дурацкий колпак и бубен ...
*

телепаты тоже в отпуске - что за "не смертельные грабельки и процедуры простенькие"?


--------------------
Go to the top of the page
 
+Quote Post
O.L.
сообщение Jun 10 2005, 08:29
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 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


Все как надо, только не работает ...
Go to the top of the page
 
+Quote Post
kpv
сообщение Jun 10 2005, 09:03
Сообщение #4


Частый гость
**

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



первое, что бросается в глаза
UTXIFGx, indicates that data has moved from
UxTXBUF to the TX shift register and UxTXBUF is ready for new data. It does
not indicate RX/TX completion.
соответственно последний байт практически не передается до конца


--------------------
Go to the top of the page
 
+Quote Post
kpv
сообщение Jun 10 2005, 09:05
Сообщение #5


Частый гость
**

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



при таком варианте, по опросу, попробуй использовать TXEPT
UxTXBUF and TX shift register are empty


--------------------
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 10 2005, 09:25
Сообщение #6


Гуру
******

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



У меня такая процедура инициализации SPI.

Код
void _init_spi0(void)
{ IE1 &=~ (URXIE0 + UTXIE0);                      // запретить прерывания для SPI0
 _DIS_SPI0;                                      // запретить функции выводов SPI0
 _RESET_FLASH_CS;                                // сбросить активн.сост. CS DataFlash
 _RESET_RTC_CS;                               // сбросить активн.сост. CS RTC
 _RESET_CNTR_CS;                              // сбросить активн.сост. CS CNTR
 U0CTL = SWRST;                                  // уст.бит прогр. сброса модуля UART0
 U0CTL |= CHAR+SYNC+MM;                          // уст.режим UART0:8бит,SPI,ведущий,3-х провод.
 U0TCTL = CKPL+SSEL0+SSEL1+STC;             // Mode3, U0CLK=SMCLK, 3-ware
 U0BR1 = 0x00;                           // уст.старший байт предделителя BITCLK
 U0BR0 = 0x07;                                   // уст.младший байт предделителя BITCLK
 U0MCTL = 0;                                     // установка регистра модуляции
 ME1 |= USPIE0;                                  // разрешаем работу модуля SPI0
 U0CTL &=~ SWRST;                                // очистим бит программного сброса
 _EN_SPI0_3;                                     // разрешим функции pin 3-пров. SPI
 spi0.bufSize = 0;                               // установим нулевой размер буфера
 spi0.cntr = 0;                                  // сбросим счетчик байт буфера SPI0
 spi0.req = 0;                                   // сбросим регистр запросов к SPI0
 spi0.status = 0;                                // сбросим статус готовности SPI0
 spi0.num = 0;                                   // инициализация номера канала SPI0
 IE1 |= URXIE0+UTXIE0;                           // разрешить прерывания для UART0
}


Правда хочу уточнить, что у меня три устройства подключены к SPI, с равным приоритетом доступа. И с SPI я работаю по прерываниям.
Go to the top of the page
 
+Quote Post
O.L.
сообщение Jun 10 2005, 09:53
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 96
Регистрация: 10-06-05
Из: Новосибирск
Пользователь №: 5 890



Грамотная инициализация, спасибо. Сейчас буду корректоровать свою.
Я в начале то же попробовал поиграть значениями в регистрах битрейт делителя, но flash работает только при установленных значениях
U1BR0 = 0x02;
U1BR1 = 0x00;

У меня кварц 7 372 800, но при U1BR1 = 0x00, а U1BR0 = 0x03, U1BR0 = 0x04 и т.д. регистр статуса микросхемы просто не читается.

Я вобщем то же хочу работать по прерываниям, но с "налету" не получилось, вот и начал разбираться детально. Тем более, что под HiTech-ем все так и работало.
Go to the top of the page
 
+Quote Post
O.L.
сообщение Jun 10 2005, 10:00
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 96
Регистрация: 10-06-05
Из: Новосибирск
Пользователь №: 5 890



Цитата(kpv @ Jun 10 2005, 16:05)
при таком варианте, по опросу, попробуй использовать TXEPT
UxTXBUF and TX shift register are empty
*


Слабоват я пока в знании матчасти,
а в том, что вы написали, определенно есть смысл. Переписал все, erasing теперь работает, но в буфер ни в первый, ни во второй данные записываться перестали ... В общем дело двинулось, и это уже неплохо.
Go to the top of the page
 
+Quote Post
kpv
сообщение Jun 10 2005, 10:06
Сообщение #9


Частый гость
**

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



Цитата(O.L. @ Jun 10 2005, 13:00)
Слабоват я пока в знании матчасти

на русском почитайте - лучше, может быть, усвоится www.gaw.ru у меня на сайте старенький перевод лежит.

Цитата(O.L. @ Jun 10 2005, 13:00)
но в буфер ни в первый, ни во второй данные записываться перестали

код в студию, ассемблерный не надоть...


--------------------
Go to the top of the page
 
+Quote Post
kpv
сообщение Jun 10 2005, 10:11
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 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%


--------------------
Go to the top of the page
 
+Quote Post
O.L.
сообщение Jun 10 2005, 10:20
Сообщение #11


Частый гость
**

Группа: Свой
Сообщений: 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();
}
Go to the top of the page
 
+Quote Post
kpv
сообщение Jun 10 2005, 10:27
Сообщение #12


Частый гость
**

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



а как, собственно, определяется, что запись не прошла?
лишний текст убирай (мой или на то, что отвечаешь)


--------------------
Go to the top of the page
 
+Quote Post
kpv
сообщение Jun 10 2005, 10:30
Сообщение #13


Частый гость
**

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



все, как было, можно было и оставить, только перед самым концом, когда #cs поднимаешь, добавить это
Код
while ((U1TCTL&TXEPT)!= TXEPT);

а лучше, конечно, работать через прерывание smile.gif


--------------------
Go to the top of the page
 
+Quote Post
O.L.
сообщение Jun 10 2005, 10:59
Сообщение #14


Частый гость
**

Группа: Свой
Сообщений: 96
Регистрация: 10-06-05
Из: Новосибирск
Пользователь №: 5 890



Всяко по прерываниям лучше, я ж не спорю. Доберусь и до них, с буферами только разберусь smile.gif.
Но похоже, где то в программе я сам с переключениями буферов лажанулся. Запись в память через буфер работает, мне его очисти потом не удается.
Смысл DataFlas-ки в проекте такой. Нулевая страница для бэкапа, на экстренный случай. Последняя - примитивная файловая таблица. А все остальное пространство под хранение нескольких файлов. Какие то записываются один раз, какие то динамические. Вобщем флаги, пнризнаки, семафорчики ...
сейчас чайку попью и алгоритм из разрухи начну восстанавливать. Часиков шесть у меня еще есть smile.gif
Спасибо за помощь.
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 10 2005, 13:16
Сообщение #15


Гуру
******

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



Я на прерывания посадил простой транспортный протокольчик. Структура spi0 имеет регистр статуса, регистр запросов, счетчик байт, переменную размера буфера, указатель на элемент буфера и номер канала. В прерываниях UARTx тупой обмен по SPI: байт из буфера передал - байт принял, положил в буфер, инкремент счетчика/указателя. И так до окончания буфера. А сам буфер готовит и обрабатывает программа более высокого уровня.
Go to the top of the page
 
+Quote Post

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

 


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


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