- Ano ang I2C Communication Protocol?
- Paano gumagana ang I2C Communication?
- Saan Gagamitin ang Komunikasyon ng I2C?
- I2C sa Nuvoton N76E003 - Kinakailangan sa Hardware
- Ang interface ng AT24LC64 kasama ang Nuvoton N76E003 - Circuit Diagram
- I2C Pins sa Nuvoton N76E003
- Komunikasyon sa I2C sa N76E003
- Programming N76E003 para sa I2C Communication
- Flashing ang Code at ang Output
Sa malawak na sistema ng mga naka-embed na application, walang microcontroller ang maaaring gumanap ng lahat ng mga aktibidad nang mag-isa. Sa ilang yugto ng oras, kailangang makipag-usap sa iba pang mga aparato upang makapagbahagi ng impormasyon, maraming iba't ibang mga uri ng mga protocol ng komunikasyon upang maibahagi ang mga impormasyong ito, ngunit ang pinaka ginagamit ay USART, IIC, SPI, at CAN. Ang bawat komunikasyon protocol ay may sariling kalamangan at kawalan. Ituon natin ang bahagi ng IIC sa ngayon dahil iyan ang matututunan natin sa tutorial na ito. Kung bago ka dito, suriin ang Nuvoton Tutorials kung saan tinalakay ang bawat paligid ng N76E003 Microcontroller mula sa napaka pangunahing panimulang tutorial. Kung nais mong malaman kung paano gamitin ang I2C sa iba pang mga microcontroller, maaari mong suriin ang mga link sa ibaba.
- Paano gamitin ang I2C sa Arduino: Komunikasyon sa pagitan ng dalawang Arduino Boards
- Pakikipag-usap sa I2C sa PIC Microcontroller PIC16F877
- Ang pagitan ng 16X2 LCD na may ESP32 gamit ang I2C
- Komunikasyon sa I2C sa MSP430 Launchpad
- Ang interface ng LCD sa NodeMCU nang hindi ginagamit ang I2C
- Paano hawakan ang maraming mga komunikasyon (I2C SPI UART) sa isang solong programa ng Arduino
Ang I2C ay isang mahalagang protocol ng komunikasyon na binuo ng Philips (ngayon NXP). Gamit ang I2C protocol na ito, ang isang MCU ay maaaring konektado sa maraming mga aparato at simulan ang komunikasyon. Gumagana ang I2C na may dalawang wires lamang, katulad ng SDA at SCL. Kung saan ang SDA ay kumakatawan sa Serial data at ang SCL ay nangangahulugang Serial Clock. Gayunpaman, ang dalawang pin na ito ay nangangailangan ng mga resistors ng pull-up sa antas ng boltahe ng VCC at may sapat na resistor na pull-up, maaaring suportahan ng bus ang 127 na aparato na may isang natatanging address.
Ano ang I2C Communication Protocol?
Ang term na IIC ay nangangahulugang " Inter Integrated Circuits ". Karaniwan itong tinukoy bilang I2C o In-square ko ang C o kahit na bilang 2-wire interface protocol (TWI) sa ilang mga lugar ngunit pareho ang ibig sabihin nito. Ang I2C ay isang magkasabay na protocol ng komunikasyon na nangangahulugang, kapwa ang mga aparato na nagbabahagi ng impormasyon ay dapat magbahagi ng isang karaniwang signal ng orasan. Mayroon lamang itong dalawang wires upang magbahagi ng impormasyon kung saan alin ang ginagamit para sa signal ng orasan at ang isa pa ay ginagamit para sa pagpapadala at pagtanggap ng data.
Paano gumagana ang I2C Communication?
Ang komunikasyon ng I2C ay unang ipinakilala ni Phillips. Tulad ng sinabi nang mas maaga, mayroon itong dalawang mga wires, ang dalawang wires na ito ay maiugnay sa dalawang mga aparato. Dito ang isang aparato ay tinatawag na master at ang iba pang aparato ay tinatawag na alipin. Ang komunikasyon ay dapat at laging magaganap sa pagitan ng dalawa, isang Master at isang Alipin. Ang bentahe ng komunikasyon sa I2C ay ang higit sa isang alipin na maaaring konektado sa isang Master.
Ang kumpletong komunikasyon ay nagaganap sa pamamagitan ng dalawang wires na ito na, Serial Clock (SCL) at Serial Data (SDA).
Serial Clock (SCL): Ibinabahagi ang signal ng orasan na nabuo ng master sa alipin
Serial Data (SDA): Ipinapadala ang data papunta at mula sa pagitan ng Master at alipin.
Sa anumang naibigay na oras, ang master lamang ang maaaring makapagsimula ng komunikasyon. Dahil mayroong higit sa isang alipin sa bus, kailangang sumangguni ang master sa bawat alipin na gumagamit ng ibang address. Kapag tinugunan lamang ang salve sa partikular na address na iyon ay tutugon kasama ang impormasyon habang ang iba ay nananahimik. Sa ganitong paraan, maaari naming magamit ang parehong bus upang makipag-usap sa maraming mga aparato.
Saan Gagamitin ang Komunikasyon ng I2C?
Ang komunikasyon ng I2C ay ginagamit lamang para sa komunikasyon sa maikling distansya. Tiyak na maaasahan ito sa isang lawak dahil mayroon itong isang naka-synchronize na pulso ng orasan upang gawin itong matalino. Pangunahing ginagamit ang protokol na ito upang makipag-ugnay sa sensor o iba pang mga aparato na kailangang magpadala ng impormasyon sa isang master. Napaka-madaling gamiting kapag ang isang microcontroller ay kailangang makipag-usap sa maraming iba pang mga module ng alipin na gumagamit ng isang minimum na mga wire lamang. Kung naghahanap ka ng pangmatagalang komunikasyon, dapat mong subukan ang RS232 at kung naghahanap ka para sa mas maaasahang komunikasyon, dapat mong subukan ang SPI protocol.
I2C sa Nuvoton N76E003 - Kinakailangan sa Hardware
Tulad ng kinakailangan ng proyektong ito ay upang malaman ang komunikasyon ng I2C gamit ang N76E003, gagamit kami ng isang EEPROM na makakonekta sa linya ng data ng I2C. Mag-iimbak kami ng ilang data sa EEPROM at babasahin din ang pareho at ipakita ito gamit ang screen ng UART.
Tulad ng nakaimbak na halaga ay mai-print sa UART, ang anumang uri ng USB to UART converter ay kinakailangan. Maaari mo ring suriin ang tutorial sa UART kasama ang Nuvoton kung bago ka sa komunikasyon ng UART sa N76E003. Para sa aming aplikasyon, gagamitin namin ang CP2102 UART sa USB converter. Maliban sa nabanggit, kinakailangan din namin ang mga sumusunod na sangkap-
- EEPROM 24C02
- 2pcs 4.7k resistors
Hindi banggitin, bukod sa mga sangkap sa itaas, kailangan namin ng isang N76E003 microcontroller based development board pati na rin ang Nu-Link Programmer. Bilang karagdagan, kinakailangan din ang mga breadboard at hookup wire para sa pagkonekta sa lahat ng mga bahagi.
Ang interface ng AT24LC64 kasama ang Nuvoton N76E003 - Circuit Diagram
Tulad ng nakikita natin sa eskematiko sa ibaba, ang EEPROM ay konektado sa linya ng I2C kasama ang dalawang pull up resistors. Sa matinding kaliwa, ipinapakita ang koneksyon sa interface ng programa.
Gumamit ako ng isang breadboard para sa AT24LC64 IC at ikinonekta ang IC sa aking nuvoton programmer board gamit ang mga jumper wires. Ang aking pag-setup ng hardware kasama ang programmer ng nu-ink ay ipinapakita sa ibaba.
I2C Pins sa Nuvoton N76E003
Ang diagram ng pin ng N76E003 ay makikita sa larawan sa ibaba-
Tulad ng nakikita natin, ang bawat pin ay may iba't ibang mga pagtutukoy at ang bawat pin ay maaaring magamit para sa maraming layunin. Gayunpaman, ang pin 1.4 ay ginagamit bilang isang I2C SDA pin, mawawala ang PWM at iba pang pag-andar. Ngunit iyon ay hindi isang problema dahil ang isa pang pagpapaandar ay hindi kinakailangan para sa proyektong ito. Ang parehong bagay na mangyayari para sa P1.3 ay ang SCL pin ng I2C.
Dahil ang mga I2C pin ay kumikilos bilang isang GPIO, kailangan itong mai-configure. Ang lahat ng mga GPIO pin ay maaaring mai-configure sa mode na inilarawan sa ibaba.
Tulad ng datasheet, PxM1.n at PxM2. n ay dalawang rehistro na ginagamit upang matukoy ang pagpapatakbo ng kontrol ng I / O port. Sa datasheet, nakasaad na upang magamit ang pagpapaandar ng I2C, ang mga mode na I / O ay kailangang gamitin bilang Open-drain para sa mga komunikasyon na nauugnay sa I2C.
Komunikasyon sa I2C sa N76E003
Ang I2C peripheral ay isang mahalagang bagay para sa anumang yunit ng microcontroller na sumusuporta sa mga tampok ng I2C. Maraming mga uri ng iba't ibang mga microcontroller ay may isang nakapaloob na I2C paligid. Gayunpaman, sa ilang mga kaso, ang I2C ay maaaring mai-configure nang manu-mano gamit ang kontrol ng software kung saan ang magagamit na suporta sa hardware na may kaugnayan sa I2C ay hindi magagamit (Halimbawa, maraming 8051 microcontrollers). Gayunpaman, ang nuvoton N76E003 ay may kasamang I2C peripheral support.
Sinusuportahan ng M76E003 ang apat na uri ng pagpapatakbo sa mga mode ng I2C - Master Transmitter, Master Receiver, Slave Transmitter, at Slave Receiver. Sinusuportahan din nito ang pamantayan (100 kbps) at mabilis (hanggang sa 400bps) na bilis para sa linya ng I2C. Gumagana ang I2C na may ilang mga pangkalahatang panuntunan sa mga linya ng signal ng SCL at SDA.
Simula at Ihinto ang Kundisyon:
Ito ay isang mahalagang bagay sa komunikasyon ng I2C. Kapag ang data ay inilipat sa linya ng I2C, nagsisimula ito sa pagsisimula ng kundisyon at nagtatapos sa isang kundisyon ng paghinto.
Ang kondisyong panimula ay ang mataas-hanggang-mababang paglipat sa SDA kapag ang linya ng SCL ay mataas at ang kundisyon ng paghinto ay ang mababang-hanggang-mataas na paglipat sa SDA kapag ang linya ng SCL ay mataas. Ang dalawang kundisyong ito ay nabuo ng master (Ang MCU o anumang bagay na kumokontrol sa iba pang mga aparatong alipin). Ang linya ng bus ay mananatiling abala sa estado na ito kapag ang kundisyon sa pagsisimula ay pinasimulan at mananatiling malaya muli kapag ang kundisyon ng paghinto ay sinimulan.
Ang kundisyon ng Start at Stop ay mahusay na ipinakita sa pananaw ng signal sa N76E003 datasheet-
7-Bit Address na may Format ng Data:
Sinusuportahan ng N76E003 ang isang 7-bit na address at format ng data. Matapos mapasimulan ang kundisyon sa pagsisimula, kailangang ipadala ng master device ang data sa linya ng I2C. Ang unang data ay isang mahalagang isa. Kung ang data na ito ay hindi maayos na nilikha o nailipat, ang nakakonektang aparato ay hindi makikilala at ang karagdagang mga komunikasyon ay hindi maaaring gawin.
Ang data ay binubuo ng isang 7-bit na mahabang address ng alipin, na tinukoy bilang SLA. Ang 7-bit na haba ng address na ito ay kailangang maging natatangi para sa bawat aparato kung maraming mga aparato ang nakakonekta sa bus. Matapos ang 7-bit na address, ang ika-8 bit ay ang direksyon ng data na kaunti. Nangangahulugan iyon, depende sa ika-8 bit, nagpapadala ang master ng impormasyon sa aparato ng alipin tungkol sa kung ang data ay isusulat sa aparato ng alipin o ang data ay mababasa mula sa aparato ng alipin. Ang ika-8 bit ay ang R / W na bit na tinukoy bilang Magbasa o Sumulat ng nagbabatid. Tulad ng alam nating lahat na 8-bit na impormasyon ay maaaring 128 uri, kaya sinusuportahan ang 128 na aparato, ngunit sinusuportahan ng I2C ang 127 na uri ng mga aparato sa parehong bus ngunit hindi 128. Dahil ang 0x00 address ay isang nakareserba na address na kung saan ay tinatawag na isang pangkalahatang address ng tawag. Kung nais ng master na magpadala ng impormasyon sa lahat ng mga aparato,tatalakayin nito ang 0x00 at ang bawat aparato ay i-replay sa parehong paraan tulad ng bawat indibidwal na mga pagsasaayos ng software.
Kaya, ang paghahatid ng data ay mukhang sa ibaba-
Kilalanin:
Sa imahe ng address ng data sa itaas, ang ika-9 na bit na sinusundan ng R / W bit ay tinatawag na bit na kilalanin. Ito ay isang mahalagang dahil ang paggamit ng kaunting ito, ang master o alipin ay tumutugon sa data transmitter sa pamamagitan ng paghila ng mababang linya ng SDA. Upang makuha ang bit na kinikilala, kailangang palabasin ng transmiter ang linya ng SDA.
Programming N76E003 para sa I2C Communication
Ang kumpletong programa na ginamit sa tutorial na ito ay matatagpuan sa ilalim ng pahinang ito. Ang paliwanag ng mga mahahalagang segment sa code ay ang mga sumusunod-
Itakda ang mga Pins bilang Open Drain at I-configure ang mga ito para sa I2C:
Magsimula muna tayo sa seksyon ng I2C pin. Tulad ng inilarawan dati, ang I2C SCL at SDA port ay kailangang mai-configure at itakda bilang open-drain config. Upang magawa ito, gumagamit kami ng isang I2C.h header file kasama ang isang I2C.c source file . Ganito ang hitsura ng code snippet-
gawin ang {P13_OpenDrain_Mode; P14_OpenDrain_Mode; clr_I2CPX;} habang (0)
Ang code sa itaas ay itinatakda ang P13 at P14 bilang Open-Drain pin at clr_I2CPX ginagamit upang piliin ang P13 at P14 bilang SCL pin sa P1.3 at SDA pin sa P1.4.
Ang I2CPX na ito ay ang ika-0 na bit ng I2C control register I2CON. Kung ang I2C_PX na ito ay itinakda bilang 1, ang mga pin ay binago sa P0.2 bilang SCL at P1.6 bilang SDA. Gayunpaman, gagamitin namin ang P13 at P14. Hindi ginagamit ang mga alternatibong pin dito.
I2C Control Rehistro I2CON:
I2C control register I2CON ay ginagamit upang makontrol ang mga pagpapatakbo ng I2C. Ang unang bit ay ang pagpipilian ng pin ng I2C pin. Ang pagtatakda sa 0 na ito ay nag-configure sa I2C pin bilang P13 at P14.
Ang AA bit ay ang pamagat na iginigiit ng flag, kung ang flag ng AA ay itinakda, isang ACK ay ibabalik sa pagkilala sa pulso ng orasan ng linya ng SCL. Kung ito ay nabura, isang NACK (mataas na antas sa SDA) ay ibabalik sa panahon ng kinikilalang pulso ng orasan ng linya ng SCL.
Ang susunod na bit ay SI na kung saan ay nagambala ang katayuan ng I2C. Kung pinagana ang Status ng I2C Interrupt, dapat suriin ng gumagamit ang rehistro ng I2STAT upang matukoy kung aling hakbang ang naipasa at dapat gawin ang aksyon.
Ang STO ay ang flag ng STOP na itinakda sa master mode. Ang STO ay awtomatikong na-clear ng hardware sa sandaling ang kondisyon ng STOP ay napansin.
Ang susunod na bit ay ang STA bit. Kung nakatakda ang watawat na ito, bumubuo ang I2C ng isang kundisyong SIMULA kung libre ang bus. Kung ang bus ay abala, naghihintay ang I2C para sa isang kundisyon ng STOP at bumubuo ng isang sumusunod na kundisyon sa pagsisimula. Kung ang STA ay nakatakda habang ang I2C ay nasa master mode at ang isa o higit pang mga byte ay naipadala o natanggap, ang I2C ay bumubuo ng isang paulit-ulit na kundisyon ng SIMULA. Ang STA ay kailangang ma-clear nang manu-mano ng software.
Ang huling, I2CEN ay ang I2C bus paganahin o huwag paganahin ang bit.
EEPROM 24C02:
Ngayon, darating sa 24C02. Ang pakete ng suporta ng board ng N76E003 ay may isang I2C code para sa 24LC64 at madaling mabago. Gayunpaman, gagamit kami ng isang simpleng pamamaraan upang maunawaan ang pagpapaandar ng I2C.
Kung nais ng sinumang gumamit ng detalyadong pag-interfacing sa EEPROM 24C02, maaaring magamit ang program na EEPROM sa BSP.
Ikonekta lamang namin ang 24C02 sa I2C kung saan ang N76E003 ay magiging master at ang EEPROM ay magiging alipin. Sa gayon, magsusulat kami ng anumang data sa EEPROM address at magbasa ng pareho.
Ang 24C02 EEPROM pinout ay ipinapakita sa ibaba-
Ang A0, A1, at A2 ay tatlong mga pin ng pagpili ng address. Ang mga pin ng WP ay Isulat ang mga pin na protektahan at kailangang maiugnay sa VSS para sa pagpapagana ng pagsusulat sa EEPROM.
Ang pagpapaandar ng Byte Writing ay ipinapakita sa larawan sa ibaba-
Ang buong siklo ng pagsulat ay nangyayari sa isang pagsisimula nang kaunti. Pagkatapos nito, kailangang isumite ang byte ng Control. Sa control byte, ang mga sumusunod na bagay ay kinakailangan-
Matapos ang bit ng pagsisimula, binubuo ng address ng alipin. Ang 1010 ay ang static at A0, A1, at A2 ang address na batay sa koneksyon ng hardware. Kung ang tatlong mga pin ay konektado sa supply ng GND o VSS, mababasa ito bilang 0. Kung hindi man, kung nakakonekta sa VCC, mababasa ito bilang 1. Sa aming kaso, lahat ng A0, A1, at A2 ay konektado sa VSS. Sa gayon ang lahat ng ito ay magiging 0.
Paggastos sa kundisyon ng pagbasa o pagsulat. Ang halaga ng address na may Basahin o Isulat na bit ay magiging - 0xA0 para sa Sumulat at 0xA1 para sa pagbabasa. Susunod ay ang bit ng Pagkilala at pagkatapos nito, isang 8-bit na address ang maililipat kung saan kailangang maiimbak ang data at sa wakas, ang data na maiimbak sa kani-kanilang lokasyon. Ang mga bagay na ito ay ginagawa sa isang sunud-sunod na format sa pangunahing pag-andar.
Pangunahing Pag-andar at Habang Loop:
void main (void) {char c = 0x00; InitialUART0_Timer3 (115200); TI = 1; // Mahalaga, gamitin ang pagpapaandar ng prinft ay dapat itakda TI = 1; I2C_init (); habang (1) {EEPROM_write (1,0x55); c = EEPROM_read (1); printf ("\ n Ang binasang halaga ay% x", c & 0xff); }; }
Ang pangunahing pagpapaandar ay simple, ito ay patuloy na pagsusulat ng mga halaga sa EEPROM sa address 1 at pagbabasa ng data. Pagkatapos ay nai-print ang data gamit ang pagpapaandar na printf. Ang printf ay naglilimbag ng halaga sa hex.
Ang pagpapaandar ng pagsulat ng EEPROM ay binubuo ng mga sumusunod na bagay na inilarawan sa seksyon ng EEPROM-
void EEPROM_write (unsigned char address, unsigned char halaga) {I2C_start (); I2C_write (0xA0); I2C_write (address); I2C_write (halaga); I2C_stop (); }
Ang pagpapaandar ng I2C ay binubuo ng mga sumusunod na bagay-
walang bisa I2C_start (void) {sign int time = timeout; itakda_STA; clr_SI; habang ((SI == 0) && (oras> 0)) {oras--; }; }
Sa pagpapaandar na ito, ang katayuang SI ay nasusuri kasama ang paunang natukoy na tagal ng oras ng pag-timeout (tinukoy sa I2C.h kung saan ang paunang natukoy na oras ay itinakda bilang 1000). Nagsisimula ang pagpapaandar sa pagsisimula sa pagtatakda ng STA at pag-clear ng SI.
walang bisa I2C_stop (walang bisa) {sign int time = timeout; clr_SI; itakda_STO; habang ((STO == 1) && (oras> 0)) {oras--; }; }
Kapareho ng pagsisimula, pag-andar ng stop ay ginagamit. Ang pagpapaandar na hintuan ay pinasimulan sa pamamagitan ng pag-set up ng STO na sinusundan ng pag-clear sa SI. Sa ibaba ang pag-andar ay ang I2C read function-
unsigned char I2C_read (unsigned char ack_mode) {sign int time = timeout; unsigned char halaga = 0x00; itakda_AA; clr_SI; habang ((SI == 0) && (t> 0)) {oras--; }; halaga = I2DAT; kung (ack_mode == I2C_NACK) {t = timeout_count; clr_AA; clr_SI; habang ((SI == 0) && (t> 0)) {oras--; }; } halaga ng pagbalik; }
Ang ack_mode at I2C_NACK , parehong tinukoy sa I2C header file bilang 0 at 1 ayon sa pagkakabanggit.
Katulad nito, nilikha ang function ng pagsulat-
walang bisa I2C_write (unsigned char halaga) {sign int time = timeout; I2DAT = halaga; clr_STA; clr_SI; habang ((SI == 0) && (oras> 0)) {oras--; }; }
Flashing ang Code at ang Output
Ang code ay nagbalik ng 0 babala at 0 Mga Error at na-flash gamit ang default na flashing na pamamaraan ng Keil. Kung bago ka, suriin ang pagsisimula sa nuvoton tutorial upang maunawaan kung paano mag-upload ng code. Ang pag-iipon ng impormasyon ng code ay matatagpuan sa ibaba.
Bumuo ng target na 'I2C_EEPROM' na nag-iipon ng I2C_EEPROM.c… nag-iisa ng I2C.c… nagli-link… Laki ng Program: data = 59.2 xdata = 0 code = 2409 lumilikha ng hex file mula sa ". \ Output \ I2C_EEPROM"… ". \ Output \ I2C_EEPROM "- 0 Error, 0 Mga Babala. Lumipas ang Oras ng Build: 00:00:04 Buod ng Batch-Build: 1 ang nagtagumpay, 0 nabigo, 0 nilaktawan - Oras na Lumipas: 00:00:04
Ang hardware ay na-set up sa isang breadboard at gumagana tulad ng inaasahan. Tulad ng nakikita mo sa imahe sa ibaba, nagsulat kami ng isang halaga sa EEPROM at basahin ito pabalik mula sa memorya at ipakita ito sa serial monitor.
Suriin ang video na ibinigay sa ibaba para sa isang kumpletong pagpapakita kung paano gumagana ang board para sa code na ito. Inaasahan kong nasiyahan ka sa tutorial at natutunan ang isang bagay na kapaki-pakinabang kung mayroon kang anumang mga katanungan, iwanan ang mga ito sa seksyon ng komento sa ibaba. Maaari mo ring gamitin ang aming mga forum upang mag-post ng iba pang mga teknikal na katanungan.