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

Добрый день уважаемые специалисты :)

 

Кто нибудь пробывал подключать к AVR DataFlash

Необходимо сделать примерно то что описано в avr335 толька с управлением по I2C

 

Перекомпилил все под Мегу 8 (поменял ножки)

Собрал схему на макетнице

DataFlash AT45DB081B питаю 3.3 вольтами Атмегу 8 - Пятью

 

В датащите на AT45DB081B сказано что с 5 вольтовыми сигналами нет проблемм

 

Тем немение DataFlash ничего не отвечает

несмотря на то что осцилографом видно как Атмега посылает данные.

Сигнала BUSY тоже нету. На выходе ДатаФлеща - 0.

 

Может спалил

Незнаю

 

Подскажите пожалуста если кто имеет какието мысли по этому поводу

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


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

Работал с DataFlash + ATmega64, пользуясь аппаратным SPI. Питание контроллера - 5В, флэшки - 3,3В. Никаких проблем не возникло.

Проверьте:

1. Сконфигурированы ли у Вас соответствующие порты контроллера (MISO на вход, MOSI, ~SS и SCK на выход)

2. Включен ли SPI

3. Правильно ли выставлен режим SPI (должен быть 0 или 3)

4. Перед началом каждой команды, посылаемой в DataFlash, необходимо деактивировать и вновь активировать ChipEnable. Текущая команда выполняется флэшкой именно до деактивации chipenable, а не просто до получения новой команды (я на этом поначалу обжегся).

 

Кстати, сигнал BUSY, как и соответствующий флаг в регистре статуса, выставляется только на время выполнения нескольких команд (запись буфера в память, чтение памяти в буфер, сравнение памяти и буфера) и не означает, что флэшку вообще нельзя беспокоить. Скажем, получать у нее статус можно в любое время. Читать и писать буфер - тоже. Об этом довольно подробно написано в даташите на флэшку и в аппликейшне AN-4 Using Atmel's DataFlash.

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


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

Работал с DataFlash + ATmega64, пользуясь аппаратным SPI. Питание контроллера - 5В, флэшки - 3,3В. Никаких проблем не возникло.

Проверьте:

1. Сконфигурированы ли у Вас соответствующие порты контроллера (MISO на вход, MOSI, ~SS и SCK на выход)

2. Включен ли SPI

3. Правильно ли выставлен режим SPI (должен быть 0 или 3)

4. Перед началом каждой команды, посылаемой в DataFlash, необходимо деактивировать и вновь активировать ChipEnable. Текущая команда выполняется флэшкой именно до деактивации chipenable, а не просто до получения новой команды (я на этом поначалу обжегся).

 

Кстати, сигнал BUSY, как и соответствующий флаг в регистре статуса, выставляется только на время выполнения нескольких команд (запись буфера в память, чтение памяти в буфер, сравнение памяти и буфера) и не означает, что флэшку вообще нельзя беспокоить. Скажем, получать у нее статус можно в любое время. Читать и писать буфер - тоже. Об этом довольно подробно написано в даташите на флэшку и в аппликейшне AN-4 Using Atmel's DataFlash.

 

 

1. Порты сконфигурированы как нада.

2. СПиАй включен

Обмен по нему видел осцилграфом

Но память ничего не отвечала

3. Насчет режима - содрал с АВР335 точно не проверял - надеюсь ошибка не там - проверю.

4. Насчет ChipEnable такого не видел осцилографом и в коде похоже нету.

Надеюсь что проблемма в этом

 

Завтра приду на работу - все проверю.

 

Вопрос: на какой интервал времени достаточно запретить а потом разрешить Флешку ??

 

 

Ещораз спасибо

 

 

 

Хотел сделать акцент

Использовал ли кто либо при работе

AVR335: Digital Sound Recorder with AVR and DataFlash

или все сами писали процедуры обмена с ДатаФлешкой ???

Я слышал что а Апноутах часто бывают ошибки

Хотя скорее вего ошибаюсь я

 

Спасибо

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


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

и в коде похоже нету

 

Ну как же... Я сам там видел :). Я тоже ковырял этот аппноут и именно там заметил деактивацию чипселекта.

 

Например:

void write_to_flash(unsigned char flash_data)
{
    static unsigned int buffer_counter;
    static unsigned int page_counter;
    unsigned char temp = 0x80;
    
    if((ACSR & 0x02))                       // if flag is set that new data has to be written
    {
        buffer_counter = 0;
        page_counter = 0;                   // reset the counter if new data has to be written
        ACSR &= 0xFD;                       // clear the signal flag
    }

    while(!(PINB & 0x02));                  // check if flash is busy

    PORTB &= ~DF_CHIP_SELECT;               // enable DataFlash
     
    SPDR = BUFFER_1_WRITE;
    while (!(SPSR & temp));                 // wait for data transfer to be completed
    SPDR = 0x00;                            // don't cares
    while (!(SPSR & temp));                 // wait for data transfer to be completed
    SPDR = (char)(buffer_counter>>8);       // don't cares plus first two bits of buffer address
    while (!(SPSR & temp));                 // wait for data transfer to be completed        
    SPDR = (char)buffer_counter;            // buffer address (max. 2^8 = 256 pages)
    while (!(SPSR & temp));                 // wait for data transfer to be completed    
    SPDR = flash_data;                      // write data into SPI Data Register
    while (!(SPSR & temp));                 // wait for data transfer to be completed
    
    PORTB |= DF_CHIP_SELECT;                // disable DataFlash 
    
    buffer_counter++; 
        
    if (buffer_counter > 528)               // if buffer full write buffer into memory page
    {
        buffer_counter = 0;
        if (page_counter < 4096)            // if memory is not full   
        { 
            PORTB &= ~DF_CHIP_SELECT;       // enable DataFlash
        
            SPDR = B1_TO_MM_PAGE_PROG_WITHOUT_ERASE; // write data from buffer1 to page 
            while (!(SPSR & temp));         // wait for data transfer to be completed
            SPDR = (char)(page_counter>>6);
            while (!(SPSR & temp));         // wait for data transfer to be completed
            SPDR = (char)(page_counter<<2);
            while (!(SPSR & temp));         // wait for data transfer to be completed
            SPDR = 0x00;                    // don't cares
            while (!(SPSR & temp));         // wait for data transfer to be completed                      
        
            PORTB |= DF_CHIP_SELECT;        // disable DataFlash
        
            page_counter++;
        }
        else
        {
            PORTB |= 0x08;                  // turn LED off
            while (!(PIND & 2));            // wait until button for recording (button 1) is released
        }
    }
}

 

