Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.79/229: Рейтинг темы: голосов - 229, средняя оценка - 4.79
1 / 1 / 0
Регистрация: 26.10.2011
Сообщений: 811
1

Работа SPI передача более 1 байта

21.08.2012, 10:36. Показов 46073. Ответов 82
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Где посмотреть сколько тактов тратит аппаратный SPI меги на передачу одного байта при передаче двух и более байт ?

все что я смог найти так это картинки подобные этой:

<Изображение удалено>
или такой

<Изображение удалено>

а как выглядит передача цепочки байт ?

есть ли между байтами промежуток в 1-2 такта или какая то другая пауза ?
какой уровень в этот момент на MOSI (1 или 0) ?

если пауза есть, то можно ли переключить SPI на передачу без пауз ? (подряд биты байта 1, потом тут же байта 2 и так далее)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.08.2012, 10:36
Ответы с готовыми решениями:

Чтение байта в режиме SPI 9 битов
Разбираюсь с интерфейсом SPI 9 битов, возник вопрос по чтению из дисплея от Nokia. При записи в...

SPI в AVR. Потеря первого байта при передаче строки
Доброго времени суток господа. При попытке передать 16 символьную строку, от master к slave, 1...

HAL_UART_Transmit как передать более одного байта?
имеется задача засечь время выполнения функции с помощью SysTick и вывести значение в ms по USART ...

Передача одного байта по com-порту
Ком порт в компьютере соединен перемычкой RX-&gt;TX; HANDLE COMport; //дескриптор порта ...

82
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
21.08.2012, 10:38 2
пауза естественно есть - буфер-то однобайтовый, нужно дождаться выдачи предыдущего байта, потом загнать следующий байт в буфер вручную, затем опять выдать на выход

сколько тактов тратит - сопоставьте частоту тактирования МК и частоту SPI
0
1 / 1 / 0
Регистрация: 26.10.2011
Сообщений: 811
21.08.2012, 10:46 3
Цитата Сообщение от Johmmy0007
пауза естественно есть - буфер-то однобайтовый, нужно дождаться выдачи предыдущего байта, потом загнать следующий байт в буфер вручную, затем опять выдать на выход

сколько тактов тратит - сопоставьте частоту тактирования МК и частоту SPI
гм.. а я думал что SPDR всего лишь входной регистр данных, сдвиг происходит из внутреннего сдвигового регистра...

скорость работы SPI = sys_clk\2
в SPI могу засовывать байт с той скоростью с которой это нужно (посчитаю по тактам и в момент передачи последнего бита буду в SPDR засовывать следующий)

что будет в этом случае ?
0
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
21.08.2012, 10:58 4
не надо считать по тактам - есть специальный флаг готовности - проверяйте его в цикле, если spdr свободен - пишите

если здесь картинку брали - тут написано, как это сделать
http://microsontrollerov.net/microsontr ... rfejsa-SPI
0
0 / 0 / 0
Регистрация: 04.08.2012
Сообщений: 102
21.08.2012, 11:01 5
ДШ mega16 стр.138, 139

Инициализация, как Master и передача байта данных
Код
void SPI_MasterInit(void)
{
/* Set MOSI omd SCK output, all others input */
DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK);
/* Enable SPI, Master, set clock rate fck/16 */
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}

void SPI_MasterTransmit(char cData)
{
/* Start transmission */
SPDR = cData;
/* Woyt for transmission somplete */
while( !(SPSR & (1<<SPIF)) );
}
чтобы передать массив (например размером 5 байт):
Код
char data[5]; // массив данных

// передаем
for(int i = 0; i < 5; i++)
{
SPDR = data[i]; // "суём" байт
while( !(SPSR & (1<<SPIF)) ); // ждём, когда он "уйдёт"
}
--
0
1 / 1 / 0
Регистрация: 26.10.2011
Сообщений: 811
21.08.2012, 11:04 6
Цитата Сообщение от sbum
ДШ mega16 стр.138, 139

