Регистрация | Последние сообщения | Персональный список | Поиск | Настройка конференции | Личные данные | Правила конференции | Список участников | Top 64 | Статистика раздела | faq | Что нового v.2.3 | Чат
Skunk Forum - Техника, Наука, Общество » Форум разработчиков РЭА »
Atmega128 и передача данных по SPI

Версия для печати (настроить)

Новая тема | Написать ответ

Подписаться

Автор Тема:   Atmega128 и передача данных по SPI
Shkurkin
Junior Member

Сообщений: 1
Откуда: Барнаул
Регистрация: Январь 2006

написано 12 Января 2006 15:43ИнфоПравкаОтветитьIP

Помогите с SPI!!!
SPI инициализируется.
Проблема при передачи. После записи данных в SPSR (SPI Status Register), флаг завершения передачи данных (SPSR_SPIF) не устанавливается в 1. Atmega повисает на проверке окончания передачи.
Строка:
(while(!SPSR_SPIF);

Может кто работал с SPI, положите плиз исходники.

Shkurkin
Junior Member

Сообщений: 2
Откуда: Барнаул
Регистрация: Январь 2006

написано 15 Января 2006 21:21ИнфоПравкаОтветитьIP

while (1)
{
SPDR = *data;
while (!(SPSR & (1 << SPIF))); // Ждем конца ПЕРЕДАЧИ
//LED0_blink();
byte = SPDR; // Сохранить принятые данные
}

Весельчак У
Moderator

Сообщений: 7157
Откуда: Санктъ-Питербурхъ
Регистрация: Декабрь 2000

написано 16 Января 2006 02:23ИнфоПравкаОтветитьIP

unsigned char SendSPI(unsigned char Data)
{
SPDR=Data;
while (!(SPSR&0x80));
return SPDR;
}

SPSR=0x0; //выборка по переднему фронту, SPI master.
SPCR = 0x5C; //Запрет прерывания от SPI, SPI включено, скорость 1/4 тактовой, отрицательные синхроимпульсы,

Shkurkin
Junior Member

Сообщений: 3
Откуда: Барнаул
Регистрация: Январь 2006

написано 19 Января 2006 06:36ИнфоПравкаОтветитьIP

Проблема такая:
Если щупом ЗЕМЛЯ осциллографа по искрить по общему проводу на плате,
то всё работает! Появляются CLOCK и MISO. Пробовал на трёх одинаковых платах. Аналогично.

Весельчак У
Moderator

Сообщений: 7166
Откуда: Санктъ-Питербурхъ
Регистрация: Декабрь 2000

написано 20 Января 2006 02:28ИнфоПравкаОтветитьIP

Тактовая частота есть? Может генератор не заводится.

Shkurkin
Junior Member

Сообщений: 4
Откуда: Барнаул
Регистрация: Январь 2006

написано 20 Января 2006 19:31ИнфоПравкаОтветитьIP

Есть 100%. Т.к. программа выполняется. На PORTE вывожу 1H,2H,4H и т.д. через каждые несколько команд. Останавливается только на команде
(while(!SPSR_SPIF);
Команда внутри цикла while (1);
После дествий описанных выше всё запускается. Программа работоет по циклу. Передача данных происходит. В качестве Slave - MAX6675. Но Atmega может дергать лапы и в пустоту, без MAX6675.
С этой проблемой вся работа встала. Пробовал вместо команды (while(!SPSR_SPIF); вставлять паузу заведомо больше времени передачи. Тоже всё работает. Но это не есть хорошо.

Весельчак У
Moderator

Сообщений: 7172
Откуда: Санктъ-Питербурхъ
Регистрация: Декабрь 2000

написано 21 Января 2006 03:31ИнфоПравкаОтветитьIP

А что это такое SPSR_SPIF? Как оно описано? Может всё же написать как приведённые примеры? Какой, кстати, компилятор?
Насколько близко конденсаторы по питанию?

У меня только что были проблемы - никак не мог выйти из прерывания по переполнению таймера. Напаял конденсаторы, поковырялся в программе, и - заработало.

Shkurkin
Junior Member

Сообщений: 5
Откуда: Барнаул
Регистрация: Январь 2006

написано 21 Января 2006 17:43ИнфоПравкаОтветитьIP

Среда програмирования IAR Embedded Workbench for Atmel AVR V3

#define SPSR_SPIF SPSR_Bit7 - примерно так определён в одном из подключаемых модулей:

#include <ina90.h>
#include <iom128.h>
#include <comp_a90.h>
#include <inavr.h>
#include <stdio.h>

Не помню в каком. Под рукой нет сейчас исходников.

Кстати слышал от знакомых негодования на IAR:"Опишешь одним способом-не работает, опишешь другим работает". Попробую описать как в примерах, без подключения модулей:

#define SPIF SPSR_Bit7
#define SPI2X SPSR_Bit0

#define SPIE SPCR_Bit7
#define SPE SPCR_Bit6
#define DORD SPCR_Bit5
#define MSTR SPCR_Bit4
#define CPOL SPCR_Bit3
#define CPHA SPCR_Bit2
#define SPR1 SPCR_Bit1
#define SPR0 SPCR_Bit0

Из старого исходника когда осваивал SPI. В таком варианте на пробовал решить эту проблему.

На счет конденсаторов не могу сказать, платы тоже нет под рукой.

Beginer
Junior Member

Сообщений: 9
Откуда: Россия
Регистрация: Январь 2006

написано 29 Января 2006 17:01ИнфоПравкаОтветитьIP

Просмотри прорамму - может кто параллельно (случайно) работает с ногами, которые задействованы на SPI, или может кто раньше чем в цикле считывает состояние флага - он и очищается до того как ты его читаешь циклом.

кольша
Junior Member

Сообщений: 1
Откуда: Россия
Регистрация: Август 2011

написано 22 Августа 2011 20:25ИнфоПравкаОтветитьIP

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

Весельчак У
Moderator

Сообщений: 11707
Откуда: Санктъ-Питербурхъ
Регистрация: Декабрь 2000

написано 23 Августа 2011 01:48ИнфоПравкаОтветитьIP

кольша
Ничего не получится. Единственное, что можно попробовать - снизить скорость передачи так, чтобы программа успевала сделать все необходимые действия не дольше, чем за такт передачи по SPI.
Хотя для чего это нужно в ЦАП? ЦАПу должно быть по-барабану разрывы в передачах - пока не снят выбор кристалла, данные не фиксируются. По крайней мере, в известных мне.
Более того, даже АЦП с тактированием от синхроимпульсов SPI спокойно переносят разрывы без снижения точности.

кольша
Junior Member

Сообщений: 2
Откуда: Россия
Регистрация: Август 2011

написано 01 Сентября 2011 21:37ИнфоПравкаОтветитьIP

я методом тыка и божьей помощью сделал так: отправляю один байт пауза _us(4)затем второй байт то ошибки при передачи данных нет, смотрел по флагу. менбще паузу если ставить то будет потеря данных.

Shkurkin
Junior Member

Сообщений: 6
Откуда: Барнаул
Регистрация: Январь 2006

написано 02 Сентября 2011 06:31ИнфоПравкаОтветитьIP

цитата:
кольша писал:
я методом тыка и божьей помощью сделал так: отправляю один байт пауза _us(4)затем второй байт то ошибки при передачи данных нет, смотрел по флагу. менбще паузу если ставить то будет потеря данных.

Выложи код инициализации SPI и его портов и кусок передачи данных. С каким ЦАП работаешь?

Ваш ответ:

Коды форума
Смайлики


Ник:    Пароль       
Отключить смайлики

Все время MSK

Склеить | Разбить | Закрыть | Переместить | Удалить

Новая тема | Написать ответ
Последние сообщения         
Перейти к:

Свяжитесь с нами | skunksworks.net

Copyright © skunksworks.net, 2000-2018

Разработка и техническая поддержка: skunksworks.net


Рейтинг@Mail.ru Яндекс.Метрика