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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> ATMega16 + AT45DB16
Stalker27
сообщение Jun 13 2012, 09:19
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 30-11-07
Пользователь №: 32 830



Здравствуйте, мне нужна помощь в разработке дипломного проекта. По заданию необходимо разработать и собрать лабораторный стенд. Устройство должно записать аналоговый сигнал, пришедший с генератора Г2-57, затем провести некоторые математические действия над записью и выдать результат с выхода на осциллограф.

Устройство в железе практически готово. В схеме использован микроконтроллер ATMega16 и память AT45DB16 2Mb (без ноги Busy).



Имеется разработанная схема, эмуляция проекта в Proteus и не доделанная прошивка с подробными комментариями. Среда разработки CodeWizardAVR.
В основе проекта лежит статья http://www.gaw.ru/html.cgi/txt/app/Atmel/m...at45_to_avr.htm
и учитываются найденные ошибки в коде http://www.123avr.com/z7.htm

На данный момент необходимо переписать код, учитывая отсутствие ноги Busy у памяти. Уверен, кто-то уже делал подобное и есть готовая отлаженная библиотека на AT45DB16. Сам же пока нашел только это http://balancer.ru/g/p1203759 , не знаю на сколько это правильно. На первом этапе достаточно, чтоб устройство просто записывало сигнал и выдавало его же на выход. При этом необходимо минимально доработать аналоговый вход и выход в схеме устройства.

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



Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Jun 13 2012, 09:42
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(Stalker27 @ Jun 13 2012, 12:19) *
На данный момент необходимо переписать код, учитывая отсутствие ноги Busy у памяти. Уверен, кто-то уже делал подобное и есть готовая отлаженная библиотека на AT45DB16.


Кусок из рабочего проекта - ожидание готовности памяти после каждой операции. Вставьте вместо опроса статуса ноги BUSY

CODE
#define STATUS_REGISTER_READ = 0xD7, /**< status register */

//коды ошибок
enum {
DF_NO_ERROR=0,
DF_WAIT_FAIL,
DF_NOT_MATCH,
DF_UNKNOWN_DEVICE
};

/***************************************************************/
//ожидание готовности памяти
unsigned char at45xx_wait(void)
{
unsigned int i = 25000;
unsigned char read_data;

at45xx_init_op(); //активация микросхемы памяти
SPIWriteChar(STATUS_REGISTER_READ); //инициализация опкода

while(i>0)
{
delay_5us(100/5);
read_data = SPIReadChar(); //чтение регистра статуса
if( (read_data & 0x80 ) != 0 ) break;
i--;
}

at45xx_end_op(); //деактивация микросхемы памяти

if (i != 0) return DF_NO_ERROR; //обработка ошибок
else return DF_WAIT_FAIL;
}
/***************************************************************/


Сообщение отредактировал IgorKossak - Jun 13 2012, 12:44
Причина редактирования: [codebox] для длинного кода!!!
Go to the top of the page
 
+Quote Post
Maik-vs
сообщение Jun 14 2012, 04:33
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 246
Регистрация: 4-12-06
Пользователь №: 23 101



Пара замечаний по схеме.
Конденсаторы около кварца указаны 0.022мкф, а надо 22 пф. Очевидно, просто описка, на такой частоте с 0.022 генератор контроллера просто не начнёт работать.
В блоке питания стоит стабилитрон КС509, очевидно, для защиты от перенапряжения по входу. Тогда нужно добавить предохранитель последовательно с VD1, чтобы он сгорал раньше, чем стабилитрон.
Go to the top of the page
 
+Quote Post
Stalker27
сообщение Jun 14 2012, 07:09
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 30-11-07
Пользователь №: 32 830



Цитата(mempfis_ @ Jun 13 2012, 13:42) *
Кусок из рабочего проекта - ожидание готовности памяти после каждой операции. Вставьте вместо опроса статуса ноги BUSY

