I2C#

Algemene informatie#

Alle functies zijn op een blokkerende manier beschreven. Mocht er bijvoorbeeld een verkeerd slave-adres zijn opgegeven dan zullen de functies gewoon blijven hangen. Je kunt in dat geval het beste de debugger pauzeren en het UCB0STAT register bekijken.

../_images/ucbxstat.png

Verder worden pinnen 1.6 en 1.7 gebruikt met UCB0 voor I2C. Dit is helaas de enige optie voor de MSP430G2553, andere pinnen of UCA0 kunnen niet voor I2C worden gebruikt

Voorbeeld#

Om data te ontvangen is het volgende voldoende. Het voorbeeld gaat ervan uit dat de chip op P1.6 en P1.7 is aangesloten met de juiste pull-up weerstanden en met het 7-bit adres 0x48.

//eenmalig initaliseren
i2cInitialize(MASTER);

//selecteer register 1 en ontvang de 2 bytes van chip 0x48
uint8_t data[2];
i2cReceiveFromRegister(0x48, 0x01, 2, data);

//of begin gewoon met lezen als de chip geen pointer register heeft
i2cReceiveBytes(0x48, 2, data);

Om data te versturen kun je het volgende doen

//eenmalig initaliseren als dit nog niet is gedaan
i2cInitialize(MASTER);

//random data om te versturen
uint8_t data = {0,1,2,3,4,5,6,7,8,9}

//we willen 10 bytes versturen naar 0x48.
i2cSendBytes(0x48, 10, data);

Om alles handmatig te doen zou je de i2cSendByte functie kunnen gebruiken. Dit wordt echter niet aangeraden omdata de i2cSendBytes functie exact hetzelfde doet.

//eenmalig initaliseren als dit nog niet is gedaan
i2cInitialize(MASTER);

//we gaan communiceren met chip 0x48
i2cSetAddress(0x48);
i2cStart(); //start conditie sturen
i2cSendByte(0x12); //byte versturen
i2cSendByte(0x34); //nog een byte versturen
i2cStop(); //verbinding netjes afsluiten

Define-, enum- en functiebeschrijvingen#

Dit headerbestand bevat alle i2c prototypes.

Author

VersD

Date

4 mei 2017

Enums

enum i2cMode#

De twee i2c modi.

Values:

enumerator MASTER#
enumerator SLAVE#
enum status#

Standaard aan/uit toestand.

Values:

enumerator ENABLE#
enumerator DISABLE#

Functions

void i2cInitialize(i2cMode mode)#

Stel de USCI module in voor I2C gebruik (i.p.v. SPI)

Zie ook

i2cSetMode()

Parameters:

mode – Stel de i2c module in als SLAVE of MASTER.

void i2cSetMode(i2cMode mode)#

Stel hiermee in of de module MASTER of SLAVE is op de i2c bus.

De slave modus zet alleen de interrupts aan, de interrupt vector zul je dan zelf moeten afhandelen.

i2cSetMode(MASTER)

Todo:

Implementeer slave modus

Parameters:

mode – Stel de i2c module in als SLAVE of MASTER.

void i2cSetAddress(uint8_t address)#

Stel het adres in van de andere i2c module.

Elke i2c module heeft een uniek adres op bus.

Parameters:

address – Het 7 bits adres zonder read/write bit, volledig naar rechts geschoven. Dus bits 0-6 bevatten het adres.

void i2cSetOwnAddress(uint8_t address)#

Stel het eigen adres in van de msp430 i2c peripheral.

Wanneer de msp430 als slave wordt ingesteld moet deze een adres hebben.

Parameters:

address – Het 7 bits adres zonder read/write bit, volledig naar rechts geschoven. Dus bits 0-6 bevatten het adres.

void i2cSendByte(uint8_t byte)#

Zet een databyte in de transmit-buffer.

Deze functie roept geen start of stop conditie aan. Het is dus te gebruiken wanneer data verstuurt moet worden die run-time gegenereerd wordt. Zorg er dan wel voor dat de communicatie wordt gestart en gestopt

Zie ook

i2cStart

Zie ook

i2cStop

Parameters:

byte – De 8 bits data om te laten versturen.

void i2cSendBytes(uint8_t address, uint8_t number, const uint8_t bytes[])#

Start verbinding en stuur data.

Met deze functie kun je meerdere databytes versturen. De functie zet de verbinding op stand door een startconditie te versturen, stuurt vervolgens alle meegegeven data en eindigt met een stopconditie.

uint8_t i2cSlaveAdress = 0x12
uint8_t data = {0x0A, 0xAC, 0xFF, 0x12};
i2cSendBytes(i2cSlaveAdress, 4, data);

Parameters:
  • address – Het I2C-adres van de chip waar je iets naar wilt sturen.

  • number – Het aantal bytes wat wordt verstuurd

  • bytes – Een array met de te versturen bytes

void i2cReceiveBytes(uint8_t address, uint8_t number, uint8_t bytes[])#

Ontvang een aantal bytes van de slave.

Met deze functie kun je een of meerdere bytes ontvangen

uint8_t i2cSlaveAdress = 0x12
uint8_t data[4];
i2cReceiveBytes(i2cSlaveAdress, 4, data);

Parameters:
  • address – Het I2C-adres van de chip waar je iets van wilt ontvangen

  • number – Het aantal bytes wat de slave verstuurt

  • bytes – Een array om de ontvangen bytes in te plaatsen

void i2cReceiveFromRegister(uint8_t address, uint8_t slaveReg, uint8_t number, uint8_t bytes[])#

Start verbinding en stuur pointer adres en ontvang data.

Met deze functie kun je een slave register selecteren en direct de data daaruit ontvangen

uint8_t i2cSlaveAdress = 0x12
uint8_t i2cSlaveRegisterPointer= 0x02
uint8_t data[4];
i2cReceiveFromRegister(i2cSlaveAdress, i2cSlaveRegisterPointer, 4, data);

Parameters:
  • address – Het I2C-adres van de chip waar je iets van wilt ontvangen

  • slaveReg – Het betreffende pointer register binnen de slave

  • number – Het aantal bytes wat wordt verstuurd

  • bytes – Een array met de te versturen bytes

void i2cSetClock(clockSources source, uint16_t divider)#

Stel de i2c klok in (wanneer in MASTER modus)

In Master modus genereert de microcontroller de i2c-klok zelf. Stel met deze functie in van welke klokbron de module moet draaien en met welke waarde deze klok nog gedeeld moet worden. De uitkomst van deze deling is de uiteindelijk gebruikte klokfrequentie.

Parameters:
  • source – De klokbron waarop de module zal draaien.

  • divider – Deel de klokfrequentie door een 16 bits integer waarde.

void i2cStart()#

Stuur een startconditie.

void i2cStop()#

Stuur een stopconditie.