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

 
 
> 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
 
Start new topic
Ответов
Stalker27
сообщение Jul 10 2012, 04:55
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 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
GDI
сообщение Jul 10 2012, 07:48
Сообщение #3


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

Группа: Свой
Сообщений: 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   ATMega16 + AT45DB16   Jun 13 2012, 09:19
- - mempfis_   Цитата(Stalker27 @ Jun 13 2012, 12:19) На...   Jun 13 2012, 09:42
- - Maik-vs   Пара замечаний по схеме. Конденсаторы около кварц...   Jun 14 2012, 04:33
- - Stalker27   Цитата(mempfis_ @ Jun 13 2012, 13:42) Кус...   Jun 14 2012, 07:09
|- - mempfis_   Цитата(Stalker27 @ Jun 14 2012, 10:09) Сп...   Jun 14 2012, 07:45
|- - Maik-vs   Цитата(Stalker27 @ Jun 14 2012, 11:09) По...   Jun 14 2012, 11:47
- - Stalker27   Цитата(Maik-vs @ Jun 14 2012, 15:47)...   Jun 17 2012, 08:18
- - GDI   Можно поставить на входе делитель (в простейшем сл...   Jun 19 2012, 08:51
- - Stalker27   GDI, спасибо за ответ. Цитата(GDI @ Jun 19 2...   Jun 19 2012, 15:26
|- - Сергей Борщ   QUOTE (Stalker27 @ Jun 19 2012, 18:26) Ес...   Jun 20 2012, 06:23
|- - GDI   Цитата(Stalker27 @ Jun 19 2012, 19:26) По...   Jun 20 2012, 12:52
|- - mempfis_   Откопал старый 100% рабочий проектик в котором исп...   Jul 10 2012, 07:41
- - Stalker27   Цитата(mempfis_ @ Jul 10 2012, 11:41) Отк...   Jul 10 2012, 09:45
- - GDI   Вот теперь уже у Вас есть две 100%-но работающих б...   Jul 10 2012, 10:50
|- - Stalker27   Цитата(GDI @ Jul 10 2012, 14:50) Вы учите...   Jul 10 2012, 11:14
- - GDI   Умение читать и понимать документацию поможет и в ...   Jul 10 2012, 11:42
- - Stalker27   Цитата(GDI @ Jun 20 2012, 16:52) Вот наше...   Jul 12 2012, 04:47
- - GDI   Естественно, это инверсное включение. Можно на вых...   Jul 12 2012, 07:40
- - Stalker27   Цитата(GDI @ Jul 12 2012, 11:40) А что Вы...   Jul 12 2012, 09:20
- - GDI   У Вас столько вопросов, их все надо задавать руков...   Jul 12 2012, 11:16
- - Dikoy   Вот тут есть рабочая библиотека http://www.dikoy44...   Jul 19 2012, 00:34
- - Stalker27   Здравствуйте, закончил с адаптацией библиотеки AT4...   Jul 27 2012, 17:35
- - Dikoy   фильтр http://analogiu.ru/6/6-5-2-1.html Детально...   Jul 29 2012, 05:30
- - GDI   Analog Devices высылает сэмплы своих микросхем, по...   Jul 30 2012, 08:10
- - Stalker27   Спасибо за ответы. Цитата(Dikoy @ Jul 29 201...   Jul 30 2012, 17:12
- - GDI   Цитата(Stalker27 @ Jul 30 2012, 21:12) А ...   Jul 31 2012, 07:10
- - Dikoy   Цитата(Stalker27 @ Jul 30 2012, 20:12) Я ...   Aug 2 2012, 17:00


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

 


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


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