Спасибо. Насколько я понял, задержка идет по 20 мкс? И все же, нет ли этого в виде библиотеки? Готов даже приобрести за разумную цену. Самому отлаживать проблемно, на данный момент нет ни генератора шума, ни осциллографа, чтоб проверить работу устройства.

Цитата(Maik-vs @ Jun 14 2012, 08:33) *
Конденсаторы около кварца указаны 0.022мкф, а надо 22 пф. Очевидно, просто описка, на такой частоте с 0.022 генератор контроллера просто не начнёт работать.

Да, действительно описка, на деле стоит 22пф

Цитата(Maik-vs @ Jun 14 2012, 08:33) *
В блоке питания стоит стабилитрон КС509, очевидно, для защиты от перенапряжения по входу. Тогда нужно добавить предохранитель последовательно с VD1, чтобы он сгорал раньше, чем стабилитрон.

Спасибо, учту в чистовике схемы, при монтаже я правда VD1 вообще не впаивал ))

Подскажите, как лучше реализовать аналоговый вход и выход (на схеме обвел красным), нужно ли ставить какую-либо защиту? Правильно ли я подключил буферную микросхему?
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Jun 14 2012, 07:45
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(Stalker27 @ Jun 14 2012, 10:09) *
Спасибо. Насколько я понял, задержка идет по 20 мкс? И все же, нет ли этого в виде библиотеки?


Библиотеки нет. Это вообще кусок кода из проекта на ARM.
Если у Вас есть проект, то думаю Вы найдёте там процедуру выбора микросхемы памяти (nCS уводится в 0) - вставте её вместо at45xx_init_op(); Вместо at45xx_end_op(); вставьте процедуру отпускания микросхемы (nCS возвращается в 1). SPIWriteChar()/SPIReadChar(); - думаю тут понятно. Между чтениями регистра статуса стоит некоторая задержка в 20 uS - в CVAVR есть библиотека delay.h в которой можно найти процедуры задержки.
Go to the top of the page
 
+Quote Post
Maik-vs
сообщение Jun 14 2012, 11:47
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 246
Регистрация: 4-12-06
Пользователь №: 23 101



Цитата(Stalker27 @ Jun 14 2012, 11:09) *
Подскажите, как лучше реализовать аналоговый вход и выход (на схеме обвел красным), нужно ли ставить какую-либо защиту? Правильно ли я подключил буферную микросхему?

Это всё зависит от параметров сигнала и чего бояться. Все входы контроллера подключены через 2 диода к питаню и земле. Ток через эти диоды не должен превышать 1 ма. У вас этот ток ограничивается R3. Если иметь в виду сетевую наводку от прикосновения к XW1, то ничего не сгорит, но входное напряжение АЦП может превысить опорное и результат оцифровки будет непредвиденным. Можно поставить стабилитрон параллельно С4, но его нелинейность будет влиять.
ШИМ должен усредняться фильтром R4C5? Тогда нужно добавить резистор параллельно С5, через который С5 будет разряжаться. Его роль может играть сопротивление нагрузки на XW2, но тогда это сопротивление должно быть известным и приемлемым. Что будет подключено к XW2? Если стрелочный прибор, то решение приемлемое. Если что-то менее инерционное, то плохо отфильтрованная частота ШИМ может давать интересные результаты. Можно увеличивать ёмкость С5, чтобы лучше фильтровать переменку. Тогда возрастёт инерционность, напряжение на С5 будет отставать от быстрых изменений скважности ШИМ (если они есть).
Go to the top of the page
 
+Quote Post
Stalker27
сообщение Jun 17 2012, 08:18
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 30-11-07
Пользователь №: 32 830



Цитата(Maik-vs @ Jun 14 2012, 15:47) *
Это всё зависит от параметров сигнала и чего бояться.