Инициализация, как Master и передача байта данных
Код:
void SPI_MasterInit(void)
{
/* Set MOSI omd SCK output, all others input */
DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK);
/* Enable SPI, Master, set clock rate fck/16 */
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}

void SPI_MasterTransmit(char cData)
{
/* Start transmission */
SPDR = cData;
/* Woyt for transmission somplete */
while( !(SPSR & (1<<SPIF)) );
}

чтобы передать массив (например размером 5 байт):
Код
char data[5]; // массив данных

// передаем
for(int i = 0; i < 5; i++)
{
SPDR = data[i]; // "суём" байт
while( !(SPSR & (1<<SPIF)) ); // ждём, когда он "уйдёт"
}
--

так точно будут перерывы между байтами !

мне нужно чтобы перерывов небыло !

для этого я могу программно подходить к записи очередного байта в SPDR в момент передачи LSB, без всяких ожиданий флага SPIF

вопрос - будут ли промежутки между передаваемыми битами-импульсами?
0
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
21.08.2012, 11:05 7
да не будет так работать! Зачем по- вашему, флаги-то ввели? Даже если заработает - информация будет выдаваться искажённой

если очень надо - можете софтверный SPI сделать, но высокой частоты вы не добьётесь
0
1 / 1 / 0
Регистрация: 26.10.2011
Сообщений: 811
21.08.2012, 11:07 8
Цитата Сообщение от Johmmy0007
да не будет так работать! Зачем по- вашему, флаги-то ввели?
флаги ввели чтобы раньше времени никто байт не подоткнул :-)

а вот есть подоткну - то что значит не будет работать ?
будет работать как ? (в чем будет ошибка ?)
0
0 / 0 / 0
Регистрация: 04.08.2012
Сообщений: 102
21.08.2012, 11:09 9
Цитата Сообщение от ВитГа
Цитата Сообщение от sbum
ДШ mega16 стр.138, 139

Инициализация, как Master и передача байта данных
Код:
void SPI_MasterInit(void)
{
/* Set MOSI omd SCK output, all others input */
DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK);
/* Enable SPI, Master, set clock rate fck/16 */
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}

void SPI_MasterTransmit(char cData)
{
/* Start transmission */
SPDR = cData;
/* Woyt for transmission somplete */
while( !(SPSR & (1<<SPIF)) );
}

чтобы передать массив (например размером 5 байт):
Код
char data[5]; // массив данных

// передаем
for(int i = 0; i < 5; i++)
{
SPDR = data[i]; // "суём" байт
while( !(SPSR & (1<<SPIF)) ); // ждём, когда он "уйдёт"
}
--

так точно будут перерывы между байтами !

мне нужно чтобы перерывов небыло !

для этого я могу программно подходить к записи очередного байта в SPDR в момент передачи LSB, без всяких ожиданий флага SPIF

вопрос - будут ли промежутки между передаваемыми битами-импульсами?

Между байтами ПОЛЮБОМУ будут задержки, т.к. чтобы байт "улетел" - НУЖНО ВРЕМЯ!!!!!

Цитата Сообщение от ВитГа
вопрос - будут ли промежутки между передаваемыми битами-импульсами?
Нет. Ограничено временем тактирования SPI модуля.

-
0
1 / 1 / 0
Регистрация: 26.10.2011
Сообщений: 811
21.08.2012, 11:09 10
мне нужна непрерывная передача через равные промежутки:

