Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ds1305+AVR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Денис555
Народ help.gif
Есть у кого листинг программы для работы с DS1305 (RTC)?
Замучался уже, перепробовал все и с програмной и с электронной стороны, не работает и все, точнее не передает байты, в приемном буфере SPI одни единицы, если подключен подтягивающий резистор и одни нули если не подключен. Может я с SPI не правильно работаю?
AVR - ATmega1281, кварц на 14,7456 МГц. Пишу прогу на ассемблере. help.gif кто может.
GDI
Кварц то генерит часовой? Может слишком быстро SPI у вас работает?
mdmitry
SPI работает в одном из 4 режимов. Проверьте правильность конфигурирования SPI, его скорость, протокол обмена, slave select.
ReAl
Ой, с DS1305 работал давно и мало.
Возможно, дурацкий вопрос - а полярность CS правильно сделана?
Насколько я помню, он там активный высокий (т.е. при обесточенном процессоре часы автоматически запрещены по CS).
Денис555
Кварц точно часовой, покупал два разных. Скорость SPI пробовал тоже разную, от самой высокой до самой низкой, и во всех 4-х режимах работы SPI. Для CS активный уровень - "1", как ни странно.
На осциллографе вижу как с МК идут импульсы в сторону DS1305, а вот обратно не хотят. Пробовал менять микросхему, все без результатно. Про то что с этой микрухой были проблемы не только у меня наслышан из форумов, хотя есть и те кому удавалось запустить эту штуку. Делаю все по тех. документации, а она молчит. Буду наверное искать замену...
adc
Цитата(Денис555 @ Nov 19 2007, 06:38) *
Кварц точно часовой, покупал два разных. Скорость SPI пробовал тоже разную, от самой высокой до самой низкой, и во всех 4-х режимах работы SPI. Для CS активный уровень - "1", как ни странно.
На осциллографе вижу как с МК идут импульсы в сторону DS1305, а вот обратно не хотят. Пробовал менять микросхему, все без результатно. Про то что с этой микрухой были проблемы не только у меня наслышан из форумов, хотя есть и те кому удавалось запустить эту штуку. Делаю все по тех. документации, а она молчит. Буду наверное искать замену...

Вот могу порекомендовать замену DS1338, или DS1307, правда они с i2c.
И еще, недавно как раз был озадачен подключением ds1307 и основная заморока была с батарейкой. Т.е. без подключенной батарейки, МС уходила в спячку и отрубала интерфейс передачи. Решил вопрос притянув батарейный вход к земле. (вот тема обсуждения http://electronix.ru/forum/index.php?showt...37842&st=0)
Денис555
Спасибо, буду пробовать другие микрухи.
Сергей Борщ
Цитата(Денис555 @ Nov 19 2007, 11:34) *
Спасибо, буду пробовать другие микрухи.
Вы бы лучше код показали. А если 1307 не заработает из-за того, что вы что-то делаете неправильно - будете снова искать другую микросхему?
011119xx
я использовал DS1305 так (смотри схему).
исходники такие:

//----------------------------------------------------------------------------------------------
// Запись значений в RAM RTC
//----------------------------------------------------------------------------------------------
CS_RTC = 1; //Выбор RTC

SPDR = adr_control_RTC_wr; //Адрес регистра управления RTC
while (!(SPSR & SPIF_)); //Ожидание завершения передачи
SPDR = control_RTC; //Значение регистра управления RTC
while (!(SPSR & SPIF_)); //Ожидание завершения передачи

CS_RTC = 0; //Снятие выбора RTC
//----------------------------------------------------------------------------------------------
temp = 1; //Небольшая временная задержка
do
{
temp--;
}
while (temp != 0);
//----------------------------------------------------------------------------------------------
CS_RTC = 1; //Выбор RTC

SPDR = adr_control_RTC_wr; //Адрес регистра управления RTC
while (!(SPSR & SPIF_)); //Ожидание завершения передачи
SPDR = control_RTC; //Значение регистра управления RTC
while (!(SPSR & SPIF_)); //Ожидание завершения передачи

CS_RTC = 0; //Снятие выбора RTC
//----------------------------------------------------------------------------------------------
temp = 1; //Небольшая временная задержка
do
{
temp--;
}
while (temp != 0);
//----------------------------------------------------------------------------------------------
CS_RTC =1; //Выбор RTC

SPDR = adr_wr; //Адрес регистра записи во Flash
while (!(SPSR & SPIF_)); //Ожидание завершения передачи
SPDR = data>>8; //Данные регистра записи - ст. б.
while (!(SPSR & SPIF_)); //Ожидание завершения передачи
SPDR = data; //Данные регистра записи - мл. б.
while (!(SPSR & SPIF_)); //Ожидание завершения передачи

CS_RTC = 0; //Снятие выбора RTC

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

для SPI (AT89S8252): CPOL = 0, CPHA = 1, Fosc = 16МГц/128, MSB первый
Денис555
Народ, спасибо большое. Я уже переделал схему на 3-Wire, все заработало. Наверное я что-то с SPI интерфейсом ни так делал. Правда за сутки на минуту отстают, но это не проблема. smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.