Сразу дико извиняюсь =) М.б. вопрос поражает тупостью, но я честно больше суток пытался решать проблему мозгом. Потом решал "гуглом". Итог - этот топик ): Суть проблемы: есть диспей от Motorola C450 (SSD1770). Работать с ним можно в режиме SPI (кстати, среди аппаратного функционала в дисплее есть интересные вещи, вроде скола и прорисовки простейший фигур). Штука, конечно, древнее дерьма мамонта, но жизнь заставляет юзать её совместно с ATTiny2313. В нём мы не располагаем SPI, имеем только USI. Честно читал даташит, честно понял, что SPI можно реализовать через 3-wired USI. Честно НЕ ПОНЯЛ, что происходит в примере на асме. Каюсь, я программист на высокоуровневых языках. Если не затруднит, киньте в меня перелопаченным примером на C
UPD: сам ASM-код из даташита:
Код:
SPITransfer: out USIDR,r16 ldi r16,(1<<USIOIF) out USISR,r16 ldi r16,(1<<USIWM0)|(1<<USICS1)|(1<<USICLK)|(1<<USITC) SPITransfer_loop: out USICR,r16 sbis USISR,USIOIF rjmp SPITransfer_loop in r16,USIDR ret
Последний раз редактировалось hybroid Ср мар 09, 2011 15:58:36, всего редактировалось 1 раз.
как я понял, через USI - получается _почти_ программный SPI. как кричит даташит:
Цитата:
The USI provides the basic hardware resources needed for synchronous serial communication. Combined with a minimum of control software, the USI allows higher transfer rates, less CPU load and in general uses less code space than solutions based on software only
Не могу не согласиться с даташитом. Особенно, в случае с ATTiny2313, где и так каждый байт на счету. Да и всё-таки хочется раз и на всегда разобраться в данном вопросе.
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
PS Если захочешь на USI - TWI(i2C)организовать - обращайся, есть исходник на С++ (класс, методы, конструктор, деструктор) В общем для крутых, высокоуровневых пацанов :0)
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Честно НЕ ПОНЯЛ, что происходит в примере на асме.
Код:
SPITransfer: out USIDR,r16 ;пишем байт в регистр данных USI ldi r16,(1<<USIOIF) ;сбрасываем бит переполнения out USISR,r16 ;счетчика USI ldi r16,(1<<USIWM0)|(1<<USICS1)|(1<<USICLK)|(1<<USITC) ;конфигурация USI: ;-режим SPI (бит USIWM0) ;-программное тактирование (бит USICS1) ;-сдвиг регистра данных (1 в USICLK) ;-переключение линии CLK (1 в USITC) SPITransfer_loop: out USICR,r16 ;запись в регистр управления USI, сдвиг регистра данных, переключение CLK sbis USISR,USIOIF ;проверка переполнения счетчика USI rjmp SPITransfer_loop ;переход если нет in r16,USIDR ;если да, читаем что пришло по SPI ret ;возврат из подпрограммы
Хотя я предпочитаю вариант SPITransfer_Fast, он хотя и длиннее более чем в 2 раза, зато быстрее (и кстати проще).
обращайся, есть исходник на С++ (класс, методы, конструктор, деструктор)
За апноут благодарю. PS: Откуда столько яда? С каких пор знание чего-то удобнее ассемблера стало "пацанской" биркой? Или вы считаете, что работать с МК со знанием C - это "не по-пацански"? Или, м.б., я зря несу в голове понятия
Цитата:
С++ (класс, методы, конструктор, деструктор)
?
Кстати, C++ не ограничен классами и деструкторами.
И, между прочим, мир высокоуровневых языков не ограничен C++
Честно НЕ ПОНЯЛ, что происходит в примере на асме.
Код:
SPITransfer: out USIDR,r16 ;пишем байт в регистр данных USI ldi r16,(1<<USIOIF) ;сбрасываем бит переполнения out USISR,r16 ;счетчика USI ldi r16,(1<<USIWM0)|(1<<USICS1)|(1<<USICLK)|(1<<USITC) ;конфигурация USI: ;-режим SPI (бит USIWM0) ;-программное тактирование (бит USICS1) ;-сдвиг регистра данных (1 в USICLK) ;-переключение линии CLK (1 в USITC) SPITransfer_loop: out USICR,r16 ;запись в регистр управления USI, сдвиг регистра данных, переключение CLK sbis USISR,USIOIF ;проверка переполнения счетчика USI rjmp SPITransfer_loop ;переход если нет in r16,USIDR ;если да, читаем что пришло по SPI ret ;возврат из подпрограммы
Хотя я предпочитаю вариант SPITransfer_Fast, он хотя и длиннее более чем в 2 раза, зато быстрее (и кстати проще).
Спасибо за ответ по теме. Можно подробнее про SPITransfer_Fast?
Это пример, который идет в даташите после первого варианта. Там первой строкой также пишется байт в порт данных, потом в два регистра (R16 и R17) записывается конфигурация USI, с отличием в один бит (этот бит - тактовый). Потом тупо 8 раз повторяется вывод сначала R16 потом R17 в конфигурационный регистр USI, при этом регистр данных сдвигается автоматом при каждом изменении в тактовом бите. После 8 циклов читается то, что пришло по SPI. Кстати, не забываем что в SPI еще может быть линия CS...
Хм. Можно про камни с CS? Мною используемый LCD как раз "активно жаждит" CS..
Выделяете любую свободную ногу МК под CS, и перед тем как передавать какие-либо данные с помощью вышерассмотренных подпрограмм ставите ее в 0, после передачи ставите в 1. Если 2 устройства - 2 линии CS, при общении с конкретным устройством ставите в 0 его CS, и т.д.
PS: Откуда столько яда? С каких пор знание чего-то удобнее ассемблера стало "пацанской" биркой? Или вы считаете, что работать с МК со знанием C - это "не по-пацански"? Или, м.б., я зря несу в голове понятия И, между прочим, мир высокоуровневых языков не ограничен C++
Я специально поставил в конце предложения смайлик - это была дружеская шутка, подначка . Если обидел - прошу прощения.
Совет: Вообще, если есть желание программировать микроконтроллеры то знание ассемблера ОЧЕНЬ НЕ ПОМЕШАЕТ.
Так же как автор топика решил освоить USI в качестве SPI, пишу в алгоритм билдере (ассемблер). помоему в USI нехватает настроек от SPI, таких как: 1) выбор из 4 типов тактирования (два по спаду и два по подъёму, каждая из двоек либо с нуля, либо с единицы стартует) 2) деление частоты от тактирования процессора (SPI самый быстрый протокол был, а это... я даж без понятия какую скорость получится выжать) 3) какой бит передаётся первым, старший или младший? такой настройки вообще не нашол... может плохо искал хз, гугл не смог помочь. си не изучал, т.к. обычно мне нужна ассемблерная точность и быстрота работы процессора (прошу не холиварить по данному поводу)
п.с. на меге 32 по SPI подключил экран и он вполне сносно и быстро работает, хочу перевести проект на attyni2313. подскажите в какой регистр что записать чтоб получить: 1) старт передачи с 0 (хотя не критично, можно и с 1), тактирование по подъёму(по классификации SPI это 1 или 3 тип был) 2) частоту нужно как можно большую, в меге было дабл спид, т.е. кварц/2 3) MSB передаётся первым, это вроде младший бит...
1) старт передачи с 0 (хотя не критично, можно и с 1), тактирование по подъёму(по классификации SPI это 1 или 3 тип был)
Вроде в качестве мастера тинька может только по подьему тактировать, в качестве слейва и по спаду и по подьему (даташит, таблица 61)
kotoandroid писал(а):
2) частоту нужно как можно большую, в меге было дабл спид, т.е. кварц/2
Кварц/2 получается в варианте SPITransfer_Fast (ДШ, пример на странице 143)
kotoandroid писал(а):
3) MSB передаётся первым, это вроде младший бит...
Most significant bit - т.е. старший байт. Любые другие варианты (другие режимы SPI, младший бит первым) - только с помощью программного SPI (но при этом не получить скорости кварц/2)
таким образом мне повезло и самая быстрая конфигурация как раз мне подойдёт, я правильно понял? таблица 61 для меня пока загадка, не понимаю я что там написано, причем тут внешние сигналы тактирования( возможно речь идет о слейв устройстве по отношению к мастеру?) как выставить USICR и USISR, чтоб было тактирование по подъёму( мастер устройство), старший бит первым шол и скорость СК/2?
п.с. надеюсь я не кажусь очень наглым, просто никак не доходит до меня этот USI. SPI и TWI и то проще... помоему.. кучу даташитов перелопатил, пока без результата.
как выставить USICR и USISR, чтоб было тактирование по подъёму( мастер устройство), старший бит первым шол и скорость СК/2?
Почти все выставляется в примере SPITransfer_Fast. Нужно только еще DDR этого порта сконфигурировать (CS, DO, CLK на выход, DI на вход. Не путать DI/DO USI с MOSI/MISO ISP, они там наоборот стоят!).
kotoandroid писал(а):
п.с. надеюсь я не кажусь очень наглым, просто никак не доходит до меня этот USI. SPI и TWI и то проще... помоему.. кучу даташитов перелопатил, пока без результата.
Зачем кучу, нужно всего пару - на МК и на ведомое устройство
Зачем кучу, нужно всего пару - на МК и на ведомое устройство
я имел ввиду кучу разных даташитов и описаний USI, SPI, attiny и прочего. что касается даташитов на ведомое устройство, то повторюсь, оно уже работало, но на меге, с нормальным SPI, где всё явно и понятно, без заморочек.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 21
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения