- Хардуерна настройка и изисквания за активиране на функцията SPI на N76E003
- Верига към интерфейс
- SPI щифтове на микроконтролера Nuvoton N76E003
- SPI информация N76E003
- Учителю
- Програмиране
- Тестване на SPI комуникация на Nuvoton с помощта на Arduino
SPI е ключов комуникационен протокол, който се използва широко за комуникация между микроконтролери, SD карти и различни други сензори. SPI означава сериен периферен интерфейс, това е синхронен протокол за трансфер на данни, където главното устройство може да комуникира с множество подчинени устройства, както и да получава данни от тях. Той е синхронен, тъй като главният генерира часовник в отделен вход / изход, който гарантира, че и двете устройства, главен и подчинен работят с една и съща тактова честота.
Протоколът SPI използва две линии за данни, една линия за избор и една линия на часовника. Връзките са SS (Slave Select), MISO (Master In Slave Out), MOSI (Master Out Slave In) и SCK (Serial Clock). Въпреки SCK линия, главният генерира часовник и SS се използва за избор на всеки отделен slave в шина линия, където множество slave устройства са свързани с главния. MISO се използва за получаване на данните от подчиненото устройство, а MOSI се използва за изпращане на данни от главното устройство към подчиненото устройство.
Преди това изградихме много проекти, които използват протокол SPI, за да комуникират между сензори, така че проверявайте тези, ако искате да научите малко повече по темата. Също така, ако искате да започнете с основите на платката Nuvoton N76E003, помислете дали да не проверите началните стъпки с nuvoton guide
Хардуерна настройка и изисквания за активиране на функцията SPI на N76E003
Целта на този проект е да се научи SPI комуникация с помощта на N76E003, а най-добрият начин е да настроите пример за SPI, в който прехвърляме съобщение между две микроконтролерни единици, за да направим това, ще използваме Arduino като подчинено устройство, което е свързан с линията N76E003 SPI. Ще изпратим данни на Arduino, ще ги потвърдим и ще ги отпечатаме с помощта на Arduinos UART. След това изпращаме данни от Arduino до N76E003, потвърждаваме ги и ги отпечатваме с помощта на N76E003 UART, поради което конвертор USB към UART за N76E003 и Arduino става необходим за нашето примерно приложение, ще използваме CP2102 UART към USB конвертор и Arduino Nano, за да изпълним нашите изисквания.
Да не говорим, освен горепосочените неща, ние се нуждаем от N76E003 базирана на микроконтролер платка за разработка, както и Nu-Link Programmer за програмиране на платката. В допълнение, кабелите berg се използват за всички хардуерни връзки.
Докато назад направихме някои статии като RS-485 MODBUS серийна комуникация с Arduino като главен и Arduino към Arduino Bluetooth комуникация с помощта на Master-Slave Configuration, където сме настроили Arduino като главно устройство, не се колебайте да проверите тези, ако това върховете ви лихва.
Верига към интерфейс
Както можем да видим в схемата, Arduino Nano е свързан със SPI на N76E003. Най-вляво е показана връзката на интерфейса за програмиране.
SPI щифтове на микроконтролера Nuvoton N76E003
ПИН диаграмата на N76E003 може да се види на изображението по-долу -
Както можем да видим в горната диаграма на щифтовете, всеки щифт има мултиплексирани функционални спецификации и всеки може да бъде програмиран в зависимост от приложението. Въпреки това, щифтове 0.1, 0.0, 1.0 и 1.5 се използват съответно като MISO, MOSI, SPCLK и SS щифтове. Ако активираме SPI, той ще загуби PWM и друга функционалност. Но това не е проблем, тъй като за този проект не се изисква друга функционалност. Този чип разглежда всички SPI щифтове като GPIO, поради което те трябва да бъдат конфигурирани. Методът за конфигуриране е описан по-долу.
Според листа с данни, PxM1.n и PxM2.n са два регистъра, които се използват за определяне на контролната операция на I / O порта. В таблицата с данни N76E003 е посочено, че за да се използва функционалността SPI, I / O режимите трябва да се използват като квази режим за SPI комуникации.
SPI информация N76E003
SPI периферията е задължителна функция за всеки микроконтролер, не само че е лесна за използване, но и може да постигне най -бързите скорости на трансфер сред много други общи протоколи за комуникация, поради което различните видове микроконтролери се предлагат с вградена периферна SPI.
Преди да продължите с SPI комуникацията, е важно да знаете няколко неща за SPI комуникацията на N7E003.
SS щифт на N76E003:
Това е важен щифт в SPI комуникацията. Пинът за избор на подчинени избира определени подчинени в SPI шина с няколко подчинени устройства. Всички отделни подчинени трябва да изискват един пин за избор на подчинени. Един SS щифт не може да бъде свързан с множество подчинени устройства.
Изображението по-долу показва възможните множество подчинени връзки -
Избор на MSB First или LSB First bit в N76E003:
N76E003 поддържа два вида комуникация на данни - първо MSB или първо LSB. По подразбиране първо се избира MSB. Първите данни на LSB обаче могат да бъдат избрани и в N76E003. Ние ще се погрижим за този избор в процеса на кодиране.
Простата SPI връзка с Single-Master и Single-Salve е показана на изображението по-долу -
SPI регистър за периферен контрол (SPCR) на N76E003:
SPI контролен регистър SPCR се използва за управление на SPI операциите.
Първите два бита са бита за избор на тактова честота SPI. Тактовите честоти са илюстрирани по-долу, когато системната честота е 16 Mhz.
CPHA бит е бит за избор на фаза на часовника. Ако е зададен флагът CPHA, данните се вземат на втория ръб на часовника SPI. Ако е изчистено, тогава данните се вземат на извадка на първия ръб. Следващият бит е CPOLI, което е неактивно ниво на часовника SPI. Ако е зададено на 0, часовникът ще бъде ниско в неактивно състояние, ако е зададено на 1, той ще бъде високо в неактивно състояние. MSTR е битът за разрешаване на главния режим, който се използва за конфигуриране на N76E003 като главен режим, като изчистването на този бит ще го превърне в робски режим. LSBFE се използва за посока на трансфер на данни. Изчистването на този бит ще направи прехвърлянето на данни първо като MSB, докато настройването му 1 ще активира LSB първата посока. SPIEN се използва за активиране на SPI. Настройка 1 ще активира периферната SPI. Крайният SSOE е битът за активиране на изхода SPI slave,и се използва за конфигуриране на SS щифта като общо предназначение или в автоматичен режим.
Освен горното, има и друг регистър, наречен Сериен регистър на периферния статус.
Горният регистър се използва за получаване на различното състояние на SPI.
Учителю
Основната функция е проста, тя ще инициира SPI периферията и UART, също така ще извика Start_Sending_SPI (); функция в цикъл while. Ако сте нови в използването на UART с Nuvoton, разгледайте свързания урок.
void main (void) {Set_All_GPIO_Quasi_Mode; InitialUART0_Timer1 (115200); / * 115200 скорост на предаване * / SPI_Initial (); printf ("\ nSPI Start Transmit… \ n"); while (1) // SPI предаване завършва {Start_Sending_SPI (); }}
Нека да разгледаме SPI_Initial (); функция.
void SPI_Initial (void) {P15_Quasi_Mode; // P15 (SS) Квази режим P10_Quasi_Mode; // P10 (SPCLK) Квази режим P00_Quasi_Mode; // P00 (MOSI) Квази режим P01_Quasi_Mode; // P22 (MISO) Квази режим set_DISMODF; // SS I / O с общо предназначение (No Mode Fault) clr_SSOE; clr_LSBFE; // MSB първо clr_CPOL; // Часовникът SPI е нисък в режим на празен ход set_CPHA; // Данните са
проба на втория ръб на часовника SPI.
set_MSTR; // SPI в главен режим SPICLK_DIV2; // Изберете SPI часовник Enable_SPI_Interrupt; // Активиране на SPI прекъсване set_SPIEN; // Активиране на функцията SPI}
Както е описано по-горе, пиновете на SPI порта трябва да бъдат конфигурирани и зададени като конфигурация Quasi, първият четириредов вътре в функцията SPI_Initial () прави точно това, конфигурацията за SPI е избрана като SS щифт с общо предназначение, данните ще се прехвърлят първо като MSB, SPI часовникът е нисък в режим на празен ход с вземане на проби от втори край. Тъй като N76E003 ще действа като Master режим, той е зададен като master. Прекъсването SPI се задава с бит SPIEN с активиран SPI. Всички тези функции са налични в заглавния файл SFR_Macro.h .
Във функцията Start_Sending_SPI () първо се изтегля SS щифта, данните се подават към Arduino чрез SPI. Регистърът SPDR ще съдържа стойността, която трябва да бъде изпратена на SPI slave, както и ще получи стойността от Slave.
void Start_Sending_SPI () {SS = 0; SPDR = 0x90; // Изпращане на 0x90 до Slave PCON - = SET_BIT0; // Влезте в режим на празен ход, ако (SPDR! = 0x4E) // Получаване на подчинен първи DATA SPI_Error (); printf ("\ nВръщане на роба% x \ n", SPDR & 0xFF); SS = 1; }
Съществува обаче условие за валидиране, при което стойността на SPRD се проверява с (0x4E), получена от Arduino. Ако данните не са 0x4E, те ще спрат SPI комуникацията, като влязат в цикъл while.
void SPI_Error (void) {printf ("\ nРобът спря изпращането на данни. \ n"); while (1) // SPI грешка и P0.7 флаш / {}}
Тъй като SPI, използван при прекъсване на таймера, тук се използва една функция ISR -
void SPI_ISR (void) прекъсване 9 // Vecotr @ 0x4B {clr_SPIF; Timer3_Delay10us (1); }
Той ще изчисти SPIF с 1 микросекунда времева разлика.
Програмиране
Arduino Nano също има същите SPI щифтове, показани на изображението по-долу -
Няма обаче да навлизаме в подробности за Arduino SPI, тъй като има много налични подробности, показващи как да се използва SPI на Arduino.
Първо, ние включваме всички необходими заглавка и променливи, #include
След това в раздела за настройка инициализираме UART, задаваме нашия предварително дефиниран MISO щифт като изход, активираме SPI в подчинен режим, задаваме нашата предварително дефинирана получена променлива като false и накрая активираме нашето прекъсване, което отбелязва края на контура за настройка.
void setup () {Serial.begin (115200); pinMode (MISO, OUTPUT); // Задава MISO като ИЗХОД (трябва да изпраща данни на Master IN SPCR - = _BV (SPE); // Включване на SPI в Slave Mode получено = false; SPI.attachInterrupt (); // Interuupt ON е зададен за SPI затихване}
След това дефинирахме нашата рутинна услуга за прекъсване, в рутинната услуга за прекъсвания изхвърляме данните от регистъра SPDR в нашата предварително дефинирана променлива Slavereceived , отпечатваме данните с помощта на вградените функции Serial.print и задаваме получената променлива на true.
В раздела за цикли изпращаме предварително дефинирана стойност към регистъра SPDR, веднъж на секунда, която предава данните към главния модул.
Тестване на SPI комуникация на Nuvoton с помощта на Arduino
Пълният код е даден в края на тази страница. Кодът при качване връща 0 предупреждения и 0 грешки и мига, използвайки метода на мигане по подразбиране от Keil. Приложението започва да работи.
Изграждане на цел 'SPI_INT_M' свързване… Размер на програмата: данни = 58,2 xdata = 0 код = 2402 създаване на шестнадесетичен файл от ". \ Output \ Master_P"… ". \ Output \ Master_P" - 0 Грешка (и), 0 Предупреждение (я). Изминало време на изграждане: 00:00:01 Обобщение на груповото изграждане: 1 успешно, 0 неуспешно, 0 пропуснато - Изминало време: 00:00:01
Използвал съм джъмперни проводници, за да свържа платката си nuvoton с Arduino, моята връзка за настройка на тестване е показана по-долу.
Изходът на UART може да се види на снимките по-долу. Когато отворим серийния монитор на Arduino, можем да видим стойностите от платката nuvoton, получени чрез SPI комуникация.
По същия начин, от страна на нувотона, използвахме термина tera за наблюдение на данните, които се получават от подчиненото (тук Arduino). По принцип изпращаме 90 от nuvoton до Arduino и изпращаме 4e00 от Arduino до nuvoton. От моментните снимки на серийния монитор става ясно, че и SPI master и slave работят както се очаква.
Можете да разгледате видеото, свързано по-долу, за пълната демонстрация на този урок. Надявам се, че статията ви е харесала и сте научили нещо полезно. Ако имате някакви въпроси, можете да ги оставите в раздела за коментари по-долу или да използвате нашите форуми, за да публикувате други технически въпроси.