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

 
 
> 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
 
Start new topic
Ответов
O.L.
сообщение Jun 10 2005, 08:29
Сообщение #2


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

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


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

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


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

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



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


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


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

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


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

Группа: Свой
Сообщений: 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
O.L.
сообщение Jun 10 2005, 10:20
Сообщение #7


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

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


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

Группа: Свой
Сообщений: 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.   f149 UART1(SPI mode)&DataFlash - грабли   Jun 10 2005, 07:28
- - kpv   Цитата(O.L. @ Jun 10 2005, 10:28)Вторую недел...   Jun 10 2005, 08:03
|- - kpv   а как, собственно, определяется, что запись не про...   Jun 10 2005, 10:27
|- - O.L.   Всяко по прерываниям лучше, я ж не спорю. Доберусь...   Jun 10 2005, 10:59
- - rezident   У меня такая процедура инициализации SPI. Код voi...   Jun 10 2005, 09:25
- - O.L.   Грамотная инициализация, спасибо. Сейчас буду корр...   Jun 10 2005, 09:53
|- - kpv   Цитата(O.L. @ Jun 10 2005, 12:53)У меня кварц...   Jun 10 2005, 10:11
- - rezident   Я на прерывания посадил простой транспортный прото...   Jun 10 2005, 13:16
- - //Nikson   Поднимаю старую тему. Есть F149 и две SPI-DataFla...   Apr 11 2006, 18:49
- - rezident   //Nikson, два момента. 1. Вы бы не поленились еще...   Apr 11 2006, 19:52
- - //Nikson   rezident, Да, точно. Эти 2 куска управляют только ...   Apr 11 2006, 21:12
- - rezident   Цитата(//Nikson @ Apr 12 2006, 03:12) ИМХ...   Apr 11 2006, 21:43


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

 


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


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