ATmega16 содержит 10-разрядный АЦП последовательного приближения. Отличительные особенности:
• Время преобразования 65 - 260 мкс.
• Частота преобразования до 15 тыс. преобразований в секунду при максимальном разрешении
• Диапазон входного напряжения АЦП 0…VCC
• 8 мультиплексированных однополярных входов
• 7 дифференциальных входных каналов
• 2 дифференциальных входных канала с опциональным усилением на 10 и 200

Для уменьшения погрешностей АЦП рекомендуется диапазон Твыб=65…260 мкс (Fд=4…15 кГц). Согласно теореме о дискретном представлении (теорема Котельникова), частота дискретизации должна быть, по крайней мере, в два раза большей частоты сигнала. Следовательно максимальная частота сигнала может быть 7,5 кГц.

Для вывода сигнала нужен цап. Здесь я нашел 2 варианта, либо ШИМ либо R2R в виде цепочки резисторов http://www.rlocman.ru/shem/schematics.html?di=69926 . Первый вариант вроде как проще, да и в статье (второй вариант) заявленный выход частоты от 1 МГц до 8 МГц, что мне не подходит (не знаю можно ли R2R воспроизвести кГц'ы). В статье http://www.gaw.ru/html.cgi/txt/app/Atmel/m...at45_to_avr.htm написано "Частота ШИМ должна быть, по крайней мере, в два раза выше, чем частота сигнала. Рекомендуется, чтобы частота ШИМ была, по меньшей мере, в четыре раза выше (в зависимости от выходного фильтра)". Т.е. частота входного сигнала должна быть уже 15/4= 3,75кГц.

Теперь смотрю какие сигналы на выходе генератора шума Г2-57.

• Период тактовой частоты устанавливается от 1; 3,3; 10 мкс до 333 с (18 положении)
• Длина псевдослучайных последовательностей 2 в степени 4 - 2 в степени 21 периодов тактовых импульсов (19 положений)
• Амплитуда фиксированного напряжения на выходе бинарного сигнала ±(10±0,3) В (Rн = 10 Ом. Rн > кОм)
• Эффективное значение фиксированного напряжения на выходе гауссова сигнала 3,16+0,1 В (RH>600 Ом)
• Амплитуда фиксированного напряжения на выходе равновероятного сигнала ±3 В (R > 600 Ом)
• Погрешность установки частоты + 10%
• Полоса частот гауссова сигнала 0 - 1/20 тактовой частоты
• Задержка бинарного сигнала на выходе 0 - 9999 периодов тактовых импульсов
• Пределы напряжения на выходе 0,1 - 1 В (с дискретностью через 0,1 В):
бинарного сигнала: ±10; ±3,16; ±3; ±1 В (амплитуда);
гауссова сигнала: 3,16; 3; 1; В эфф.;
равновероятного сигнала: ±3, ±1 В (амплитуда)

С частотами выходных сигналов я совсем запутался. Минимальную и максимальную частоту я так и не подсчитал.

Исходя из пределов напряжения на выходе, я могу оцифровать только гауссов сигнал 3,16; 3; 1; В. Либо сделать дифференциальный вход АЦП и оцифровывать сигнал -2,5..2,5. Так же тут нужна защита входа АЦП от 10В. В итоге надо либо как то изменять схему либо менять источник ходного сигнала.
Go to the top of the page
 
