Ние изучаваме интерфейса SPI и свързваме регистър за смяна към Arduino, до който ще имаме достъп, използвайки този протокол за управление на светодиодите.
Необходимо
- - Arduino;
- - регистър за смяна 74HC595;
- - 8 светодиода;
- - 8 резистора от 220 Ohm.
Инструкции
Етап 1
SPI - сериен периферен интерфейс или „сериен периферен интерфейс“е синхронен протокол за трансфер на данни за свързване на главно устройство с периферни устройства (slave) Капитанът често е микроконтролер. Комуникацията между устройствата се осъществява през четири проводника, поради което SPI понякога се нарича "интерфейс с четири проводника". Тези гуми са:
MOSI (Master Out Slave In) - линия за предаване на данни от главната към подчинените устройства;
MISO (Master In Slave Out) - предавателна линия от подчинения към главния;
SCLK (сериен часовник) - синхронизиращи импулси на часовника, генерирани от главното устройство;
SS (Slave Select) - линия за избор на подчинено устройство; когато е на линия "0", робът "разбира", че се осъществява достъп.
Има четири режима на трансфер на данни (SPI_MODE0, SPI_MODE1, SPI_MODE2, SPI_MODE3), поради комбинацията от полярност на тактовия импулс (работим на ВИСОКО или НИСКО ниво), Полярност на часовника, CPOL и фаза на тактовите импулси (синхронизация на нарастващия или спадащия ръб на импулса на часовника), Clock Phase, CPHA.
Фигурата показва две опции за свързване на устройства, използващи протокола SPI: независим и каскаден. Когато е независимо свързан към шината SPI, главният комуникира поотделно с всеки роб. С каскада - подчинените устройства се задействат последователно, в каскада.
Стъпка 2
В Arduino шините SPI са на определени портове. Всяка дъска има свое собствено разпределение на щифтове. За удобство щифтовете се дублират и се поставят на отделен съединител ICSP (In Circuit Serial Programming). Моля, обърнете внимание, че на конектора ICSP - SS няма подчинен пин за избор, тъй като предполага се, че Arduino ще се използва като главен в мрежата. Но ако е необходимо, можете да зададете всеки цифров щифт на Arduino като SS.
Фигурата показва стандартното разпределение на щифтовете към SPI шините за Arduino UNO и Nano.
Стъпка 3
За Arduino е написана специална библиотека, която изпълнява протокола SPI. Той е свързан така: в началото на програмата добавете #include SPI.h
За да започнете работа с протокола SPI, трябва да зададете настройките и след това да инициализирате протокола, като използвате процедурата SPI.beginTransaction (). Можете да направите това с една инструкция: SPI.beginTransaction (SPISettings (14000000, MSBFIRST, SPI_MODE0)).
Това означава, че ние инициализираме протокола SPI на честота 14 MHz, трансферът на данни преминава, започвайки от MSB (най-значимият бит), в режим "0".
След инициализацията избираме подчиненото устройство, като поставяме съответния SS щифт в НИЗКО състояние.
След това прехвърляме данните към подчиненото устройство с командата SPI.transfer ().
След предаване връщаме SS в HIGH състояние.
Работата с протокола завършва с командата SPI.endTransaction (). Желателно е да се сведе до минимум времето за изпълнение на трансфера между инструкциите SPI.beginTransaction () и SPI.endTransaction (), така че да няма припокриване, ако друго устройство се опита да инициализира прехвърлянето на данни, използвайки различни настройки.
Стъпка 4
Нека разгледаме практическото приложение на интерфейса SPI. Ще запалим светодиодите, като управляваме 8-битовия регистър на смяна чрез SPI шината. Нека свържем сменния регистър 74HC595 към Arduino. Свързваме се с всеки от 8-те изхода чрез светодиод (чрез ограничаващ резистор). Диаграмата е показана на фигурата.
Стъпка 5
Нека напишем такава скица.
Първо, нека свържем библиотеката SPI и инициализираме интерфейса SPI. Нека дефинираме пин 8 като подчинен пин за избор. Нека изчистим регистъра на смяната, като му изпратим стойността "0". Инициализираме серийния порт.
За да запалите определен светодиод с помощта на регистър за смяна, трябва да приложите 8-битово число към неговия вход. Например, за да светне първият светодиод, подаваме двоичното число 00000001, за втория - 00000010, за третия - 00000100 и т.н. Тези двоични числа в десетична нотация образуват следната последователност: 1, 2, 4, 8, 16, 32, 64, 128 и са степени на две от 0 до 7.
Съответно, в цикъла () по броя на светодиодите, ние преизчисляваме от 0 до 7. Функцията pow (основа, градус) повишава 2 до степента на брояча на циклите. Микроконтролерите не работят много точно с числа от типа "double", така че за да преобразуваме резултата в цяло число, използваме функцията round (). И прехвърляме полученото число в регистъра на смяната. За по-голяма яснота мониторът на серийния порт показва стойностите, получени по време на тази операция: една преминава през цифрите - светодиодите светват на вълна.
Стъпка 6
Светодиодите светват на свой ред и ние наблюдаваме пътуваща "вълна" от светлини. Светодиодите се управляват с помощта на регистър за смяна, към който се свързахме чрез интерфейса SPI. В резултат на това се използват само 3 щифта Arduino за задвижване на 8 светодиода.
Проучихме най-простия пример за това как Arduino работи със SPI шина. Ще разгледаме връзката на регистрите за смяна по-подробно в отделна статия.