- Какво е I2C протокол за комуникация?
- Как работи I2C комуникацията?
- Къде да използвам I2C комуникация?
- I2C на Nuvoton N76E003 - Хардуерно изискване
- Взаимодействие AT24LC64 с Nuvoton N76E003 - Електрическа схема
- I2C щифтове на Nuvoton N76E003
- I2C комуникация в N76E003
- Програмиране N76E003 за I2C комуникация
- Мигане на кода и изхода
В обширната система от вградени приложения никой микроконтролер не може да изпълнява всички дейности сам. На даден етап от времето той трябва да комуникира с други устройства, за да споделя информация, има много различни видове комуникационни протоколи за споделяне на тази информация, но най-използваните са USART, IIC, SPI и CAN. Всеки комуникационен протокол има своите предимства и недостатъци. Нека се съсредоточим върху IIC частта засега, тъй като това ще научим в този урок. Ако сте нов тук, разгледайте уроците на Nuvoton, където обсъдихме всяка периферия на микроконтролера N76E003 от най-основния урок за започване. Ако искате да научите как да използвате I2C с други микроконтролери, можете да разгледате връзките по-долу.
- Как да използвам I2C в Arduino: Комуникация между две платки Arduino
- I2C комуникация с PIC микроконтролер PIC16F877
- Свързване на 16X2 LCD с ESP32 чрез I2C
- I2C комуникация с MSP430 Launchpad
- Взаимодействие на LCD с NodeMCU без използване на I2C
- Как да боравим с много комуникации (I2C SPI UART) в една програма на Arduino
I2C е важен комуникационен протокол, разработен от Philips (сега NXP). Използвайки този протокол I2C, MCU може да бъде свързан с множество устройства и да започне комуникация. I2C работи само с два проводника, а именно SDA и SCL. Когато SDA означава серийни данни, а SCL означава сериен часовник. Тези два щифта обаче изискват издърпващи резистори до нивото на напрежение VCC и с подходящ издърпващ резистор, шината може да поддържа 127 устройства с уникален адрес.
Какво е I2C протокол за комуникация?
Терминът IIC означава „ Интер интегрални схеми “. Обикновено се обозначава като I2C или I на квадрат C или дори като двупроводен интерфейсен протокол (TWI) на някои места, но всичко означава едно и също. I2C е синхронен комуникационен протокол, което означава, че и двете устройства, които споделят информацията, трябва да споделят общ тактов сигнал. Той има само два проводника за споделяне на информация, от които единият се използва за тактовия сигнал, а другият се използва за изпращане и получаване на данни.
Как работи I2C комуникацията?
I2C комуникацията е представена за първи път от Филипс. Както беше казано по-рано, той има два проводника, тези два проводника ще бъдат свързани през две устройства. Тук едното устройство се нарича master, а другото устройство се нарича slave. Комуникацията трябва и винаги ще се осъществява между двама, господар и роб. Предимството на I2C комуникацията е, че повече от един slave може да бъде свързан към Master.
Пълната комуникация се осъществява чрез тези два проводника, а именно, сериен часовник (SCL) и сериен данни (SDA).
Сериен часовник (SCL): Споделя сигнала на часовника, генериран от главното устройство, с подчинения
Серийни данни (SDA): Изпраща данните към и между главния и подчинения.
Във всеки един момент само майсторът ще може да инициира комуникацията. Тъй като в шината има повече от един slave, капитанът трябва да се обърне към всеки slave, използвайки различен адрес. Когато бъде адресиран, само салвеят с този конкретен адрес ще отговори с информацията, докато останалите мълчат. По този начин можем да използваме една и съща шина за комуникация с множество устройства.
Къде да използвам I2C комуникация?
I2C комуникацията се използва само за комуникация на къси разстояния. Със сигурност е надежден до известна степен, тъй като има синхронизиран импулс на часовника, за да го направи умен. Този протокол се използва главно за комуникация със сензора или други устройства, които трябва да изпращат информация до главен. Много е удобно, когато микроконтролерът трябва да комуникира с много други подчинени модули, използвайки минимум само проводници. Ако търсите комуникация на дълги разстояния, трябва да опитате RS232, а ако търсите по-надеждна комуникация, трябва да опитате протокола SPI.
I2C на Nuvoton N76E003 - Хардуерно изискване
Тъй като изискването на този проект е да се научи I2C комуникация чрез N76E003, ние ще използваме EEPROM, който ще бъде свързан с линията за данни I2C. Ще съхраним някои данни в EEPROM и също ще ги прочетем и ще ги покажем с помощта на екрана UART.
Тъй като съхранената стойност ще бъде отпечатана в UART, е необходим всякакъв вид USB към UART конвертор. Можете също да разгледате урока по UART с Nuvoton, ако сте нов в UART комуникацията на N76E003. За нашето приложение ще използваме CP2102 UART към USB конвертор. Освен горното, ние също изискваме следните компоненти -
- EEPROM 24C02
- 2бр 4.7k резистори
Да не говорим, освен горепосочените компоненти, се нуждаем от N76E003 базирана на микроконтролер платка за разработка, както и от Nu-Link Programmer. Освен това за свързване на всички компоненти са необходими и макетни плочи и кабели за свързване.
Взаимодействие AT24LC64 с Nuvoton N76E003 - Електрическа схема
Както можем да видим на схемата по-долу, EEPROM е свързан в линията I2C заедно с два издърпващи резистора. Най-вляво е показана връзката на интерфейса за програмиране.
Използвах платка за интегрална схема AT24LC64 и свързах интегралната схема към платката си за програмиране на nuvoton, използвайки джъмперни проводници. Моята хардуерна настройка заедно с nu-ink програмист е показана по-долу.
I2C щифтове на Nuvoton N76E003
ПИН диаграмата на N76E003 може да се види на изображението по-долу -
Както виждаме, всеки щифт има различни спецификации и всеки щифт може да се използва за множество цели. Въпреки това, пин 1.4 се използва като I2C SDA щифт, той ще загуби PWM и друга функционалност. Но това не е проблем, тъй като за този проект не се изисква друга функционалност. Същото нещо ще се случи за P1.3 е SCL щифтът на I2C.
Тъй като I2C щифтовете действат като GPIO, той трябва да бъде конфигуриран. Всички GPIO щифтове могат да бъдат конфигурирани в описания по-долу режим.
Според листа с данни, PxM1.n и PxM2. n са два регистъра, които се използват за определяне на контролната работа на I / O порта. В листа с данни е посочено, че за да се използва I2C функционалността, режимите на I / O трябва да се използват като Open-drain за I2C комуникации.
I2C комуникация в N76E003
I2C периферията е важно нещо за всеки микроконтролер, който поддържа I2C функции. Много видове различни микроконтролери се доставят с вградена I2C периферия. В някои случаи обаче I2C може да бъде конфигуриран ръчно, като се използва софтуерен контрол, при който хардуерната поддръжка, свързана с I2C, не е налична (например много 8051 микроконтролери). Nuvoton N76E003 обаче се предлага с I2C периферна поддръжка.
M76E003 поддържа четири вида операции в I2C режими - главен предавател, главен приемник, подчинен предавател и подчинен приемник. Той също така поддържа стандартни (100kbps) и бързи (до 400kbps) скорости за линията I2C. I2C работи с няколко общи правила в сигналните линии SCL и SDA.
Условие за стартиране и спиране:
Това е важно нещо в I2C комуникацията. Когато данните се прехвърлят към линията I2C, те започват със състояние начало и завършват със състояние стоп.
Условието за стартиране е преходът от високо към ниско на SDA, когато линията SCL е висока, а условието за спиране е преходът от ниско към високо на SDA, когато линията SCL е висока. Тези две условия се генерират от главното устройство (MCU или каквото и да е, което контролира останалите подчинени устройства). Автобусната линия остава заета в това състояние, когато се стартира условието за стартиране и остава свободна отново, когато се стартира условието за спиране.
Състоянието Start and Stop е отлично показано в перспективата на сигнала в таблицата с данни N76E003-
7-битов адрес с формат на данните:
N76E003 поддържа 7-битов формат за адрес и данни. След стартиране на условието за стартиране, главното устройство трябва да изпрати данните към линията I2C. Първите данни са важни. Ако тези данни не са правилно създадени или предадени, свързаното устройство няма да бъде идентифицирано и не могат да бъдат осъществени допълнителни комуникации.
Данните се състоят от 7-битов дълъг подчинен адрес, обозначен като SLA. Този 7-битов дълъг адрес трябва да бъде уникален за всяко устройство, ако в шината са свързани множество устройства. След 7-битовия адрес, 8-ми бит е битът за посока на данните. Това означава, че в зависимост от 8-ми бит, главният изпраща информацията на подчиненото устройство за това дали данните ще бъдат записани в подчиненото устройство или данните ще бъдат прочетени от подчиненото устройство. 8-ми бит е R / W битът, посочен като Уведомяване за четене или запис. Както всички знаем, 8-битовата информация може да бъде 128 вида, като по този начин поддържа 128 устройства, но I2C поддържа 127 вида устройства на една и съща шина, но не и 128. Тъй като адресът 0x00 е запазен адрес, който се нарича общ адрес за повикване. Ако капитанът иска да изпрати информация до всички устройства,той ще адресира 0x00 и всяко устройство ще се възпроизведе по същия начин, както според индивидуалните конфигурации на софтуера.
По този начин предаването на данни изглежда по-долу -
Потвърдете:
В горното изображение с адрес на данни, 9-ият бит, последван от R / W бита, се нарича бит за потвърждение. Това е важно, тъй като използвайки този бит, главният или подчиненият реагира на предавателя на данни, като дърпа SDA линията ниско. За да получи бита за потвърждение, предавателят трябва да освободи линията SDA.
Програмиране N76E003 за I2C комуникация
Цялата програма, използвана в този урок, може да бъде намерена в долната част на тази страница. Обяснението на важни сегменти в кода е както следва -
Задайте щифтове като Open Drain и ги конфигурирайте за I2C:
Нека първо започнем с I2C секцията с щифтове. Както е описано по-горе, портовете I2C SCL и SDA трябва да бъдат конфигурирани и зададени като конфигурация с отворен източник. За да направите това, ние сме с помощта на I2C.h заглавния файл , заедно с източник файл I2C.c . Кодовият фрагмент изглежда така-
направете {P13_OpenDrain_Mode; P14_OpenDrain_Mode; clr_I2CPX;} докато (0)
Горният код задава P13 и P14 като щифт с отворен източник, а clr_I2CPX се използва за избор на P13 и P14 като SCL щифт на P1.3 и SDA щифт на P1.4.
Този I2CPX е 0- ият бит на контролния регистър I2C I2CON. Ако този I2C_PX е зададен като 1, щифтовете се променят на P0.2 като SCL и P1.6 като SDA. Ние обаче ще използваме P13 и P14. Тук не се използват алтернативни щифтове.
I2C контролен регистър I2CON:
I2C контролен регистър I2CON се използва за управление на I2C операциите. Първият бит е битът за избор на I2C пин. Задаването на 0 конфигурира I2C щифта като P13 и P14.
AA бит е флагът за потвърждаване на потвърждение, ако флагът на AA е зададен, ACK ще бъде върнат по време на импулса на часовника за потвърждение на линията SCL. Ако се изчисти, ще се върне NACK (високо ниво на SDA) по време на потвърдения тактов импулс на линията SCL.
Следващият бит е SI, което е прекъсването на състоянието I2C. Ако прекъсването на състоянието на I2C е разрешено, потребителят трябва да провери регистъра I2STAT, за да определи коя стъпка е преминала и трябва да предприеме действието.
STO е флагът STOP, който се задава в главен режим. STO се изчиства автоматично от хардуера, след като бъде открито условието STOP .
Следващият бит е STA битът. Ако този флаг е зададен, тогава I2C генерира състояние START, ако шината е свободна. Ако шината е заета, I2C изчаква състояние STOP и генерира след това състояние START. Ако STA е зададена, докато I2C вече е в главен режим и един или повече байта са били предадени или приети, I2C генерира повторно състояние START. STA трябва да се изчисти ръчно от софтуера.
Последният, I2CEN, е битът за активиране или деактивиране на I2C шината.
EEPROM 24C02:
Сега, стигайки до 24C02. Пакетът за поддръжка на платката на N76E003 има I2C код за 24LC64 и може лесно да бъде модифициран. Ние обаче ще използваме прост метод, за да разберем функцията I2C.
Ако някой иска да използва подробно взаимодействие с EEPROM 24C02, тогава може да се използва програмата EEPROM в BSP.
Ще свържем само 24C02 в I2C, където N76E003 ще бъде главен, а EEPROM ще бъде подчинен. По този начин ще запишем всички данни в EEPROM адреса и ще прочетем същото.
24C02 EEPROM пиноут е показан по-долу -
A0, A1 и A2 са три щифта за избор на адрес. WP щифтовете са щифтове за защита от запис и трябва да бъдат свързани с VSS, за да се даде възможност за записване в EEPROM.
Функцията за запис на байт е показана на изображението по-долу -
Пълният цикъл на запис се случва със стартов бит. След това трябва да бъде изпратен контролния байт. В контролния байт се изискват следните неща -
След началния бит се състои от подчинения адрес. 1010 е статичният, а A0, A1 и A2 са адресът, базиран на хардуерната връзка. Ако трите щифта са свързани с GND или VSS захранване, той ще се чете като 0. В противен случай, ако е свързан с VCC, ще се чете като 1. В нашия случай всички A0, A1 и A2 са свързани с VSS. По този начин всичко това ще бъде 0.
Разходи за условията за четене или запис. Стойността на адреса с бита за четене или запис ще бъде - 0xA0 за запис и 0xA1 за четене. Следва битът за потвърждение и след това ще бъде предаден 8-битов адрес, където данните трябва да се съхраняват и накрая данните, които ще се съхраняват на съответното място. Тези неща се извършват във формат стъпка по стъпка в основната функция.
Основна функция и цикъл на движение:
void main (void) {char c = 0x00; InitialUART0_Timer3 (115200); TI = 1; // Важно е, използвайте функцията prinft, трябва да зададете TI = 1; I2C_init (); докато (1) {EEPROM_write (1,0x55); c = EEPROM_read (1); printf ("\ n Прочетената стойност е% x", c & 0xff); }; }
Основната функция е проста, тя непрекъснато записва стойности в EEPROM на адрес 1 и чете данните. След това данните се отпечатват с помощта на функцията printf. Printf отпечатва стойността в шестнадесетичен.
Функцията за запис на EEPROM се състои от следните неща, които са описани в раздела за EEPROM-
void EEPROM_write (неподписан адрес на знак, неподписана стойност на знака) {I2C_start (); I2C_write (0xA0); I2C_write (адрес); I2C_write (стойност); I2C_stop (); }
Функцията за стартиране на I2C се състои от следните неща -
void I2C_start (void) {подписан int time = timeout; set_STA; clr_SI; while ((SI == 0) && (time> 0)) {time--; }; }
В тази функция състоянието на SI се проверява заедно с предварително зададения период на изчакване (дефиниран в I2C.h, където предварително зададеното време е зададено като 1000). Функцията за стартиране започва с настройка на STA и изчистване на SI.
void I2C_stop (void) {подписан int time = timeout; clr_SI; set_STO; while ((STO == 1) && (time> 0)) {time--; }; }
Подобно на функцията Start, Stop се използва. Функцията стоп се инициира чрез настройване на STO, последвано от изчистване на SI. Функцията по-долу е функцията за четене I2C -
неподписан char I2C_read (неподписан char ack_mode) {подписан int time = timeout; неподписана стойност на знака = 0x00; set_AA; clr_SI; докато ((SI == 0) && (t> 0)) {time--; }; стойност = I2DAT; if (ack_mode == I2C_NACK) {t = timeout_count; clr_AA; clr_SI; докато ((SI == 0) && (t> 0)) {time--; }; } върната стойност; }
В ack_mode и I2C_NACK , както са дефинирани в глава файл I2C като 0 и 1, съответно.
По същия начин се създава функцията за запис-
void I2C_write (неподписана стойност на символа) {подписан int time = timeout; I2DAT = стойност; clr_STA; clr_SI; while ((SI == 0) && (time> 0)) {time--; }; }
Мигане на кода и изхода
Кодът връща 0 предупреждения и 0 грешки и е мигащ, използвайки метода на мигане по подразбиране от Keil. Ако сте нов, вижте начинаещи уроци с nuvoton, за да разберете как да качите код. Информацията за компилиране на кода може да бъде намерена по-долу.
Изграждане на цел „I2C_EEPROM“, компилиране на I2C_EEPROM.c… компилиране на I2C.c… свързване… Размер на програмата: data = 59,2 xdata = 0 code = 2409 създаване на шестнадесетичен файл от „. \ Output \ I2C_EEPROM"… ". \ Изход \ I2C_EEPROM "- 0 Грешка (и), 0 Предупреждение (я). Изминало време на изграждане: 00:00:04 Обобщение на груповото изграждане: 1 успешно, 0 неуспешно, 0 пропуснато - Изминало време: 00:00:04
Хардуерът се настройва на макет и работи според очакванията. Както можете да видите на изображението по-долу, успяхме да напишем стойност в EEPROM и да я прочетем обратно от паметта и да я покажем на серийния монитор.
Вижте видеото, дадено по-долу, за пълна демонстрация на това как работи платката за този код. Надявам се, че ви е харесал урокът и сте научили нещо полезно, ако имате въпроси, оставете ги в раздела за коментари по-долу. Можете също да използвате нашите форуми, за да публикувате други технически въпроси.