|
|
  |
SPI как USI, как заставить передать 5ть 13ть и т.п. бит, Какие есть предложения? |
|
|
|
Oct 26 2006, 18:09
|
Частый гость
 
Группа: Свой
Сообщений: 79
Регистрация: 13-01-06
Из: Москва
Пользователь №: 13 133

|
Вот это все только на 1 бит 1 раз, ни какого сравнения с 2clk Код RW_spi: cs_on rw_spi_loop: sclk_low;не активное состоние lsl spi0;первым принимает байт brcc din_cl;пропустить если бит сброшен din_hi rjmp din_done din_cl: din_low din_done: sclk_hi ;чтение бита nop;возможно лишняя задержка sbic pinB,dout;оставим если 0 sbr spi0,1;установим сохраним бит если 1 dec SPI_count;посчитаем цикл brne rw_spi_loop; cs_off ret
|
|
|
|
|
Oct 26 2006, 20:25
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(Gennadiy_ @ Oct 26 2006, 14:41)  надо принять и передать количество бит не кратное 8ми, желательно на предельной скорости, с этой задачей неплохо справиться USI, но его нет в AT90USBхххх . Какие есть предложения? Есть предложение передавать и принимать на скорости Fsys/4, но сначала пара вопросиков. 1) Надо передавать 5 или 13 бит и всё? Огласите весь ряд. 2) Что такое по-вашему предельная скорость?
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 27 2006, 09:33
|
Частый гость
 
Группа: Свой
Сообщений: 79
Регистрация: 13-01-06
Из: Москва
Пользователь №: 13 133

|
Цитата(aaarrr @ Oct 27 2006, 00:36)  ИМХО, в большинстве случаев, когда нужно передать 5 или 13 бит, можно без ущерба для здоровья передать 8 или 16 с соответствующим выравниванием. Количество бит любое от 1до 7, задается управляющей оболочкой. Предельная скорость, это когда выбрана максимально возможная, в данном случае в режиме "мастер " Fsck=CK/2 Про лишние биты достоверно неизвестно, по поставленным условиям лишних быть недолжно. Но предложение дельное, поскольку заставило еще раз взглянуть на вопрос с другой стороны. Вдруг, в начале посылки и можно будет вставить лишние биты. Спасибо. Еще?
|
|
|
|
|
Oct 27 2006, 11:50
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(Gennadiy_ @ Oct 27 2006, 08:33)  Количество бит любое от 1до 7, задается управляющей оболочкой. Предельная скорость, это когда выбрана максимально возможная, в данном случае в режиме "мастер " Fsck=CK/2 Непонятна постановка задачи. То вы говорили 5 или 13 бит надо передавать, теперь от 1 до 7... Еще вопросы. 1) Должны быть одновременные прием/передача, т.е. полный дуплекс или устроит симплекс? 2) МК работает как ведущий или ведомый? 3) Какой смысл в передаче 1-го и приеме 1-го битов? Шейкхендз? Вы бы сказали поконкретнее, что хотите реализовать, а то приходится догадываться. Например, у меня есть один вариант с полным дуплексом на Fclc/4, немного экзотичный(:-), кажется его можно применить и на Fclc/2, но не хочется публиковать, поскольку не уверен в исходной постановке.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 27 2006, 20:21
|
Частый гость
 
Группа: Свой
Сообщений: 79
Регистрация: 13-01-06
Из: Москва
Пользователь №: 13 133