то есть вот так: (B1 - первый байт, через точку номер бита) без паузы между байтами !!
B1.7 B1.6 B1.5 B1.4 B1.3 B1.2 B1.1 B1.0 B2.7 B2.6 B2.5 B2.4 B2.3 B2.2 B2.1 B2.0 B3.7 ......
0
SWK
21.08.2012, 11:12 11
Цитата Сообщение от ВитГа
в SPI могу засовывать байт с той скоростью с которой это нужно (посчитаю по тактам и в момент передачи последнего бита буду в SPDR засовывать следующий)
что будет в этом случае ?
Ведомый, возможно, не успеет забрать байт из своего буфера...
Прежде, чем отправить следующий байт, надо бы быть уверенным, что предыдущий уже считан. Варианты -
подтверждение ведомым готовности к приему следующего,
отправка байт с фиксированным интервалом, гарантирующим, что ведомый успеет за это время,
И куча других вариантов... Я проверял все это, когда отлаживал обмен по SPI между контроллерами ходовым и буферов своего робота. И с квитированием по выделенным линиям, и с паузой...
0 / 0 / 0
Регистрация: 04.08.2012
Сообщений: 102
21.08.2012, 11:14 12
Байты друг-за-дружкой не улетят!!!!! как из пулемета

В SPI есть свой битовый счетчик и когда он натикает 8 - установиться флаг готовности для следующего байта!!!!!!

Если подсунуть другой байт вовремя передачи - ПРОБУЙ, сам увидишь (может SPI "пожгешь", а может еще хуже ...)
0
1 / 1 / 0
Регистрация: 26.10.2011
Сообщений: 811
21.08.2012, 11:16 13
НАШЕЛ !!!

"После восьми тактов передача завершается. В обоих устройствах, в ведущем и в ведомом, устанавливается флаг генерации прерывания SPI (SPIF), а полученные данные пересылаются во входной буфер."
0
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
21.08.2012, 11:17 14
>>флаги ввели чтобы раньше времени никто байт не подоткнул :-)

вот именно. ну так и дождитесь когда можно подоткнуть

Я думаю не запишется нормально spdr, возможно даже будет блокирован аппаратно. А ради чего весь этот мудрёж, если не секрет?
0
0 / 0 / 0
Регистрация: 04.08.2012
Сообщений: 102
21.08.2012, 11:17 15
Цитата Сообщение от ВитГа
НАШЕЛ !!!

"После восьми тактов передача завершается. В обоих устройствах, в ведущем и в ведомом, устанавливается флаг генерации прерывания SPI (SPIF), а полученные данные пересылаются во входной буфер."
Что я и писАл. :)

-
0
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
21.08.2012, 11:17 16
Цитата Сообщение от ВитГа
НАШЕЛ !!!

"После восьми тактов передача завершается. В обоих устройствах, в ведущем и в ведомом, устанавливается флаг генерации прерывания SPI (SPIF), а полученные данные пересылаются во входной буфер."
вам про это пять раз написали
0
1 / 1 / 0
Регистрация: 26.10.2011
Сообщений: 811
21.08.2012, 11:18 17
Цитата Сообщение от SWK
Цитата Сообщение от ВитГа
в SPI могу засовывать байт с той скоростью с которой это нужно (посчитаю по тактам и в момент передачи последнего бита буду в SPDR засовывать следующий)
что будет в этом случае ?
Ведомый, возможно, не успеет забрать байт из своего буфера...
Прежде, чем отправить следующий байт, надо бы быть уверенным, что предыдущий уже считан. Варианты -
подтверждение ведомым готовности к приему следующего,
отправка байт с фиксированным интервалом, гарантирующим, что ведомый успеет за это время,
И куча других вариантов... Я проверял все это, когда отлаживал обмен по SPI между контроллерами ходовым и буферов своего робота. И с квитированием по выделенным линиям, и с паузой...

