poniedziałek, 30 kwietnia 2018

PIC32MM 32bity od Microchipa - I2C budujemy bibliotekę.

Część sprzętową czyli budowę własnej płytki developerskiej dla PIC32MM mam za sobą. Płytka umożliwia mi w mega wygodny sposób podjęcie wyzwania poznania tego słodkiego MCU 32 bitowego. Ponieważ w kolejce czeka również do rozpoznania czujnik temperatury Microchipa MCP9808 dlatego potrzebujemy biblioteki I2C do zagadania z tym czujnikiem. Z przyjemnością zabieram się do roboty. Ostatni raz z I2C spotkałem się przy okazji poznawania serii 16 bitowej MCU PIC24HJ. Poczyniłem wówczas artykuł o I2C ,przytoczyłem w nim trochę niezbyt ciężkiej teorii o I2C.

Ostatni raz z I2C spotkałem się przy okazji poznawania serii 16 bitowej MCU PIC24HJ. Poczyniłem wówczas artykuł o I2C ,przytoczyłem w nim trochę niezbyt ciężkiej teorii o I2C. Warto sobie trochę odświeżyć pamięć w tym zakresie. Wiem z własnego doświadczenia , że I2C sprawia początkującym sporo problemów. Tutaj szczególnie gorąco polecę książkę Paweł Borkowski "Mikrokontrolery PIC w praktycznych zastosowaniach" ponieważ jest w niej m.in najlepszy opis I2C jaki w ogóle ktokolwiek poczynił na ten temat.
Microchip tak projektuje swoje MCU aby migracja  na kolejne serie mikrokontrolerów była płynna i bezproblemowa. Dotyczy to również peryferiów. Efektem takiej polityki jest to, że bez żadnych problemów udało się zrobić translację wcześniej stworzonej biblioteki I2C dla serii PIC24 na serię PIC32MM. A cała operacja trwała 15 minut. Kocham za to Microchipa.

Mamy przy tym wybór. Możemy skorzystać z gotowej biblioteki I2C, którą wygeneruje nam doskonale działający MCC (MPLAB Code Configurator) lub wystrugać sobie manualnie bibliotekę w/g własnej koncepcji. Ja przyjąłem wariant drugi czyli struganie organiczne na rejestrach. Biblioteka od Microchipa pomimo , że jest doskonale opisana i kod jest wysokiej jakości ,może początkującym trochę sprawić trudności z ogarnięciem jej.

W PIC32MM seria GPM mamy do dyspozycji  3 x I2C , od przybytku głowa nie boli :)
Peryferia są przyporządkowane do następujących pinów (i jak widać wszystko wisi na porcie B):

I2C1 - RB9(SDA1) / RB8 i RB9(SCL1)
I2C2 - RB2(SDA2) / RB3(SCL2)
I2C3 - RB7(SDA3) / RB13(SCL3)

Do rejestrów I2C mamy łatwy dostęp atomowy.  Ale moja biblioteka będzie bez tej funkcjonalności, być może w terminie późniejszym rozbuduje ją o ten aspekt. Na razie potrzebuję szybko jak najprostszej biblioteki do testów MCP9808.
Jeśli chodzi o rejestry I2C w PIC32MM to trzeba zauważyć , że mamy do dyspozycji różne ciekawe funkcjonalności takie jak np. detekcja kolizji na linii i arbitraż. Zwiększa to odporność I2C w PIC32MM na nieprzewidziane sytuacje, które mogą wykrzaczyć transmisję .
Warto też wspomnieć o funkcjonalności Addres Bit Masking, czyli coś podobnego jak w sieciach CAN występuje. Za pomocą tej funkcjonalności możemy filtrować adresy z którymi dozwolona jest wymiana danych.

Ja w swojej bibliotece do detekcji błędów wykorzystam sprytny mechanizm śledzący poprawność wykonania każdej operacji przez Mastera, który jest w stanie zasygnalizować optycznie problem za pomocą diody LED. Rzut okiem na diodę i wiemy czy komunikacja po I2C przebiega poprawnie czy też coś ją boli.

Biblioteka wisi już na Github-ie. Oprócz podstawowych funkcji niezbędnych w komunikacji I2C, biblioteka jest rozbudowana o dedykowane funkcje do zapisu i odczytu pamięci EEPROM i EERAM. Największym rodzynkiem lub wisienką na torcie są funkcje do zapisu i odczytu całych struktur do pamięci EERAM (to jest po prostu bajka) i to są zajefajne funkcje.
Jeśli mnie pamięć nie myli to w czeluściach mojego bloga poczyniłem na ten temat artykuł.

Biblioteka od strony sprzętowej jest skonfigurowana dla I2C3 piny RB7(SDA3) / RB13(SCL3). Wynika to z wyboru gniazda nr 1 PICbus na mojej płytce developerskiej w które wpiąłem moduł z czujnikiem temperatury MCP9808 i MCP2517FD celem dalszych testów.


Brak komentarzy:

Prześlij komentarz