Вопрос: на какой интервал времени достаточно запретить а потом разрешить Флешку ??

Учитывая, что флэшка работает на частоте до 20 МГц, никаких пауз между деактивацией и активацией делать не надо. Лишь бы компилятор не "оптимизировал" код, который в результате оставляет содержимое регистра в прежнем виде :)).

 

На всякий случай прилагаю код, который у меня на атмеге64 работает прекрасно. Просьба ногами не бить, изяществом код не блещет :)))).

at45spi.rar

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


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

BTW, господа никто не сталкивался с интересным эффектом -

когда пишешь или читаешь большой массив

на границе страниц возникают сбои?

Лечилось задержкой между подачей команд.

В фирменной доке по этому поводу молчание.

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


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

Я не читал больше 30 КБ за раз и при этих объемах никаких сбоев не замечал.

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


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

Добрый день

 

Огромное спасибо всем

 

У меня заработало !!!!

 

Дело было именно в ноге CS Незная оставил микросхему постоянно выбраной.

 

Хотел задать ещо пару попроссов

 

1. Дело в том что Атмега питаеться от 5 В а датафлеш от 3.3

Небудит ли проблемм с уровнем в канале данных от датафлешки к Атмеги Нужен ли там приобразователь уровня ?? Если да - какой посоветуете.

 

2. Счас Датафлешка питаеться от LM317

Гдето видел схему подачи питания через 3-4 кремниевых диода.

Насколько это приемлимо ???

 

Ещораз спасибо за участие !

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


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

1. Проблем не будет, ничего не нужно.

2. А зачем через диоды? Чем не устраивает стабилизатор?

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


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

1. Проблем не будет, ничего не нужно.

2. А зачем через диоды? Чем не устраивает стабилизатор?

 

Да здоровый очень

А Маленькую версию в Одессе заказывать нада и ждать долго =(

Да и по деньгам нада быть оптимальным ....

 

Хотя думаю обойдусь стабилизатором в ТО220 =)

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


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

Дело было именно в ноге CS Незная оставил микросхему постоянно выбраной.

 

А почему так нельзя??? Как надо, подскажите плиз :mellow:

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


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

 

Дело было именно в ноге CS Незная оставил микросхему постоянно выбраной.

 

А почему так нельзя??? Как надо, подскажите плиз :mellow:

 

Потому что переход CS 0->1 есть признак окончания комманды и старт ее выполнения. А переход 1->0 соответственно начало комманды.

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


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

Да здоровый очень

Ну, если дешево и сердито, то можно использовать схему типового линейного стабилизатора - стабилитрон+резистор+транзистор, но все же лучше использовать интегральный стабилизатор.

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


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

1. Дело в том что Атмега питаеться от 5 В а датафлеш от 3.3

Небудит ли проблемм с уровнем в канале данных от датафлешки к Атмеги Нужен ли там приобразователь уровня ?? Если да - какой посоветуете.

Преобразователь уровня желателен именно в случае применения AVR, т. к. у последнего CMOS уровни, в отличие от многих 51-х, у которых TTL уровни.

2. Счас Датафлешка питаеться от LM317

Гдето видел схему подачи питания через 3-4 кремниевых диода.

Насколько это приемлимо ???

Приемлемо, применял.

 

Присоединённые файлы разные по содержимому, а не просто перевод!

3V_DataFlash_to_5V_rus.pdf

3V_DataFlash_to_5V.PDF

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


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

1. Проблем не будет, ничего не нужно.

2. А зачем через диоды? Чем не устраивает стабилизатор?

 

Да здоровый очень

А Маленькую версию в Одессе заказывать нада и ждать долго =(

Да и по деньгам нада быть оптимальным ....

 

Хотя думаю обойдусь стабилизатором в ТО220 =)

 

маленькие 3х вольтовые стабилизаторы

TPS76333 - MSOP..

IRU1010-33 - SOT223..

78L03 - как KT3102 ;>

в крайнем случае питайте DataFlash от стабилитрона, SMD стабилитроны тянут 20-30MA должно хватить для флешки.

а можно и дешевым опером запитать, LM358/LM158 - включить по схеме Voltage Follower итого 2 резюка и опер ~70коп ;>

когда была напряженка со стабилизаторами ARM от опера питал, у LM358 как раз два опера в одном корпусе - 2х уровневое напряжения выдавал... :)

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


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

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

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

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

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

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

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

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

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

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