Я не собираюсь обрабатывать выдаваемые по SPI данные.. это данные строки изображения видеосигнала...
чтобы точки были без каких то интервалов (каждые 8 точек) мне нужно выдавать импульсы постоянно и без пауз, вот и думаю как настроить SPI чтобы это делать...
0
0 / 0 / 0
Регистрация: 04.08.2012
Сообщений: 102
21.08.2012, 11:19 18
Цитата Сообщение от ВитГа
Цитата Сообщение от SWK
Цитата Сообщение от ВитГа
в SPI могу засовывать байт с той скоростью с которой это нужно (посчитаю по тактам и в момент передачи последнего бита буду в SPDR засовывать следующий)
что будет в этом случае ?
Ведомый, возможно, не успеет забрать байт из своего буфера...
Прежде, чем отправить следующий байт, надо бы быть уверенным, что предыдущий уже считан. Варианты -
подтверждение ведомым готовности к приему следующего,
отправка байт с фиксированным интервалом, гарантирующим, что ведомый успеет за это время,
И куча других вариантов... Я проверял все это, когда отлаживал обмен по SPI между контроллерами ходовым и буферов своего робота. И с квитированием по выделенным линиям, и с паузой...
Я не собираюсь обрабатывать выдаваемые по SPI данные.. это данные строки изображения видеосигнала...
чтобы точки были без каких то интервалов (каждые 8 точек) мне нужно выдавать импульсы постоянно и без пауз, вот и думаю как настроить SPI чтобы это делать...

Юзайт PWM или вручную.
На счетчиках в общем.
0
SWK
21.08.2012, 11:23 19
Цитата Сообщение от ВитГа
мне нужна непрерывная передача через равные промежутки:
то есть вот так: (B1 - первый байт, через точку номер бита) без паузы между байтами !!
B1.7 B1.6 B1.5 B1.4 B1.3 B1.2 B1.1 B1.0 B2.7 B2.6 B2.5 B2.4 B2.3 B2.2 B2.1 B2.0 B3.7 ......
Небольшой джиттер неизбежно будет, даже если слать байты по прерыванию от таймера.
Программные задержки на С - тем более нестабильны.

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

Я не собираюсь обрабатывать выдаваемые по SPI данные.. это данные строки изображения видеосигнала...
чтобы точки были без каких то интервалов (каждые 8 точек) мне нужно выдавать импульсы постоянно и без пауз, вот и думаю как настроить SPI чтобы это делать...
Тогда - никаких С, только ассемблер.
1 / 1 / 0
Регистрация: 26.10.2011
Сообщений: 811
21.08.2012, 11:24 20
Цитата Сообщение от sbum
Юзайт PWM или вручную.
На счетчиках в общем.
на счетчике я делаю генерацию СИ (кадровых и строчных)

а вот как при помощи PWM или еще как выводить биты изображения быстрее чем со скоростью 8 мгц - готов послушать.

я нашел только один способ - SPI - аппаратный регистр сдвига..
раз в 16 тактов записать в SPDR байт - и с MOSI отдаем изображение..
получается 2 такта на точку..

все иные способы которые я находил дают около 4-5 тактов на точку !

p.s. язык конечно ассемблер, я настолько плохо знаю СИ - что надо мной вечно смеются :-)
0
21.08.2012, 11:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.08.2012, 11:24
Помогаю со студенческими работами здесь

Передача по SPI
Мне нужно передать четырехбайтовую посылку по SPI, можно ли сунуть сразу все 4 байта в SPDR или...

Прием и передача байта с включением двигателя
Помогите пожалуйста найти ошибку. Нужно передать 0xF на контроллер, сравнить и передать обратно,...

spi передача от slave
Пытаюсь передать информацию от slave к mostir по spi. выбираю мастером слейва, у мастера настроено...

SPI: прием и передача
Добрый день. Осваиваю SPI на контроллере Atmega168 (slave). master устройство - Raspberry pi. Прием...

Прием/передача по SPI от TLE6244x
Столкнулся с необходимость управлять 18 канальным силовым ключом TLE6244x через SPI. Уже неделю...

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

AVR32 SPI прием и передача
Добрый день, столкнулся с проблемой на микроконтроллере AVR32UC3C0512, мне необходимо передать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru