Технический форум по робототехнике.
rat12 » 08 июн 2010, 01:25
Michael_K писал(а):когда вы ставите SPI enable,проц его конфигуряет как вход независимо от настроек порта.
Если я на ногу не включаю подтяжку (0 логический на ноге), то во входящем регисторе 0х00, если включаю (1 логическая на ноге) - то 0хFF. Оно и понятно, если память никак на уровень не влияет (в моем случае, дохлая может?), то микроконтроллер интерпретирует состояние на входе так. Так что, как показывает в моем случае практика, зависит от настроек

Michael_K писал(а):Обратите внимание: SS на МАСТЕРЕ должен быть или настроен на ВЫХОД, или подтянут к плюсу
(иначе он в режим слейва самопроизвольно перейдет)
Спасибо за совет. SS у меня выходом сделан. И еще на нем 1 поднята. Без результатов

Есть один ньюанс. Я микросхемой памяти управляю не ногой SS, а другим пином, конкретно PB5 -так по разводке удобнее было. Соответственно в программе я её "дергаю" для включения-выключения памяти. Может в этом причина неработоспособности? Поэтому я на всякий случай и SS дергаю, но она, как уже сказал, в воздухе висит...
Еще вопрос. Правильно ли я считываю STATUS REGISTER? Написал следующую процедуру в CVAVR:
- Код: Выделить всё • Развернуть
unsigned char status_load (void)
{
unsigned char status_register_from_spdr;
unsigned char temp = 0x80;
PORTB &= ~DF_CHIP_SELECT; // enable DataFlash (DF_CHIP_SELECT определено выше по коду)
SPDR = STATUS_REGISTER; // STATUS_REGISTER - бит команды, определен выше.
while (!(SPSR & temp));
SPDR = 0xFF; //записываем произвольный байт, как сказано в посте ниже !
while (!(SPSR & temp));
status_register_from_spdr = SPDR;
PORTB |= DF_CHIP_SELECT; // disable DataFlash and start transaction
return (status_register_from_spdr & 0x80);
}
Соответственно применяю её так:
- Код: Выделить всё • Развернуть
while(!(status_load())); // в цикле, пока память занята
SPDR = ... выполняю загрузку в SPDR новой команды
Последний раз редактировалось
rat12 08 июн 2010, 12:19, всего редактировалось 2 раз(а).
Michael_K » 08 июн 2010, 01:50
Эммм... ничего не понял.
Эта память начнет активно управлять ногой SO только после того, когда вы затолкаете ей правильную команду на ногу SI. А до этого момента она в воздухе висит, но и процу результат неважен.
Общая процедура примерно такая:
Опускаете ЦС
Посылаете команду в СПДР
Ждете когда завершится посылка
Считываете что там в ответ пришло и выкидываете нафиг (это висячая в воздухе нога она не интересна)
Посылаете что попало в СПДР (просто чтобы СЦК пощелкал, я обычно отправляю FF)
Ждете когда завершится посылка
Считываете ответ на команду (это пришел реальный ответ)
Поднимаете ногу ЦС
Ну только и команды и ответы там кажется могут быть многобайтные...
rat12 » 08 июн 2010, 13:08
Спасибо большое Michael_K и avr123 !
После Ваших замечаний и комментариев мне наконец удалось собрать работоспособный код!
Кусочек его привел в посте выше, для случая, если нет физической ноги RDY, можно применять эту конструкцию, считывать значения бита RDY из регистра статуса микросхемы памяти.
avr123.nm.ru » 08 июн 2010, 21:48
Хорошо что добили задачу.
osc » 14 июн 2010, 23:49
Приведите пожалуйста пример кода для загрузки числа в последовательный сдвиговый регистр.
Я написал такую функцию:
- Код: Выделить всё • Развернуть
void send(unsigned int data,unsigned int length)
{
int i,j;
for(i=length;i!=0;i--)
{
wait
for(j=i;j!=0;j--)
{
CLK=1;
wait
if((data & (1<<i))!=0)
{
DATA=1;
}
else
{
DATA=0;
}
wait
CLK=0;
wait
}
} }
void main(void)
{
send(0b10001110110110,14);
while(1);
}
Но кажись работает она не правильно, вторым циклом продвигаем бит по сдвиговому регистру, первым циклом берем следующий бит.
blindman » 15 июн 2010, 02:51
А для чего два цикла?
- Код: Выделить всё • Развернуть
void send(unsigned int data, unsigned int length)
{
unsigned int mask = 1 << length;
while (length--) {
CLK=1;
wait;
DATA = (data & mask) ? 1 : 0;
CLK=0;
wait;
data <<= 1;
}
}
avr123.nm.ru » 15 июн 2010, 10:00
Начинающим возможно не понятна будет строка а возможно не верно понята
- Код: Выделить всё • Развернуть
while (length--) {
Проще наверно так написать
- Код: Выделить всё • Развернуть
while (length) {
length--;
Это вообще в ступор введет
- Код: Выделить всё • Развернуть
DATA = (data & mask) ? 1 : 0;
и int для length крутовато. С запасом.
greyder » 15 июн 2010, 13:56
Добрый день.
Я хочу из одного SPI Mega8 сделать два независимых интерфейса. И не знаю какой микросхемкой это можно осуществить. Мультиплексор вроде не подходит т.к. интерфейс двунаправленный, Мультиплексор и демультиплексор как-то криво выглядит. Свич (коммутатор), еще не разобрался но тоже ничего хорошего не получается. Подскажите где можно такое решение подсмотреть?
blindman » 15 июн 2010, 14:05
Зачем?
avr123.nm.ru » 15 июн 2010, 14:35
greyder писал(а):Я хочу из одного SPI Mega8 сделать два независимых интерфейса.
Это невозможно пожалуй. Можно несколько устройств подключить параллельно но отдельными ножками МК выбирать какое устройство активно.
greyder » 15 июн 2010, 17:10
Ответ на вопрос blindman'a я пытался изобразить на 106 страницы данной ветки. Мое видение данной задачи в прикрепленной картинке.
При нормальной работе сигналом MA/SL выбрана секция Slave для работы с детьми, устройства адресуются SS1, SS2, SS3 ... . При появлении сигнала на MasterSS прерываем работу с детьми, меняем сигнал MA/SL т.е. выбираем работу с родителем и работаем дальше с ним.
Про невозможность: скорее возможно но с ограничениями.
Вопрос как это реализовать?
- Вложения
-

blindman » 15 июн 2010, 18:54
Вы не должны этого хотеть. Больше мне сказать нечего
greyder » 16 июн 2010, 15:39
Со-дер-жательный ответ. Надо понимать что AVR и топология дерево не совместимы?
boez » 16 июн 2010, 18:48
А скорости большие нужны? Я бы аппаратный SPI подключил в слейв режиме к родителю, а детей на второй (программный) SPI с общими MOSI/MISO/SCK и выбором детенка отдельными ногами SS. А мультиплексировать слейв-SPI еще с кем-то плохо, ведь родитель может начать обмен когда ему вздумается...
avr123.nm.ru » 16 июн 2010, 19:11
Это у горе-програмеров так.
А у нормальных эмбедеров, мастера живут по графику по алгоритму - так же как и вся другая бодяга.