+Quote Post
GDI
сообщение Jun 19 2012, 08:51
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Можно поставить на входе делитель (в простейшем случае) или ОУ и тогда сможете оцифровывать и 10В входной сигнал. Дальше нужно смотреть на необходимую точность с которой нужно оцифровать входной cигнал, т.к. максимальный размах 10В будет оцифровываться с наибольшей разрядностью, т.е. 10бит (1024 уровня квантования), но тогда 1В будет оцифрован лишь на 7 бит (102 уровня квантования), хватит ли такой точности для 1В? Если нет, то тогда придется делать какой то переключение диапазона. Для разнополяртного входного сигнала обычно применяют ОУ со смещением выходного сигнала ОУ на величину опорного напряжения АЦП ( или на половину опорного напряжения АЦП - это зависит от допустимого входного напряжения АЦП). Т.е., к примеру, входной сигнал +/-5В масштабируется ОУ и переносится в диапазон 0-5В, при этом 0В входного сигнала соответствует 2,5В выходного, и это напряжение подается на вход встроенного АЦП микроконтроллера.
По поводу библиотек, выйдите на один уровень выше, а раздел AVR и там есть прикрепленная тема, которая называется "Исходники программ и библиотек" (элементарно, не правда ли?).


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Stalker27
сообщение Jun 19 2012, 15:26
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 30-11-07
Пользователь №: 32 830



GDI, спасибо за ответ.

Цитата(GDI @ Jun 19 2012, 12:51) *
т.к. максимальный размах 10В будет оцифровываться с наибольшей разрядностью, т.е. 10бит (1024 уровня квантования)

Я использую 8 бит ацп по следующей причине:
"Суммарная системная погрешность АЦП в ATmega16 составляет две младшие единицы, т.е. гарантированно точными во всем диапазоне температур и напряжений являются 8 разрядов из 10. Таким образом целесообразнее использовать именно режим 8/10-бит."

Но в принципе этот размах в 10В и не нужен, мне не обязательно использовать все доступные режимы генератора, думаю до ±3В будет за глаза. Но при этом необходимо предусмотреть защиту от высокого напряжения.

Цитата(GDI @ Jun 19 2012, 12:51) *
Т.е., к примеру, входной сигнал +/-5В масштабируется ОУ и переносится в диапазон 0-5В, при этом 0В входного сигнала соответствует 2,5В выходного, и это напряжение подается на вход встроенного АЦП микроконтроллера.

Получится что я потеряю качество сигнала при оцифровке почти в 2 раза? В принципе от ±3В это будет меньше заметно. Можно пример такого ОУ, желательно с формулами его расчета?

Цитата(GDI @ Jun 19 2012, 12:51) *
По поводу библиотек, … (элементарно, не правда ли?).

Если бы было все так просто, в моем варианте нет ноги BUSY, в этом-то вся и проблема…
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 20 2012, 06:23
Сообщение #10


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Stalker27 @ Jun 19 2012, 18:26) *
Если бы было все так просто, в моем варианте нет ноги BUSY, в этом-то вся и проблема…
Если вы прочитаете документацию (а конкретно - абзац про регистр статуса микросхемы памяти), то поймете, что заменить анализ ноги BUSY на чтение регистра статуса и анализ в нем одноименного бита - совсем не сложно. А если внести такое мизерное изменение в готовую программу для вас сложно - то и вся описанная задача вам явно не по зубам. И документацию читать все равно придется - никакие готовые библиотеки без этого работать не будут. Или будут, но не так как вы хотите.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
GDI
сообщение Jun 20 2012, 12:52
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Цитата(Stalker27 @ Jun 19 2012, 19:26) *
Получится что я потеряю качество сигнала при оцифровке почти в 2 раза? В принципе от ±3В это будет меньше заметно. Можно пример такого ОУ, желательно с формулами его расчета?

С чего это? Вы просто промасштабируете входной сигнал. А чтобы не "терять при оцифровке", сигнал подаваемый на АЦП должен иметь размах полного диапазона АЦП, т.е. если диапазон АЦП 0-5В, то и входной сигнал должен иметь размах как можно ближе к 0-5В, тогда получите максимальный динамический диапазон.
А пример ОУ - это обычный инвертирующий усилитель, только на неинвертирующий вход нужно подать постоянное напряжение смещения, равное половине диапазона АЦП. Ну, и промасштабировать выходной сигнал как обычно, подобрав резисторы обратной связи. Вот нашел описание http://cxem.net/beginner/beginner96.php ищите раздел "В) Дифференциальное включение".
Цитата(Stalker27 @ Jun 19 2012, 19:26) *
Если бы было все так просто, в моем варианте нет ноги BUSY, в этом-то вся и проблема…
Поищите по форуму at45db161 и найдете много интересного, в том числе и библиотеки. У меня есть одна библиотека, не помню откуда ее взял, она использует регистр состояния. Но Сергей Борщ Вам правильно сказал - читайте документацию, чтобы понимать как оно работает и что Вы делаете.
Прикрепленные файлы
Прикрепленный файл  at45db161.rar ( 3.37 килобайт ) Кол-во скачиваний: 45
 


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Stalker27
сообщение Jul 10 2012, 04:55
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 30-11-07
Пользователь №: 32 830



