Տվյալների փոխանցման գործառույթներ՝ օգտագործելով spi. Սերիական ինտերֆեյս SPI. SPI-ի վրա հիմնված կապի համակարգերի տոպոլոգիա
Այս հոդվածում ես ուզում եմ կարճ ակնարկ SPI ավտոբուս (ինտերֆեյս, որը լայնորեն օգտագործվում է ներկառուցված տեխնոլոգիայի մեջ, որն օգտագործվում է միանալու համար տարբեր սարքեր) և ես կփորձեմ նկարագրել Linux-ի համար SPI սարքի արձանագրության մակարդակի դրայվեր ստեղծելու գործընթացը։ Այս փաստաթուղթըդերի համար չի դիմում ամբողջական ուղեցույց, այլ ավելի շուտ նպատակ ունի ցույց տալ ճիշտ ուղղությամբ: Քանի որ հոդվածը ներառված չէր մեկ թեմայի չափի մեջ, ես ստիպված էի այն բաժանել երկու մասի։
0. Ներկայացնելու փոխարեն
Ինչ է այս հոդվածը:Այս հոդվածը տարբեր աղբյուրներից ստացված տեղեկատվության հավաքածու է, փաստաթղթերի որոշ մասերի անվճար թարգմանություն, ինչպես նաև իմ սեփական մեկնաբանությունները, լրացումները և առաջացած խնդիրների նկարագրությունը:
Ո՞ւմ համար է այս հոդվածը:
Առաջին հերթին, սկսնակների համար, որը ես եմ: Ներկառուցված Linux ֆորումներում հաճախ կարող եք հանդիպել հարցի. «Ինչպե՞ս կարող եմ աշխատել SPI-ի հետ այս տախտակի վրա»: Հենց դրան էլ կփորձեմ պատասխանել։ Որպես օրինակ՝ ես կտամ իմ փորձնական SPI սարքի հետ աշխատելու համար գրված կոդը։
Հոդվածի կառուցվածքը
Հաշվի առնելով այն հանգամանքը, որ տեղեկատվությունը շատ էր, հոդվածը բաժանված է մի քանի ենթաբաժնիների.
- Ի՞նչ է SPI-ն:
- SPI ենթահամակարգի ակնարկ Linux-ում
- Userspace արձանագրության SPI վարորդի մշակում, օգտագործելով spidev
- Արձանագրության SPI միջուկի մակարդակի վարորդի մշակում
- Փաստաթղթեր
Առաջին ենթաբաժինը նկարագրում է SPI ավտոբուսի աշխատանքը, հոդվածի այս հատվածը հատուկ կապված չէ Linux-ի հետ, ուստի այն կարող է կարդալ նրանք, ովքեր հետաքրքրված չեն Linux-ով, բայց դուք պարզապես պետք է տեղեկատվություն ստանաք այս ինտերֆեյսի մասին:
Երկրորդ ենթաբաժինը նկարագրում է Linux-ում SPI-ի հետ աշխատանքի հիմքում ընկած կառուցվածքներն ու մեխանիզմները, այն պետք է կարդալ՝ հասկանալու համար, թե ինչ է քննարկվելու երրորդ և չորրորդ մասերում։
Եթե ձեզ չեն հետաքրքրում իմ թարգմանություններն ու հավելումները, կարող եք հանգիստ անցնել ուղիղ հինգերորդ մաս, որտեղ կարող եք գտնել տեղեկատվություն, թե որտեղից կարելի է ստանալ բոլոր անհրաժեշտ տեղեկությունները այս հարցի վերաբերյալ:
Սխալներ
Ես հրաշագործ չեմ, ես պարզապես սովորում եմ: Եթե գտնում եք որևէ սխալ կամ անճշտություն, խնդրում եմ տեղեկացնել ինձ:
1. Ի՞նչ է SPI-ն:
SPI հապավումը նշանակում է «Սերիական ծայրամասային ինտերֆեյս» կամ ռուսերեն տարբերակով «սերիալ ծայրամասային ինտերֆեյս«. Անունն ինքնին խոսում է տրված ինտերֆեյսօգտագործվում էր տարբեր ծայրամասային սարքեր. Օրինակ, դրանք կարող են լինել տարբեր DAC/ADC-ներ, պոտենցիոմետրեր, սենսորներ, մուտքային/ելքային (GPIO) ընդլայնիչներ, տարբեր հիշողություններ և նույնիսկ ավելի բարդ ծայրամասային սարքեր, ինչպիսիք են աուդիո կոդեկները և Ethernet կարգավորիչները:Տեխնիկական տեսանկյունից SPI-ն համաժամանակյա չորս լարային ավտոբուս է: Այն երկու սինխրոն հերթափոխ ռեգիստրների միացում է, որը ցանկացած SPI սարքի կենտրոնական տարրն է։ Կապը օգտագործում է վարպետ/ստրուկ կոնֆիգուրացիա: Միայն վարպետը կարող է ժամացույցի իմպուլսներ առաջացնել: Շղթայում միշտ կա միայն մեկ վարպետ (ի տարբերություն նույն I2C ավտոբուսի, որտեղ հնարավոր է տարբերակ մեկից ավելի վարպետներով), ստրուկների թիվը կարող է տարբեր լինել: IN ընդհանուր դեպք Master-ի ելքը միացված է ստրուկի մուտքին, և հակառակը՝ ստրուկի ելքը միացված է վարպետի մուտքին։ Երբ ժամացույցի իմպուլսները կիրառվում են SCK ելքի վրա, տվյալները մղվում են վարպետի կողմից MOSI ելքից և գրավում ստրուկը MISO մուտքի միջոցով: Այսպիսով, եթե դուք կիրառեք համաժամացման իմպուլսների քանակը, որը համապատասխանում է հերթափոխի ռեգիստրի բիթային լայնությանը, ապա ռեգիստրներում տվյալները կփոխանակվեն: Սրանից հետևում է, որ SPI-ն միշտ աշխատում է լրիվ դուպլեքս ռեժիմով։ Բայց արդյոք մեզ անհրաժեշտ են սարքից ստացված տվյալները պարամետր ձայնագրելիս, սա այլ հարց է։ Հաճախ է պատահում, որ սարքից ստացված տվյալները դրա վրա տվյալներ գրելիս աղբ են, որի դեպքում դրանք պարզապես անտեսվում են, բայց մենք դրանք կստանանք անկախ մեր ցանկությունից։
SPI կարգավորիչը սովորաբար իրականացվում է ծայրամասային սարքի կողմից MCU-ում կամ eMPU-ում: Չիպերի մեծ մասում այն կարող է աշխատել ինչպես հիմնական, այնպես էլ ստրուկ ռեժիմներում: Բայց վրա այս պահին Linux-ն աջակցում է միայն հիմնական ռեժիմին:
SPI սարքերը միացնելու մի քանի եղանակ կա:
Դրանցից ամենապարզը կարող եք տեսնել վերևի նկարում (շնորհիվ Վիքիպեդիայի՝ անվճար GFDL լիցենզիայի ներքո նկարների համար): Այս դեպքում բոլոր ստրուկները միացված են վարպետին զուգահեռ, բացառությամբ ստրուկի ընտրության ազդանշանի (~CS): Յուրաքանչյուր ստրուկ պահանջում է առանձին ստրուկի ընտրության ազդանշան (նկարում դրանք պիտակավորված են SSx): Slave select ազդանշանների համար կարող են օգտագործվել և՛ հատուկ SPI կարգավորիչի ելքերը, և՛ I/O պորտերը: հիմնական նպատակ, գլխավոր նպատակ(GPIO) միկրոկոնտրոլեր:
Տվյալների փոխանցման համար օգտագործվում են երկու լարեր, մեկը ժամացույցի համար և մեկ ստրուկ ընտրության ազդանշան յուրաքանչյուր ստրուկի համար:
Օգտագործված ազդանշանների նկարագրությունը.
- MOSI - Master Output, Slave Input (master output, slave input): Այս ազդանշանը նախատեսված է սերիական տվյալների փոխանցման համար վարպետից դեպի ստրուկ: Կարող է նաև կոչվել SDO, DO և այլն:
- MISO - Master Input, Slave Output (հիմնական մուտքագրում, ստրուկի ելք): Այս ազդանշանը նախատեսված է սերիական տվյալների փոխանցման համար ստրուկից դեպի վարպետ: Կարող է կոչվել SDI, DI և այլն:
- SCK - Սերիական ժամացույց (համաժամացման ազդանշան): Օգտագործվում է տվյալների փոխանցման ժամանակ համաժամացման համար: Այն կարող է նաև կոչվել SCLK, CLK և այլն:
- ~CS - Chip Select (չիպի ընտրություն): Այս ազդանշանը ակտիվացնում է ստրուկ սարքը: Այն սովորաբար շրջված է, այսինքն ցածր մակարդակհամարվում է ակտիվ: Այն երբեմն կոչվում է ~SS (Slave Select):
Անկախ կապի առանձնահատուկ դեպքը մեկ ստրուկով տարբերակն է: Այս դեպքում կարող եք ~CS ազդանշանը գետնին քաշել, որպեսզի սարքը միշտ ակտիվ վիճակում լինի: Բայց դա անելը խիստ հուսահատվում է, քանի որ ստրուկ սարքը կարող է օգտագործել CS ազդանշանը սկզբնավորման կամ սպասարկման այլ նպատակների համար:
Սլավոններին ինքնուրույն միացնելու հիմնական անհարմարությունն այն է, որ ստրուկներից յուրաքանչյուրի համար անհրաժեշտ է առանձին ~CS ազդանշան։ Կասկադային կապի սխեման, որն արտասահմանյան գրականության մեջ կոչվում է «շղթա-շղթա» (կարելի է թարգմանել «գառլանդ»), զուրկ է նման թերությունից։
Ինչպես տեսնում եք վերևի նկարից, այստեղ մենք օգտագործում ենք ընդհանուր ազդանշանստրուկների ընտրություն բոլոր ստրուկների համար: Յուրաքանչյուր ստրուկի ելքը միացված է հաջորդի մուտքագրմանը: Վերջին ստրուկի ելքը միացված է վարպետի մուտքին, դրանով իսկ ձևավորելով փակ միացում: Այս կապով մենք կարող ենք ենթադրել, որ սերիական միացված սարքերը կազմում են մեկ մեծ հերթափոխ ռեգիստր: Համապատասխանաբար, տվյալները կարող են գրվել բոլոր սարքերին «մեկ նիստում»՝ նախապես հավաքելով անհրաժեշտ փաթեթը, որը միավորում է սարքերից յուրաքանչյուրի տվյալները՝ միացման ֆիզիկական կարգին համապատասխան հերթականությամբ: Բայց կա մի նուրբ կետ. Նախ, բոլոր միկրոսխեմաները պետք է աջակցեն այս տեսակի միացմանը. երկրորդը, Linux միջուկը չի աջակցում այս տեսակի կապի, այնպես որ, եթե դուք դեռ ցանկանում եք օգտագործել այն, դուք պետք է փոփոխեք առկա դրայվերները կամ գրեք ձեր սեփականը:
SPI սարքերի համար կա չորս գործառնական ռեժիմ: Որպես կանոն, նրանք ամենաշատ շփոթություն են առաջացնում սկսնակների շրջանում։ Այս չորս ռեժիմները երկու բիթերի համադրություն են.
- CPOL (Clock Polarity) - սահմանում է Առաջին մակարդակհամաժամացման ազդանշանի (բևեռականություն):
CPOL=0 ցույց է տալիս, որ ժամացույցի ազդանշանը ցածր է սկսվում, այնպես որ բարձրացող եզրը բարձրանում է, իսկ իջնողը ընկնում է:
CPOL=1, ժամացույցի ազդանշանը բարձր է սկսվում, ուստի բարձրացող եզրն ընկնում է, իսկ անկողը՝ բարձրանում: - CPHA (Ժամացույցի փուլ) - համաժամացման փուլ, որը որոշում է, թե ժամացույցի ազդանշանի որ եզրերի վրա է ընտրվում տվյալները:
CPHA=0 ցույց է տալիս, որ անհրաժեշտ է նմուշառել բարձրացող եզրին, և
CPHA=1 ցույց է տալիս, որ տվյալները պետք է նմուշառվեն ընկնող եզրին:
Այս նկարը ցույց է տալիս MOSI (կապույտ գիծ) և SCK (դեղին գիծ) ազդանշանները: Բոլոր դեպքերում փոխանցվում է 0x64 թիվը։ Լույս ուղղահայաց գծերցույց տալ տվյալների նմուշառման պահը. Դիտարկենք 2-րդ ռեժիմը, որի համար, ինչպես հիշում ենք, CPOL=1 և CPHA=0: Այսպիսով, մենք տեսնում ենք, որ համաժամացման ազդանշանն ի սկզբանե ունի բարձր մակարդակ, իսկ նմուշառումը կատարվում է առաջնային եզրով (այս դեպքում՝ ընկնելով)։ Քանի որ իմ օսցիլոսկոպն ունի միայն երկու ալիք, ~CS և MISO ազդանշանները չեն ցուցադրվում: Բայց այս դեպքում դրանք այնքան էլ հետաքրքիր չեն, օրինակ՝ ~CS ազդանշանը պարզապես «ձախողում» է տվյալների փոխանցման ողջ ընթացքում։
2. SPI ենթահամակարգի ակնարկ Linux-ում
Linux SPI դրայվերները բաժանված են երկու մասի. Առաջինը SPI կարգավորիչի դրայվերներն են, որոնք ուղղակիորեն աշխատում են որոշակի կարգավորիչի սարքաշարի հետ: Նման վարորդները որոշում են, թե ինչպես կարգավորել կարգավորիչը, ինչ գործողություններ ձեռնարկել ցածր էներգիայի ռեժիմին անցնելիս (կասեցնել) և դրանից դուրս գալ (վերսկսել), ընտրել հաջորդ փոխանցումը (spi_transfer) փոխանցման հերթից հաղորդագրության մեջ (spi_message, հերթերի մասին հենց ներքևում): ) և այն ուղղակիորեն նավահանգիստ ուղարկելը, որը նաև սահմանվում է որպես միացնել/անջատել կոնկրետ սարք CS-ի միջոցով (cs_activate/cs_deactivate ֆունկցիաներ): Այս հոդվածում ես չեմ նկարագրի տրված տեսակըվարորդներ. Որպես կանոն, դրանք արդեն ներդրված են այն MCU / eMPU-ի համար, որոնց վրա կա Linux պորտ, և դուք պետք է մուտք գործեք դրանց մեջ ձեր ձեռքերով միայն այն դեպքում, եթե ձեզ անհրաժեշտ է որևէ հատուկ գործառույթ, ինչպիսին է Chip Select Decoding-ը, որպեսզի կարողանաք ակտիվացնել ցանկալի ստրուկ սարքը արտաքին տրամաբանության միջոցով: Երբեմն դա օգտակար է, օրինակ, GPIO-ի բացակայության դեպքում:Երկրորդ մասը պրոտոկոլի դրայվերներն են, որոնք օգտագործվում են տարբեր ստրուկ սարքերի հետ աշխատելու համար, որոնք միացված են SPI ավտոբուսին: Այս դրայվերները կոչվում են «պրոտոկոլ», քանի որ դրանք ուղարկում և ստանում են միայն ստրուկ սարքերից տարբեր տվյալներ, մինչդեռ ուղղակիորեն չեն աշխատում որևէ սարքավորման հետ: Մեզ համար ամենահետաքրքիրն այս տեսակի դրայվերն է, քանի որ այն թույլ է տալիս մեզ ավելացնել համակարգին հետաքրքրող ստրուկ սարքի աջակցությունը, և մենք դա կդիտարկենք:
Արձանագրության դրայվերների մեծ մասը միջուկի մոդուլներ են: Օրինակ, եթե սարքը SPI-ին միացված աուդիո կոդեկ է, ապա վարորդը կօգտագործի նաև ALSA-ի տրամադրած գործառույթները, և ծրագրերը (օրինակ՝ madplay) կկարողանան աշխատել դրա հետ նիշային սարքի /dev/audio, չունենալով նվազագույն պատկերացում, թե ինչպես է այն ապարատային դասավորված և որ ավտոբուսին է միացված։
Միջուկը նաև տրամադրում է ընդհանուր նշանակության արձանագրության դրայվեր, որը կոչվում է spidev՝ նիշերի սարքի միջերեսով: Այն թույլ է տալիս կիսադուպլեքս մուտք գործել SPI ստրուկ՝ օգտագործելով ստանդարտ համակարգային զանգեր read() և write(), սահմանել գործողության ռեժիմը և կատարել լրիվ դուպլեքս հաղորդակցություն ioctl() զանգերի միջոցով:
Այսպիսով, SPI սարքերի արձանագրության դրայվերները կարելի է բաժանել երկու տեսակի.
- userspace վարորդներ, որոնք աշխատում են օգտագործողի տարածքում և սովորական ծրագրեր են ցանկացած լեզվով, որոնք աշխատում են SPI սարքի հետ՝ կարդալով/գրելով համապատասխան spidev նիշ սարքը:
- դրայվերներ, որոնք աշխատում են միջուկի տարածքում և ինտերֆեյս են ապահովում userspace-ին սարքի ֆայլերի միջոցով /dev գրացուցակում կամ ատրիբուտների միջոցով սարքի գրացուցակում sysfs-ում:
struct spi_message (struct list_head փոխանցումներ; struct spi_device *spi; unsigned is_dma_mapped:1; void (*complete)(void *context); void *context; unsigned actual_length; int status; struct list_head queue; void *state; );
փոխանցումներ - գործարքի (փոխանցումներ) փոխանցված հատվածների կապակցված ցանկ.
spi - ցուցիչ դեպի spi սարքը, որում հաղորդագրությունը հերթագրված է.
is_dma_maped - եթե այս դրոշը ճշմարիտ է, ապա և՛ dma, և՛ պրոցեսորի վիրտուալ հասցեները տրամադրվում են յուրաքանչյուր ուղարկման բուֆերի համար;
ամբողջական - հետադարձ զանգ, որը կոչվում է գործարքի ավարտը ծանուցելու համար.
համատեքստը ամբողջական() հետ կանչի փաստարկն է;
actual_length-ը բայթերի ընդհանուր թիվն է, որոնք փոխանցվել են բոլոր հաջողված փոխանցումներում.
կարգավիճակ - 0 հաջողության դեպքում, կամ բացասական արժեք errno-ի սխալի դեպքում;
Tags:
- Linux
- սպի
- սպիդև
- ներդրված
- միջուկի մոդուլ
Ներածություն
SPI (3-wire) հայտնի ինտերֆեյս է միկրոսխեմաների միջև սերիական տվյալների փոխանակման համար: SPI ինտերֆեյսը, I 2 C-ի հետ մեկտեղ, միկրոսխեմաների միացման ամենատարածված ինտերֆեյսներից է: Այն ի սկզբանե հորինվել է Motorola-ի կողմից և ներկայումս օգտագործվում է բազմաթիվ արտադրողների արտադրանքներում: Դրա անունը «Serial Peripheral Bus»-ի հապավումն է, որն արտացոլում է դրա նպատակը՝ արտաքին սարքերի միացման ավտոբուս։ SPI ավտոբուսը կազմակերպվում է վարպետ-ստրուկ հիմունքներով: Ավտոբուսի վարպետը սովորաբար միկրոկառավարիչ է, բայց այն կարող է լինել նաև ծրագրավորվող տրամաբանություն, DSP կարգավորիչ կամ ASIC: Վարպետին միացված ավտոբուս արտաքին սարքերձևավորել ստրուկների ավտոբուս: Նրանց դերը խաղում են տարբեր տեսակի միկրոսխեմաներ, ներառյալ. պահեստավորման սարքեր (EEPROM, Flash-memory, SRAM), իրական ժամանակի ժամացույց (RTC), ADC/DAC, թվային պոտենցիոմետրեր, մասնագիտացված կարգավորիչներ և այլն:
SPI ինտերֆեյսի հիմնական բաղադրիչը սովորական հերթափոխային ռեգիստրն է, որի համաժամացման և բիթ հոսքի մուտքային/ելքային ազդանշանները կազմում են միջերեսի ազդանշանները: Այսպիսով, SPI արձանագրությունն ավելի ճիշտ կոչվում է ոչ թե տվյալների փոխանցման արձանագրություն, այլ տվյալների փոխանակման արձանագրություն երկու հերթափոխ ռեգիստրների միջև, որոնցից յուրաքանչյուրը միաժամանակ կատարում է և՛ ստացողի, և՛ հաղորդիչի գործառույթը: SPI ավտոբուսի վրա տվյալների փոխանցման անփոխարինելի պայմանը ավտոբուսի ժամացույցի ազդանշանի ստեղծումն է: Այս ազդանշանն իրավունք ունի գեներացնել միայն հիմնական ավտոբուսը, և ստրուկ ավտոբուսի շահագործումն ամբողջությամբ կախված է այս ազդանշանից:
Էլեկտրական միացում
SPI ավտոբուսի հետ կապի երեք տեսակ կա, որոնցից յուրաքանչյուրը ներառում է չորս ազդանշան (տե՛ս Աղյուսակ 1-ը դրանց հիմնական և այլընտրանքային նշանակումների համար): Ամենապարզ միացումը, որը ներառում է ընդամենը երկու չիպ, ներկայացված է Նկար 1-ում: Այստեղ ավտոբուսի վարպետը փոխանցում է տվյալներ MOSI գծի վրա՝ իր կողմից գեներացված SCLK ազդանշանի հետ համաժամանակյա, և ստրուկը գրավում է փոխանցված տվյալների բիթերը որոշակի եզրերի վրա: ստացել է ժամացույցի ազդանշան: Միևնույն ժամանակ, ստրուկը ուղարկում է իր տվյալների փաթեթը: Ներկայացված սխեման կարող է պարզեցվել՝ բաց թողնելով MISO գիծը, եթե օգտագործված ստրուկ IC-ը չի նախատեսում կամ չի պահանջվում հետ ուղարկել տվյալները: Տվյալների միակողմանի փոխանցումը կարելի է գտնել այնպիսի միկրոսխեմաներում, ինչպիսիք են DAC-ները, թվային պոտենցիոմետրերը, ծրագրավորվող ուժեղացուցիչները և դրայվերները: Այսպիսով, ստրուկ IC-ի միացման դիտարկված տարբերակը պահանջում է 3 կամ 4 հաղորդակցման գիծ: Որպեսզի ստրուկ IC-ն ստանա և փոխանցի տվյալներ, բացի ժամացույցի ազդանշանի առկայությունից, անհրաժեշտ է նաև, որ SS գիծը վարվի ցածր: Հակառակ դեպքում, ստրուկ IC-ն անգործուն կլինի: Երբ օգտագործվում է միայն մեկ արտաքին IC, կարող է գայթակղիչ լինել բացառել SS գիծը նաև՝ կոշտ դնելով slave IC-ի ընտրված մուտքը ցածր: Նման լուծումը խիստ անցանկալի է և կարող է հանգեցնել ձախողումների կամ նույնիսկ տվյալների փոխանցման անհնարինության, քանի որ. չիպի ընտրության մուտքագրումն օգտագործվում է IC-ն իր վրա փոխանցելու համար սկզբնական վիճակև երբեմն սկսում է տվյալների առաջին բիտի ելքը:
Բրինձ. 1. Ամենապարզ միացումը SPI ավտոբուսին
Եթե անհրաժեշտ է մի քանի միկրոսխեմաներ միացնել SPI ավտոբուսին, ապա օգտագործվում է կամ անկախ (զուգահեռ) միացում (նկ. 2), կամ կասկադ (սերիական) միացում (նկ. 3): Անկախ կապավելի տարածված, քանի որ ձեռք է բերվել SPI-ի հետ համատեղելի ցանկացած չիպերի միջոցով: Այստեղ բոլոր ազդանշանները, բացառությամբ չիպսերի ընտրության, միացված են զուգահեռ, և ավտոբուսի վարպետը, այս կամ այն SS ազդանշանը ցածր վիճակի տեղափոխելով, սահմանում է, թե որ ստրուկ IC-ի հետ կփոխանակի տվյալներ։ Նման կապի հիմնական թերությունը անհրաժեշտությունն է լրացուցիչ գծերստրուկ միկրոսխեմաների հասցեավորման համար (հաղորդակցման գծերի ընդհանուր թիվը 3+n է, որտեղ n-ը ստրուկ միկրոսխեմաների թիվն է): Կասկադը զերծ է այս թերությունից, քանի որ այստեղ մի մեծ հերթափոխի ռեգիստր է ձևավորվում մի քանի միկրոսխեմաներից: Դա անելու համար մեկ IC-ի փոխանցման տվյալների ելքը միացված է մյուսի ստացման տվյալների մուտքագրմանը, ինչպես ցույց է տրված Նկար 3-ում: Չիպային ընտրության մուտքերը միացված են այստեղ զուգահեռ, և այդպիսով կապի գծերի ընդհանուր թիվը պահվում է 4-ի վրա: Այնուամենայնիվ, կասկադը հնարավոր է միայն այն դեպքում, եթե դրա աջակցությունը նշված է օգտագործված չիպերի փաստաթղթերում: Պարզելու համար անհրաժեշտ է իմանալ, որ նման կապը անգլերենում կոչվում է «daisy-chaining»:
Բրինձ. 2. Անկախ միացում SPI ավտոբուսին
Բրինձ. 3. Կասկադ դեպի SPI ավտոբուս
Փոխանցման արձանագրություն
SPI փոխանցման արձանագրությունը չափազանց պարզ է և, ըստ էության, նույնական է հերթափոխի ռեգիստրի տրամաբանությանը, որը բաղկացած է հերթափոխի գործողություն կատարելուց և, համապատասխանաբար, համաժամացման ազդանշանի որոշակի եզրերի վրա տվյալների մուտքագրում և ելքից բիթ առ բիթ: . Տվյալների հավաքածուն փոխանցման և ստացման ժամանակ միշտ կատարվում է ժամացույցի հակառակ եզրերի վրա: Սա անհրաժեշտ է ապահովելու համար, որ տվյալները վերականգնվեն այն արժանահավատորեն հաստատվելուց հետո: Եթե հաշվի առնենք, որ բարձրացող կամ իջնող եզրը կարող է հանդես գալ որպես փոխանցման ցիկլի առաջին եզր, ապա SPI ինտերֆեյսի տրամաբանության չորս հնարավոր տարբերակ կա։ Այս տարբերակները կոչվում են SPI ռեժիմներ և նկարագրվում են երկու պարամետրով.
- CPOL - համաժամացման ազդանշանի սկզբնական մակարդակը (եթե CPOL=0, ապա համաժամացման գիծը փոխանցման ցիկլի մեկնարկից առաջ և դրա ավարտից հետո ունի ցածր մակարդակ (այսինքն՝ առաջին եզրը բարձրանում է, իսկ վերջին եզրը՝ ընկնում), հակառակ դեպքում, եթե CPOL=1, - բարձր (այսինքն՝ առաջին ճակատն ընկնում է, իսկ վերջինը՝ բարձրանում));
- CPHA - համաժամացման փուլ; այս պարամետրը որոշում է այն հաջորդականությունը, որով տվյալները տեղադրվում և առբերվում են (եթե CPHA=0, ապա տվյալների նմուշառումը կկատարվի համաժամացման ցիկլի բարձրացող եզրին, այնուհետև՝ ընկնող եզրին, տվյալները կսահմանվեն, եթե CPHA= 1, այնուհետև պարամետրերի տվյալները կվերցվեն ժամացույցի ցիկլի բարձրացող եզրին և նմուշառվեն անկման եզրին): SPI ռեժիմների մասին տեղեկատվությունը ամփոփված է Աղյուսակ 2-ում:
SPI-ի տարբեր ռեժիմներում գործող հիմնական և ստրուկ չիպերը համատեղելի չեն, ուստի կարևոր է հստակեցնել, թե որ ռեժիմներն են ապահովվում ավտոբուսի վարպետի կողմից՝ նախքան ստրուկ չիպեր ընտրելը: SPI ապարատային մոդուլները, որոնք ինտեգրված են միկրոկոնտրոլերների մեջ, շատ դեպքերում աջակցում են ցանկացած SPI ռեժիմ ընտրելու կարողությանը, և, հետևաբար, ցանկացած SPI ստրուկ միկրոսխեման կարող է միացված լինել դրանց (կիրառվում է միայն անկախ կապի տարբերակի դեպքում): Բացի այդ, SPI արձանագրությունը ցանկացած ռեժիմում հեշտությամբ իրականացվում է ծրագրային ապահովման մեջ:
Համեմատություն I 2 C ավտոբուսի հետ
Ինչպես արդեն նշվեց, 2-լարային I 2 C սերիական ավտոբուսը ոչ պակաս տարածված է միկրոսխեմաների միացման համար: Ստորև կարող եք տեսնել, թե ինչ առավելություններ է տալիս այս կամ այն սերիական ավտոբուսը.
SPI ավտոբուսի առավելությունները | I2C ավտոբուսի առավելությունները |
Ֆիզիկական շերտում փոխանցման արձանագրության ծայրահեղ պարզությունը որոշում է փոխանցման բարձր հուսալիությունը և արագությունը: SPI ավտոբուսի արագության սահմանաչափը չափվում է տասնյակ մեգահերցով և, հետևաբար, իդեալական է տվյալների մեծ հոսքի համար և լայնորեն օգտագործվում է բարձր արագությամբ DAC/ADC, LED էկրանի դրայվերներում և հիշողության չիպերում: | I 2 C ավտոբուսը մնում է երկլարային՝ անկախ դրան միացված չիպերի քանակից։ |
SPI-ի բոլոր ավտոբուսային գծերը միակողմանի են, ինչը մեծապես հեշտացնում է մակարդակի փոխակերպման և միկրոսխեմաների գալվանական մեկուսացման խնդիրը | Multi-master շահագործման հնարավորությունը, երբ մի քանի հիմնական միկրոսխեմաներ միացված են ավտոբուսին: |
SPI արձանագրության ծրագրային ապահովման իրականացման հեշտությունը: | I2C արձանագրությունն ավելի ստանդարտացված է, հետևաբար, I2C չիպերի օգտագործողն ավելի պաշտպանված է ընտրված բաղադրիչների անհամատեղելիության խնդիրներից: |
Ստացված և համատեղելի արձանագրություններ
- ՄԻԿՐՈՎԱՌ.
National Semiconductor-ի MICROWIRE արձանագրությունը նույնական է SPI արձանագրությանը 0 ռեժիմում (CPOL = 0, CPHA = 0):
- Maxim 3-լարային ինտերֆեյս
Այս ինտերֆեյսի տարբերությունն այն է, որ երկու միակողմանի գծերի վրա լրիվ դուպլեքս փոխանցման փոխարեն, այն կատարում է կիսադյուպլեքս փոխանցում մեկ երկկողմանի DQ գծով:
QSPI
SPI-ից ավելի բարձր մակարդակի արձանագրություն, որը թույլ է տալիս տվյալների ավտոմատ փոխանցում՝ առանց պրոցեսորի ներգրավման:
Բացի այդ, SPI ինտերֆեյսը հիմք է հանդիսանում մի շարք մասնագիտացված ինտերֆեյսների կառուցման համար, ներառյալ. JTAG վրիպազերծման ինտերֆեյս և ֆլեշ հիշողության քարտի միջերեսներ, ներառյալ. SD և MMC:
Ներդիր 1. SPI ավտոբուսի էլեկտրական ազդանշաններ
Առաջատար անվադողեր | ստրուկ ավտոբուս | ||||
Հիմնական նշանակում | Այլընտրանքային նշում | Նկարագրություն | Հիմնական նշանակում | Այլընտրանքային նշում | Նկարագրություն |
ՄՈՍԻ | ԱՐԵԼ, ՍԴՈ, ԴԱՈՒԹ | ՄՈՍԻ | DI, SDI, DIN | ||
MISO | DI, SDI, DIN | Սերիական մուտքագրում | MISO | ԱՐԵԼ, ՍԴՈ, ԴԱՈՒԹ | Սերիական ելք |
SCLK | DCLOCK, CLK, SCK | Տվյալների փոխանցման համաժամացման ելք | SCLK | DCLOCK, CLK, SCK | Ստացեք համաժամացման մուտքագրում |
ՍՍ | CS | Ստրկական ընտրության ելք (չիպի ընտրություն) | ՍՍ | CS | Ստրկական ընտրության մուտքագրում (չիպի ընտրություն) |
SPI(Սերիական ծայրամասային ավտոբուս) - սերիական ծայրամասային փոխանակման արձանագրություն: Այս պունկցիան մշակվել է ընկերության կողմից Motorola, բայց ներկայումս օգտագործվում է բազմաթիվ արտադրողների կողմից: Այն նախագծված է միկրոկոնտրոլերները միմյանց հետ հաղորդակցվելու համար, ինչպես նաև բոլոր տեսակի ծայրամասային սարքերի հետ՝ սենսորներ, ADC-ներ, հիշողության չիպեր, ժամացույցներ: Այնուամենայնիվ, ամենատարածված օգտագործումը SPIմիկրոկոնտրոլերի հիշողության մեջ գրված ծրագիր է։ Միկրոկարգավորիչներում AVRօգնությամբ SPIդուք կարող եք թարթել միկրոկոնտրոլերը առանց այն տախտակից զոդելու, որոնվածի այս մեթոդը կոչվում է ISP (համակարգային ծրագրավորման մեջ). Չնայած անունները SPIԵվ ISPշատ համահունչ, դա նույն բանը չէ, ներս AVR SPIօգտագործվում է որպես ֆիզիկական շերտ ISP, այսինքն՝ օգտագործվում են տողերը SPIտվյալների փոխանցման համար, բայց ինքնին արձանագրությունը (ծրագրային շերտը) տարբեր է:
SPI-ին տվյալները փոխանցելու համար օգտագործվում են երեք տող.
MISO (Master Input Slave Output)- այս տողում Վարպետը (վարպետը) տվյալներ է ստանում ստրուկից (ստրուկից):
MOSI (Master Output Slave Input)– այս տողում Master-ը տվյալներ է ուղարկում Slave-ին:
SCK (Սերիական ժամացույց)- ծառայում է ժամացույցի ազդանշան փոխանցելու ստրուկ սարքին:
Գիծը նույնպես օգտագործվում է SS (Slave Select), որը նշում է սարքը, որի հետ Վարպետկփոխանակեն տվյալներ։
Շնորհիվ այն բանի, որ շատ արտադրողներ օգտագործում են SPI իրենց սարքերում, կապումների անունները կարող են մի փոքր տարբերվել: Ստորև ներկայացված է այլընտրանքային անուններով աղյուսակ:
SPI-ն գալիս է երկու ձևով՝ ապարատային և ծրագրային: Ծրագրային ապահովման ներդրման ժամանակ SPI, մենք պետք է ձեռքով սահմանենք ազդանշանը համապատասխանի ոտքերի վրա MISO, MOSI, SSձգվելիս SCK. Սարքավորումների ներդրմամբ SPIմենք տվյալները փոխանցում ենք հատուկ ռեգիստր, և միկրոկառավարիչը ինքն է կատարում վերը նշված մանիպուլյացիաները՝ ըստ նախնական պարամետրերի:
Ֆիզիկական իրականացում SPI, երկու հերթափոխ ռեգիստրներ են՝ միացված միասին:
Կախված նրանից, թե ազդանշանի որ տրամաբանական մակարդակը SCK, տեղի է ունենում համաժամացում ՎարպետԵվ ստրուկիսկ թե որ ճակատում են տվյալները գրավում և տեղափոխվում, հնարավոր է 4 ռեժիմ SPI.
- CPOL = 0 - համաժամացման ազդանշանը սկսվում է ցածր մակարդակից.
- CPOL = 1 - համաժամացման ազդանշանը սկսվում է բարձր մակարդակից.
- CPHA = 0 - տվյալները նմուշառվում են համաժամացման ազդանշանի բարձրացող եզրին.
- CPHA = 1 - տվյալները նմուշառվում են համաժամացման ազդանշանի անկման եզրին:
CPOL=0 CPHA=0
CPOL = 1 CPHA = 0
CPOL = 0 CPHA = 1
CPOL=1 CPHA=1
SPI- համաժամանակյա ինտերֆեյս, այսինքն՝ որոշակի տվյալներ ստանալու համար ստրուկ, Վարպետպետք է ինչ-որ բան ուղարկի: Թվում է, թե ամեն ինչ պարզ է, բայց եթե Վարպետուղարկում է մեկ բայթ, և ստրուկՊե՞տք է նրան երկուսը վերադարձնել: Այս դեպքում Վարպետը պետք է նրան ինչ-որ բան ուղարկի 2 անգամ, օրինակ 0x00։
//ուղարկեք հրամանը, ի պատասխան պետք է գա երկու բայթ Spi_Master_Transmit(chx); // ուղարկել ինչ-որ բան առաջին բայթը ստանալու համար Spi_Master_Transmit(0X00); touch_x = SPDR; touch_x<<= 8;
//отправляем что-нибудь для того чтобы принять второй байт
Spi_Master_Transmit(0X00);
touch_x |= SPDR;
touch_x >>= 3;
Այսքանը, վերևում ներկայացված է աշխատանքային նախագծից վերցված ծածկագրի օրինակ:
SPI համաժամանակյա սերիական ինտերֆեյսը նախատեսված է մեկ հիմնական (SPI-master) և մեկ slave (SPI-slave) սարքի հետ կետ առ կետ ինտերֆեյսներում տվյալների մուտքագրման և ելքի համար (նկ. 1.24): SPI-գլխավոր կառավարման սխեման առաջացնում է SCK ժամացույցը, որը միաժամանակ ազդանշաններ է փոխանցում MOSI ելքի վրա և ազդանշաններ է ստանում MISO մուտքի մոտ: Նույն ժամացույցը իմպուլսացնում է SCK-ը, մտնելով SPI ստրուկ, վերահսկում է ազդանշանների ընդունումը իր MOSI մուտքի մոտ և ազդանշանների ձևավորումն իր MISO ելքում: Առանձին MOSI և MISO ազդանշանային սխեմաները հեշտացնում են լրիվ դուպլեքս հաղորդակցությունների իրականացումը:
Տվյալների ձևաչափեր, ազդանշանի պարամետրեր, ժամանակացույց և այլն: ինտերֆեյսում չեն կարգավորվում, օրինակ, տվյալների փոխանակման փոխարժեքը որոշվում է միայն SPI-ի վարպետի կողմից ստեղծված SCK ժամացույցի իմպուլսների հաճախականությամբ: Առավելագույն հեռավորությունը կախված է կապի գծերում ազդանշանի աղավաղման մակարդակից, ենթադրվում է, որ տվյալների հուսալի փոխանակումը հնարավոր է մինչև մի քանի մետր հեռավորության վրա:
Ըստ էության, դա լիարժեք ինտերֆեյս չէ նույնիսկ ֆիզիկական շերտի համար։ Փաստորեն, SPI-ն իրականացնում է տվյալների մուտքագրման-ելքի ստանդարտ ընթացակարգ հերթափոխային ռեգիստրներում, գործողության վերահսկման ալգորիթմներ չկան, փոխանցված տվյալների վերահսկումն ապահովված է: Բոլոր անհրաժեշտ հսկողության ընթացակարգերը պետք է իրականացվեն SPI-վարպետի կողմից: Սա մի կողմից պահանջում է լրացուցիչ միջոցներվերահսկողություն, իսկ մյուս կողմից՝ այն պարզեցնում է ինքնին SPI ինտերֆեյսի իրականացման միջոցները։ SPI ստրուկը ստանդարտ հերթափոխային ռեգիստր է՝ անհրաժեշտ քանակությամբ տվյալների բիթերով:
Օրինակ, ATMEL-ի AVR ընտանիքի միկրոկոնտրոլերները աջակցում են I/O տվյալները ինչպես SPI-master, այնպես էլ SPI-slave ռեժիմներում: Ստանդարտ փոխանակման ցիկլը ներառում է տվյալների մեկ բայթի միաժամանակյա փոխանցում երկու ուղղություններով (նկ. 1.24): Բազմաբայթ հաղորդագրություններ փոխանցելիս SPI-slave-ը պետք է պարունակի համապատասխան բիթային խորության հերթափոխ ռեգիստր, իսկ SPI-master-ը պետք է վերահսկի տվյալների բայթերի պահանջվող հաջորդականության փոխանակումը, յուրաքանչյուր բայթ մշակելով հաջորդ ստանդարտ ինտերֆեյսի գործառնական ցիկլից հետո և ապահովելով. հաջորդ ստանդարտ փոխանակման ցիկլի մեկնարկը:
օգտագործվում է ոչ միայն միկրոկոնտրոլերների միջև տվյալների փոխանակման համար, այլ նաև արտաքին ADC-ների (ADC) և DAC-ների (DAC), հիշողության չիպերի` SRAM, FRAM, SEERAM և շատ այլ սարքերի հետ միկրոկառավարիչների միջերեսի համար: Սերիական տվյալների ձևաչափի և SPI ինտերֆեյսի պարզ տրամաբանական կազմակերպման շնորհիվ այս միկրոսխեմաները արտադրվում են կոմպակտ 8-16 փին փաթեթներով: Աղյուսակում. 1.6-ը ցույց է տալիս միկրոսխեմաների օրինակներ տարբեր ֆունկցիոնալ նպատակներով և տարբեր արտադրողներից SPI ինտերֆեյսով: Այս օրինակները ցույց են տալիս, որ սերիական ինտերֆեյսի ձևաչափը կարող է զգալիորեն նվազեցնել պահանջվող I/O գծերի քանակը:
Աղյուսակ 1.6
Չիպի տեսակը |
Հիմնական կարգավորումներ |
Կեղևի տեսակը |
Արտադրող |
24-բիթ, Delta-Sigma, 15 Հց |
|||
24 բիթ, Delta-Sigma, 41 կՀց |
|||
16-բիթ, SAR, 100 կՀց |
|||
16 բիթ, PulSAR, 500 կՀց |
|||
12 բիթ, U-ելք, 2,5 մկվ |
|||
16-bit, U-out, 10 µs |
|||
14-bit, I-out, 0.04 µs |
|||
12-bit, I-out, 0.6 μs |
|||
16-bit, U-out, 1 µs |
www.maximic.com |
||
Չիպի տեսակը |
Հիմնական կարգավորումներ |
Կեղևի տեսակը |
Արտադրող |
16 կբիթ/վրկ, 1 տրլն |
|||
4 կբիտ, անսահմանափակ |
|||
64 kbps, անսահմանափակ |
|||
256K, 32768×8, 0.1M ցիկլեր |
|||
8K, 1024×8, 0,1M ցիկլեր |
|||
16K, 8192×8, 0.1M ցիկլեր |
|||
128K, 16384×8, 0.1M ցիկլեր |
|||
256K, 32768×8, 0.1M ցիկլեր |
|||
Թերմոսենսոր |
|||
13 բիթ, -40-ից +150 C o (±0,5C o) |
Խնդիրներից մեկը, որը հաճախ պետք է լուծվի ավտոմատացման գործիքներում, կապված է միկրոկառավարիչների I/O գծերի սահմանափակ քանակի հետ: Սովորաբար, փոխանցվող ազդանշանների թիվը զգալիորեն գերազանցում է զուգահեռ նավահանգիստների հնարավորությունները, սակայն փոխանցվող ազդանշանների մեծ մասի մշակման ալգորիթմները թույլ են տալիս լրացուցիչ ժամանակային ուշացումներ՝ կապված սերիական ձևաչափով դրանց փոխանցման հետ: Այս դեպքերում արդյունավետ է ստանդարտ շարքի զուգահեռ ռեգիստրների օգտագործումը:
Օրինակ, SPI ինտերֆեյսը կարող է օգտակար լինել մեծ թվով միացման/անջատման սենսորների կարգավիճակի տեղեկատվությունը կարդալու կամ զուգահեռ ձևաչափով բազմաբիթ տվյալների մուտքագրման համար: Այս նպատակների համար հարմար է օգտագործել առանձին ռեգիստրներ զուգահեռ գրությամբ և սերիական ընթերցմամբ (8-bit Parallel-In / Serial-Out Shift Register), օրինակ CD74HCT166 (նկ. 1.25):
Միկրոկարգավորիչի SPI ինտերֆեյսի միջոցով տասնվեց միացման սենսորների (S1 - S16) միացման սխեման ներկայացված է նկ. 1.26. Հարկ է նշել, որ նախքան SPI ինտերֆեյսի շահագործումը սկսելը, անհրաժեշտ է ազդանշան ստեղծել՝ D0-D7 զուգահեռ մուտքերից ռեգիստրներին տեղեկատվություն գրելու համար։ Դրա համար կարող եք օգտագործել միկրոկոնտրոլերի ելքերից մեկը՝ in այս օրինակը PC0.
Բրինձ. 1.25. Ֆունկցիոնալ դիագրամգրանցել CD74HCT166
Բրինձ. 1.26. Միացման/անջատման սենսորների միացում SPI ինտերֆեյսին
Բրինձ. 1.27. Վեցանիշ ցուցիչի միացում SPI ինտերֆեյսին
Օգտագործելով ռեգիստրներ սերիական ձայնագրմամբ և տեղեկատվության զուգահեռ ելքով (8-bit Serial-In, Parallel-Out Shift Register) - SN74HC595, SPI ինտերֆեյսը կարող է օգտագործվել նաև տեղեկատվության մի քանի բայթ զուգահեռ ելքի համար: Որպես օրինակ, նկ. 1.27-ը ցույց է տալիս միկրոկառավարիչին վեցանիշ յոթ հատվածի ցուցիչի միացման դիագրամը: Ի տարբերություն նախորդ սխեմայի, զուգահեռ ելքային ազդանշանը (PB1) պետք է գեներացվի SPI ինտերֆեյսի կողմից տվյալների փոխանցման ավարտից հետո միջերեսից դուրս միջոցներով: Օրինակ, ինտերֆեյսի հետ փոխազդելու ալգորիթմը պետք է նախատեսի փոխանցված տվյալների բայթերի քանակի վերահսկում, իսկ վերջին բայթի փոխանցումն ավարտելուց հետո անհրաժեշտ է լրացուցիչ փոխանցել զուգահեռ ելքային ազդանշան: