(08-10-2021, 09:45)Globus_vrn : Друзья! Встала задача передать даные по SPI, который есть в виде USI на борту означенной жабки.
Но мои поиски ничего конкретного не дают. Точнее, инфа есть
https:/ /radiohlam.ru/attiny_usi/
но я не могу с е помощью накидать СИшный код. А писать руками процедуру не позволяет быстродействие.
По установкам бит в примере я смогу понять за что там каие биты отвечают. Сейчас - каша...
Даташит читать нуно
На сях не писал, на ассемблере это выглядит вот так
Код:
;Мастер 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 по положительной границе.