|
неправильно написал, надо было сразу указать от 1го до 7ми
>1) Должны быть одновременные прием/передача, т.е. полный дуплекс или устроит симплекс? бит должен передаваться и принимается за один импульс sck, как обычно в SPI один передается другой принимается
>2) МК работает как ведущий или ведомый? ведущий
>3) Какой смысл в передаче 1-го и приеме 1-го битов? Шейкхендз? Смысл в пердаче/приеме, скажем, n*8+k бит, где n число целых байтов, k от 1 до 7
>Вы бы сказали поконкретнее, что хотите реализовать, а то приходится догадываться. Например, у меня есть один вариант с полным дуплексом на Fclc/4, немного экзотичный(:-), кажется его можно применить и на Fclc/2, но не хочется публиковать, поскольку не уверен в исходной постановке.
тоже нехочется рскрывать, может и зря. изначально думал, что посылки кратные 8 битам, потом мне обьяснили, что не всегда. Заинтересовали, может угадаю : - синхронный с потоком кода запуск таймера для выдачи аппаратного Sck - внешние схемные решения, типа одновибраторов, и т.п.
для себя формулирую задачу как мастер SPI с произвольным количеством принимаемых передаваемых бит, порт должен транслировать в обе стороны потоки через USB, команды по чтению и пердачи идут с персоналки. Для задачи идеально подошел бы FTDI 2232, неустраивает 6мбит, надо выше.
|
|
|
|
|
Oct 28 2006, 18:51
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Gennadiy неправильно написал, надо было сразу указать от 1-го до 7-ми
Правильнее было бы написать так: передача произвольного числа бит от 1 до 100(:-)
GM Вы бы сказали поконкретнее, что хотите реализовать, а то приходится догадываться Gennadiy тоже нехочется раскрывать, может и зря
Ну я ж спрашивал не какую задачу хотите решать, по-честному, мне оно по барабану, просто хотел уточнить ваш исходный вопрос.
Gennadiy Заинтересовали, может угадаю : - синхронный с потоком кода запуск таймера для выдачи аппаратного Sck - внешние схемные решения, типа одновибраторов, и т.п.
С внешними любой сделает, интересно выжать максимум из МК(:-) Что такое "синхронный с потоком кода запуск таймера для выдачи аппаратного Sck"? Вообще близко, просто уточните. В понедельник пришлю своё решение, тетрадка с набросками осталась на работе, по-новой неохота рисовать, там уже три варианта намечается.
Геннадий не устраивает 6 мбит, надо выше
Выше 8 Мбит/с вряд ли получится
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 29 2006, 18:22
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(aaarrr @ Oct 26 2006, 23:36)  ИМХО, в большинстве случаев, когда нужно передать 5 или 13 бит, можно без ущерба для здоровья передать 8 или 16 с соответствующим выравниванием. В одном из проектов были связаны два МП сначала по паралельному интерфейсу. 8бит данных, бит управления и два бита подтверждений. Потом перешли на SPI. Необходимо было отличать данные от комманд. Для этого в принципе достаточен один лишний бит. В RS232 такое есть. Остановились на полном 16 битном варианте. В другом случае реализовывался интерфейс с AD7716 правда на х51. Был пременён програмно аппаратный интерфейс ;======================================================================== ; Вывод в DAC DAC7611 (програмно-аппаратный !!!). ;------------------------------------------------------------------------ ; Входные регистры: A (старших 4 бита), r1 (младший) ; Выходные регистры: - ; Портятся регистры: A ; Занято стэка : 1 ;WrDAC12:xch a,r1 ; push acc ; сохранить мл. байт ???? ; clr SCK ; подготовить SCK для программы ; mov a,#10h ; выключить SPI ; mov spcr,a ; xch a,r1 ; mov r1,#4 ; вывести 4 ст. бита ;wrd3: mov c,acc.3 ; текущий бит старшего байта в C ; mov MoSi,c ; и вывести его ; setb SCK ; стробировать его ; clr SCK ; rl a ; следующий бит ; djnz r1,wrd3 ; на повтор ; mov a,#50h ; включить SPI ; mov spcr,a ; setb SCK ; подготовить SCK для аппаратного SPI ; setb MoSi ; подготовить MoSi для аппаратного SPI ; pop acc ; восстановить мл. байт ; mov r1,a ; ajmp wrdl ; и вывести его ч/з SPI ;======================================================================== ; Вывод в DAC AD420 (через SPI !!!). ;------------------------------------------------------------------------ ; Входные регистры: A (старший), r1 (младший) ; Выходные регистры: - ; Портятся регистры: A ; Занято стэка : - WrDAC16:mov spdr,a ; вывести в DAC старший байт wrdh: mov a,spsr ; ждать завершения операции jnb acc.7,wrdh ; передачи ст. байта mov a,spdr ; читать чтобы сбросить флаг wrdl: mov spdr,r1 ; вывести в DAC младший байт wrdl1: mov a,spsr ; ждать завершения операции jnb acc.7,wrdl1 ; передачи мл. байта mov a,spdr ; читать чтобы сбросить флаг ret ; выйти
|
|
|
|
|
Oct 30 2006, 10:18
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(Gennadiy_ @ Oct 26 2006, 15:41)  надо принять и передать количество бит не кратное 8ми, желательно на предельной скорости, с этой задачей неплохо справиться USI, но его нет в AT90USBхххх .
Какие есть предложения? Пришел в голову четвертый вариант, наиболее простой. 1) Настраиваете SPI на скорость 8 Мбит/с 2) Вместо SCK используете выход OCR1A (на 8 МГц). 3) Округлите ваши байты в большую сторону и начните передавать. 4) Настройте прерывание таймера0 на время передачи N бит. Прерывание должно запрещать импульсы с OCR1A. Как только вы передадите N бит, наступит прерывание, которое остановит выдачу импульсов синхронизации, следовательно, прекратится передача битов во внешнее устройство. Для надежности можно загнать в последний байт соответствующие единички или нули.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 31 2006, 16:45
|
Частый гость
 
Группа: Свой
Сообщений: 79
Регистрация: 13-01-06
Из: Москва
Пользователь №: 13 133

|
Цитата Пришел в голову четвертый вариант, наиболее простой.
1) Настраиваете SPI на скорость 8 Мбит/с 2) Вместо SCK используете выход OCR1A (на 8 МГц). 3) Округлите ваши байты в большую сторону и начните передавать. 4) Настройте прерывание таймера0 на время передачи N бит. Прерывание должно запрещать импульсы с OCR1A. Я имел ввиду программный вывод битов, при выводе SCK с таймера, когда посчитал то понял, что CLK/4 неполучится, поэтому ваш вариант я не угадал. Я так понял, что совместное творчество принесло плоды, и это решение быстрее чем было у вас. Тока прерывание тут может неуспеть. CLK/4 получается если формировать SCK программно, а данные принимать/выводить по SPI. Надо было местами поменять!!! :-))
|
|
|
|
|
Nov 1 2006, 11:23
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(Gennadiy_ @ Oct 31 2006, 16:45)  Я так понял, что совместное творчество принесло плоды, и это решение быстрее чем было у вас. Тока прерывание тут может неуспеть. Не понял, какое прерывание не успеет? В этом варианте используется только одно прерывание - по таймеру, вы можете подобрать время его срабатывания точно в тот момент, когда надо прекратить передавать энный бит. Естественно, с учетом латентного периода прерывания и т.д и т.п. Цитата(Gennadiy_ @ Oct 31 2006, 16:45)  CLK/4 получается если формировать SCK программно, а данные принимать/выводить по SPI. Надо было местами поменять!!! :-)) Загадками изволите говорить(:-). Так что, какое решение подходит под вашу задачу?
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|