1 / 1 / 0
Регистрация: 26.10.2011
Сообщений: 811
|
|
1 | |
Работа SPI передача более 1 байта21.08.2012, 10:36. Показов 46073. Ответов 82
Метки нет (Все метки)
Где посмотреть сколько тактов тратит аппаратный SPI меги на передачу одного байта при передаче двух и более байт ?
все что я смог найти так это картинки подобные этой: <Изображение удалено> или такой <Изображение удалено> а как выглядит передача цепочки байт ? есть ли между байтами промежуток в 1-2 такта или какая то другая пауза ? какой уровень в этот момент на MOSI (1 или 0) ? если пауза есть, то можно ли переключить SPI на передачу без пауз ? (подряд биты байта 1, потом тут же байта 2 и так далее)
0
|
21.08.2012, 10:36 | |
Ответы с готовыми решениями:
82
Чтение байта в режиме SPI 9 битов SPI в AVR. Потеря первого байта при передаче строки HAL_UART_Transmit как передать более одного байта? Передача одного байта по com-порту |
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 = 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)) ); } Код
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
{ /* 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 |
Сообщение от ВитГа
{ /* 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
|
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 между контроллерами ходовым и буферов своего робота. И с квитированием по выделенным линиям, и с паузой... |
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 |
Сообщение от ВитГа
-
0
|
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
|
|
21.08.2012, 11:17 | 16 |
Сообщение от ВитГа
0
|
1 / 1 / 0
Регистрация: 26.10.2011
Сообщений: 811
|
|
21.08.2012, 11:18 | 17 |
Сообщение от SWK
Прежде, чем отправить следующий байт, надо бы быть уверенным, что предыдущий уже считан. Варианты - подтверждение ведомым готовности к приему следующего, отправка байт с фиксированным интервалом, гарантирующим, что ведомый успеет за это время, И куча других вариантов... Я проверял все это, когда отлаживал обмен по SPI между контроллерами ходовым и буферов своего робота. И с квитированием по выделенным линиям, и с паузой... Я не собираюсь обрабатывать выдаваемые по SPI данные.. это данные строки изображения видеосигнала... чтобы точки были без каких то интервалов (каждые 8 точек) мне нужно выдавать импульсы постоянно и без пауз, вот и думаю как настроить SPI чтобы это делать...
0
|
0 / 0 / 0
Регистрация: 04.08.2012
Сообщений: 102
|
|
21.08.2012, 11:19 | 18 |
Сообщение от ВитГа
чтобы точки были без каких то интервалов (каждые 8 точек) мне нужно выдавать импульсы постоянно и без пауз, вот и думаю как настроить SPI чтобы это делать... Юзайт PWM или вручную. На счетчиках в общем.
0
|
SWK
|
|
21.08.2012, 11:23 | 19 |
Сообщение от ВитГа
Программные задержки на С - тем более нестабильны. Можно написать процедуру отправки байтов на ассемблере, без условий, запретив прерывания, сформировав задержки программно, точно посчитав количество тактов. Как это делают, например, в программах частотомеров на PIC. |
1 / 1 / 0
Регистрация: 26.10.2011
Сообщений: 811
|
|
21.08.2012, 11:24 | 20 |
Сообщение от sbum
а вот как при помощи PWM или еще как выводить биты изображения быстрее чем со скоростью 8 мгц - готов послушать. я нашел только один способ - SPI - аппаратный регистр сдвига.. раз в 16 тактов записать в SPDR байт - и с MOSI отдаем изображение.. получается 2 такта на точку.. все иные способы которые я находил дают около 4-5 тактов на точку ! p.s. язык конечно ассемблер, я настолько плохо знаю СИ - что надо мной вечно смеются :-)
0
|
21.08.2012, 11:24 | |
21.08.2012, 11:24 | |
Помогаю со студенческими работами здесь
20
Передача по SPI Прием и передача байта с включением двигателя spi передача от slave SPI: прием и передача Прием/передача по SPI от TLE6244x Передача данных между МК по SPI AVR32 SPI прием и передача Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |