USI ATtiny24A + HC595
#1
Друзья! Встала задача передать даные по SPI, который есть в виде USI на борту означенной жабки.
Но мои поиски ничего конкретного не дают. Точнее, инфа есть
https:/ /radiohlam.ru/attiny_usi/
но я не могу с е помощью накидать СИшный код. А писать руками процедуру не позволяет быстродействие.
По установкам бит в примере я смогу понять за что там каие биты отвечают. Сейчас - каша...
#2
(08-10-2021, 09:45)Globus_vrn : Друзья! Встала задача передать даные по SPI, который есть в виде USI на борту означенной жабки.
Но мои поиски ничего конкретного не дают. Точнее, инфа есть
https:/ /radiohlam.ru/attiny_usi/
но я не могу с е помощью накидать СИшный код. А писать руками процедуру не позволяет быстродействие.
По установкам бит в примере я смогу понять за что там каие биты отвечают. Сейчас - каша...

Даташит читать нуно 1
На сях не писал, на ассемблере это выглядит вот так
Код:
;Мастер SPI
SPITransfer:
    out USIDR, R16       ;пишем данные в регистр данных USIDR

    ldi R16, (1<<USIOIF) ;сброс переполнения записью 1 в бит USIOIF регистра USISR
    out USISR, R16       ;
SPITransfer_loop:
    ldi R16, (0<<USIWM1)|(1<<USIWM0)|(1<<USICS1)|(0<<USICS0)|(1<<USICLK)|(1<<USITC)
    out USICR, R16       ;устанавливаем режим работы порта и даем строб
   ;(т.н. программный такт, при записи 1 в USITC вывод USCK/SCL инвертируется)

    in R16, USISR        ;проверяем условие передачи байта,
    sbrs R16, USIOIF     ;ждем переполнение счетчика USI SR)

    rjmp SPITransfer_loop;
SPITransfer_end:
    ret
может поможет чем.

Чтобы ответ был более полным:
запись вида (1<<USIWM1) означает установить бит USIWM1 в 1;
биты USIWM1, USIWM0 отвечают за режим работы USI порта (USIWM1=0, USIWM0=1 - трехпроводной режим используются выводы DO, DI и USCK);
USICS1, USICS0, USICLK эти биты устанавливают источник синхронизации для регистра сдвига и счетчика - в нашем случае ( 1 0 1 ) программный строб при записи 1 в USITC по положительной границе.
#3
Если я правильно понял ассемблер (я впервые перевожу),то получается на СИ почти как бейсик


Код:
MasterSend(char Data) // заголовок функции с регистром для передачи
{
  USIDR = Data;    // загружаем даные в регистр
  USISR_USIOIF = 1; // устанавливаем бит USIOIF в 1
SPITransfer_loop:
  USICR = (0<<USIWM1)|(1<<USIWM0)|(1<<USICS1)|(0<<USICS0)|(1<<USICLK)|(1<<USITC); // имитация CLK
  if (USISR_USIOIF == 0) {goto SPITransfer_loop;}  // если бит USIOIF не выскочил - продолжить
}
#4
Да, очень похоже.