Наконец-то появилось время, начал писать свою библиотеку для AT45. За основу взял исходник at45db161.rar от GDI, кусок кода от mempfis_ и исправленную версию кода этого человека http://balancer.ru/g/p1203759. Пока сделал процедуру очистки памяти, если с ней разберусь, то думаю в дальнейшем проблем не должно быть. Посмотрите пожалуйста все ли я так делаю?
CODE
#include <mega16.h>
#include <stdio.h>
#include <delay.h>
#include <at45_defines.h>

#define DF_CHIP_SELECT 0x10 // DataFlash chip select port pin (PB 4)


//коды ошибок
enum {
DF_NO_ERROR=0,
DF_WAIT_FAIL,
DF_NOT_MATCH,
DF_UNKNOWN_DEVICE
};


//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Активация микросхемы памяти
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
void AT45_Check_ON(void)
{
PORTB &= ~DF_CHIP_SELECT; // {SPI_PORT &= ~( (1<<nSS_AT45DBXX)|(1<<SCK)|(1<<MOSI) );}
}


//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Деактивация микросхемы памяти
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
void AT45_Check_OFF(void)
{
PORTB |= DF_CHIP_SELECT;
}


//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Записываем байт
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
void SPI_Write_Byte(unsigned char data)
{
//Start transmission
SPDR = data;
//ожидание завершения передачи
while (!(SPSR & (1<<SPIF))); // while((SPSR & (1<<SPIF)) == 0); while (!(SPSR & 0x80));
}


//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Читаем байт
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
unsigned char SPI_Read_Byte(void)
{
//Start transmission
SPDR = 0x00;
//ожидание завершения передачи
while (!(SPSR & (1<<SPIF)));
return SPDR;
}


//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Ожидание готовности памяти
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
unsigned char AT45_Ready_Wait(void)
{
unsigned int i = 25000; //кол-во циклов проверки состояния готовности
unsigned char read_data;

AT45_Check_ON(); //активация микросхемы памяти

SPI_Write_Byte(AT45_OP_STATUS_REGISTER_READ); //инициализация опкода
while(i>0)
{
delay_us(25); //1 мсек = 1000мксек
read_data = SPI_Read_Byte(); //чтение регистра статуса
if( (read_data & 0x80 ) != 0 ) break;
i--;
}

AT45_Check_OFF(); //деактивация микросхемы памяти

if (i != 0) return DF_NO_ERROR; //обработка ошибок
else return DF_WAIT_FAIL;
}


//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Стирание блока
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
void AT45_Block_Erase(int block_counter)
{
AT45_Check_ON(); //активация микросхемы памяти

SPI_Write_Byte(AT45_OP_BLOCK_ERASE);
SPI_Write_Byte((char)(block_counter>>3)); // 0x3F&(u8_t)(block>>6));
SPI_Write_Byte((char)(block_counter<<5));
SPI_Write_Byte(0x00);

AT45_Check_OFF(); //деактивация микросхемы памяти

if (AT45_Ready_Wait != 0) //по ДШ от 45 до 100 мсек
{
//если ошибка
}
}


//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Полное стирание FLASH
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
void AT45_Full_Erase(void)
{
unsigned int block_counter = 0;

while (block_counter<AT45_NUM_BLOCKS)
{
AT45_Block_Erase(block_counter);
block_counter++;
};
}


Теперь несколько глупых вопросов:
1.Возможно стоит использовать активацию и деактивацию памяти (AT45_Check_ON/OFF) только в AT45_Full_Erase перед и после while, а в AT45_Block_Erase и в AT45_Ready_Wait убрать их? Или тут принципиально?

2.Как найти оптимальную задержку delay_us в AT45_Ready_Wait? Или ее стоит убрать вообще как в at45db161.rar?

3.0x80 и 1<<SPIF одно и то же? Если да то сточку read_data & 0x80 можно так же записать read_data & (1<<SPIF) ?

4.В каком случае правильнее активируется память?
SPI_PORT &= ~(1<<DF_CHIP_SELECT);
SPI_PORT &= ~( (1<<DF_CHIP_SELECT)|(1<<SCK)|(1<<MOSI) );

5.В AT45_Block_Erase нашел отличия в исходниках в одной строчке (стоит коммент) 0x3F&(u8_t)(block>>6). Это правильно?

6.В файле at45_defines.h из архива at45db161.rar реализовано 2 варианта кодов, как воспользоваться этим SPI_MODE_0_3 ?
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Jul 10 2012, 07:41
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Откопал старый 100% рабочий проектик в котором использовалась at45 память.
Может поможет в освоении. Нужно будет переназначить пины управления памятью. Проект писался под atmega64 но если мне не изменяет память то в SPI отличий не должно быть.
Go to the top of the page
 
+Quote Post
GDI
сообщение Jul 10 2012, 07:48
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Судя по Вашим вопросам, Вы не разобрались в работе АТ45, потому что все ответы есть в даташите. И теперь, не разобравшись, Вы пытаетесь написать "свою" библиотеку путем копи-паста из нескольких чужих библиотек. С моей точки зрения, если Вам не хочется разбираться досконально, то надо просто использовать одну из готовых билиотек. А если уж Вы хотите написать что то своё, то надо пересилить себя и прочитать даташиты (на АТ45, на контроллер, а может еще и на интерфейс SPI), а некоторые его места прочитать по нескольку раз, до полного понимания.
Нежелание разобраться в вопросе - это порок, потому я буду жёсток.
Цитата(Stalker27 @ Jul 10 2012, 08:55) *
1.Возможно стоит использовать активацию и деактивацию памяти (AT45_Check_ON/OFF) только в AT45_Full_Erase перед и после while, а в AT45_Block_Erase и в AT45_Ready_Wait убрать их? Или тут принципиально?
Тут наблюдается полное непонимание принципов работы интерфейса SPI. В отсутствие активного сигнала CS, все выходы подчиненного устройства переводятся в 3е состояние, т.е. устройство полностью отключается от шины. Думаю дальше не нужно объяснять?
Цитата(Stalker27 @ Jul 10 2012, 08:55) *
2.Как найти оптимальную задержку delay_us в AT45_Ready_Wait? Или ее стоит убрать вообще как в at45db161.rar?
А зачем её искать? Попробуйте понять что будет в результате выполнения функции AT45_Ready_Wait и как тоже самое реализовано в at45db161.rar.
Цитата(Stalker27 @ Jul 10 2012, 08:55) *
3.0x80 и 1<<SPIF одно и то же? Если да то сточку read_data & 0x80 можно так же записать read_data & (1<<SPIF) ?
Проверьте, что такое SPIF и что такое read_data & 0x80. Может быть число получится и одинаковое, но легко ли будет понять что делает этот кусок кода? Здесь более уместной будет подобная запись read_data & (1<<AT45_STATUS_FLAG_BUSY), не правда ли, из такой записи и без комментариев понятно, что мы ожидаем получить?. Учитесь писать самодокументируемый код.
Цитата(Stalker27 @ Jul 10 2012, 08:55) *
4.В каком случае правильнее активируется память?
SPI_PORT &= ~(1<<DF_CHIP_SELECT);
SPI_PORT &= ~( (1<<DF_CHIP_SELECT)|(1<<SCK)|(1<<MOSI) );
Если Вы используете аппаратный SPI, то однозначно надо использовать первый вариант. Не знаю, откуда Вы второй взяли? Могу предположить что он используется в варианте программной реализации SPI.
Цитата(Stalker27 @ Jul 10 2012, 08:55) *
5.В AT45_Block_Erase нашел отличия в исходниках в одной строчке (стоит коммент) 0x3F&(u8_t)(block>>6). Это правильно?
Вот тут надо не различия искать, а прочитать в даташите, как же правильно сделать.
Цитата(Stalker27 @ Jul 10 2012, 08:55) *
6.В файле at45_defines.h из архива at45db161.rar реализовано 2 варианта кодов, как воспользоваться этим SPI_MODE_0_3 ?
Тут тоже пробел в Ваших знаниях. Интерфейс SPI может работать в 4х режимах, которые называются не затейливо, режимы 0, 1, 2 и 3. Режим устанавливается при настройке мастера SPI. АТ45 может работать только в 0 и 3 и автоматически определает который используется в данный момент. Соответствено, после настройки мастера Вы должны указать библиотеке, какой же режим Вы настроили, для этого и используется этот дефайн.

