реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> SPI как USI, как заставить передать 5ть 13ть и т.п. бит, Какие есть предложения?
Gennadiy_
сообщение Oct 26 2006, 15:41
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 79
Регистрация: 13-01-06
Из: Москва
Пользователь №: 13 133



надо принять и передать количество бит не кратное 8ми, желательно на предельной скорости, с этой задачей неплохо справиться USI, но его нет в AT90USBхххх .

Какие есть предложения?
Go to the top of the page
 
+Quote Post
prottoss
сообщение Oct 26 2006, 16:05
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(Gennadiy_ @ Oct 26 2006, 23:41) *
надо принять и передать количество бит не кратное 8ми, желательно на предельной скорости, с этой задачей неплохо справиться USI, но его нет в AT90USBхххх .

Какие есть предложения?
дык USI и так уцененный (полупрограммный) SPI... сделайте полностью программный, если делать на полной скорости не такие уж и большие потери по времени...


--------------------
Go to the top of the page
 
+Quote Post
Gennadiy_
сообщение Oct 26 2006, 18:09
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
=GM=
сообщение Oct 26 2006, 20:25
Сообщение #4


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) Что такое по-вашему предельная скорость?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 26 2006, 20:36
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



ИМХО, в большинстве случаев, когда нужно передать 5 или 13 бит, можно без ущерба для здоровья передать 8 или 16 с соответствующим выравниванием.
Go to the top of the page
 
+Quote Post
Gennadiy_
сообщение Oct 27 2006, 09:33
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 79
Регистрация: 13-01-06
Из: Москва
Пользователь №: 13 133



Цитата(aaarrr @ Oct 27 2006, 00:36) *
ИМХО, в большинстве случаев, когда нужно передать 5 или 13 бит, можно без ущерба для здоровья передать 8 или 16 с соответствующим выравниванием.



Количество бит любое от 1до 7, задается управляющей оболочкой.

Предельная скорость, это когда выбрана максимально возможная, в данном случае в режиме "мастер " Fsck=CK/2

Про лишние биты достоверно неизвестно, по поставленным условиям лишних быть недолжно. Но предложение дельное, поскольку заставило еще раз взглянуть на вопрос с другой стороны.
Вдруг, в начале посылки и можно будет вставить лишние биты.
Спасибо.


Еще?
Go to the top of the page
 
+Quote Post
=GM=
сообщение Oct 27 2006, 11:50
Сообщение #7


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, но не хочется публиковать, поскольку не уверен в исходной постановке.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Gennadiy_
сообщение Oct 27 2006, 20:21
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 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мбит, надо выше.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Oct 28 2006, 18:51
Сообщение #9


Ambidexter
*****

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



Gennadiy неправильно написал, надо было сразу указать от 1-го до 7-ми

Правильнее было бы написать так: передача произвольного числа бит от 1 до 100(:-)

GM Вы бы сказали поконкретнее, что хотите реализовать, а то приходится догадываться
Gennadiy тоже нехочется раскрывать, может и зря

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

Gennadiy Заинтересовали, может угадаю :
- синхронный с потоком кода запуск таймера для выдачи аппаратного Sck
- внешние схемные решения, типа одновибраторов, и т.п.


С внешними любой сделает, интересно выжать максимум из МК(:-)
Что такое "синхронный с потоком кода запуск таймера для выдачи аппаратного Sck"?
Вообще близко, просто уточните. В понедельник пришлю своё решение, тетрадка с набросками осталась на работе, по-новой неохота рисовать, там уже три варианта намечается.

Геннадий не устраивает 6 мбит, надо выше

Выше 8 Мбит/с вряд ли получится


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Oct 29 2006, 18:22
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 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 ; выйти
Go to the top of the page
 
+Quote Post
=GM=
сообщение Oct 30 2006, 10:18
Сообщение #11


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 бит, наступит прерывание, которое остановит выдачу импульсов синхронизации, следовательно, прекратится передача битов во внешнее устройство. Для надежности можно загнать в последний байт соответствующие единички или нули.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Gennadiy_
сообщение Oct 31 2006, 16:45
Сообщение #12


Частый гость
**

Группа: Свой
Сообщений: 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.

Надо было местами поменять!!! :-))
Go to the top of the page
 
+Quote Post
=GM=
сообщение Nov 1 2006, 11:23
Сообщение #13


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.
Надо было местами поменять!!! :-))

Загадками изволите говорить(:-). Так что, какое решение подходит под вашу задачу?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 09:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.01457 секунд с 7
ELECTRONIX ©2004-2016