Чтобы писать хорошие программы, надо сперва читать документацию. Я надеюсь, что из Вам помогут мои советы.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Stalker27
сообщение Jul 10 2012, 09:45
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 30-11-07
Пользователь №: 32 830



Цитата(mempfis_ @ Jul 10 2012, 11:41) *
Откопал старый 100% рабочий проектик в котором использовалась at45 память.

Спасибо, это пригодится.

Цитата(GDI @ Jul 10 2012, 11:48) *
все ответы есть в даташите.

Мне достаточно тяжело его осилить учитывая мой малый опыт, к тому же эти знания мне не понадобиться в дальнейшем, не вижу смысла дотошно изучать вопрос в минимальных подробностях.

Цитата(GDI @ Jul 10 2012, 11:48) *
если Вам не хочется разбираться досконально, то надо просто использовать одну из готовых

Это мне подходит, о чем я просил и раньше. Проблема в том, что нет у меня пока ни одной библиотеки, которую не пришлось бы доработать. А чтобы поправить готовую библиотеку под себя, надо ее всю перелопатить и понять что к чему.

Цитата(GDI @ Jul 10 2012, 11:48) *
Вы пытаетесь написать "свою" библиотеку путем копи-паста

Так и есть, собственно вытекает из выше сказанного. Все равно лопатить надо, заодно и сделаю максимально под себя.

Цитата(GDI @ Jul 10 2012, 11:48) *
Попробуйте понять что будет в результате выполнения функции AT45_Ready_Wait и как тоже самое реализовано в at45db161.rar

По сути тоже самое, только в at45db161.rar просто зацикливание происходит, а в AT45_Ready_Wait еще и с некоторой задержкой. Для меня спорный вопрос что лучше и меньше ресурсов жрет.

Цитата(GDI @ Jul 10 2012, 11:48) *
Соответствено, после настройки мастера Вы должны указать библиотеке, какой же режим Вы настроили, для этого и используется этот дефайн.

С этим у меня проблема возникла.

Цитата(GDI @ Jul 10 2012, 11:48) *
Я надеюсь, что Вам помогут мои советы.

Безусловно, помогли, как и предыдущие, огромное спасибо.

Собственно из всего выше сказанного назревает вопрос, может ли кто-нибудь взяться за реализацию проекта не безвозмездно. Готов рассмотреть такой вариант за разумную цену. Думаю опытному специалисту здесь на пару вечеров работы.
Go to the top of the page
 
+Quote Post

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

 


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


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