LPC2138I2C

Salam

Code:

/ *

I2C ondersteuning voor LPC21xx(c) 2004 Yuri Tjomkin (Yuri (at) tnkernel.com)Inclusief drivers:- EEPROM 24xx-serie (van 24XX04 tot 24XX512)

- Real Time Clock DS1307

- I / O-extender PCA9555

- Temperatuursensor LM75Ondersteunt uCOS-II en TNKernelDEZE SOFTWARE WORDT DOOR DE YURI tiomkin EN BIJDRAGERS `` AS IS''AND

ENIGE EXPLICIETE OF IMPLICIETE GARANTIES, INCLUSIEF, MAAR NIET BEPERKT TOT DE

IMPLICIETE GARANTIES VAN VERKOOPBAARHEID EN GESCHIKTHEID VOOR EEN BEPAALD DOEL

ARE DISCLAIMED.
IN GEEN GEVAL YURI tiomkin OF BIJDRAGERS AANSPRAKELIJK

VOOR ENIGE DIRECTE, INDIRECTE, INCIDENTELE, SPECIALE, MORELE OF GEVOLGSCHADE

SCHADE (INCLUSIEF MAAR NIET BEPERKT TOT VERWERVING VAN VERVANGENDE GOEDEREN

OF DIENSTEN; VERLIES VAN GEBRUIK, GEGEVENS OF WINSTEN, OF ONDERBREKING VAN WERKZAAMHEDEN)

OOK VEROORZAAKT EN OP ELKE THEORIE VAN AANSPRAKELIJKHEID, HETZIJ IN CONTRACT, STRIKTE

AANSPRAKELIJKHEID OF ONRECHTMATIGE DAAD (INCLUSIEF NALATIGHEID OF ANDERS) die op enigerlei wijze

UIT HET GEBRUIK VAN DEZE SOFTWARE, ZELFS INDIEN IS GEWEZEN OP DE MOGELIJKHEID VAN

DERGELIJKE SCHADE.* /
 
Nog I2C Code

Code:

/ * Dit is een gewijzigde I2C module gebaseerd op de code van Pierre Seguin * /

/ * Het testen van de status van alle transacties en geeft alle foutcodes * /

/ * Via een "longjmp" * /

/ * Het is gemakkelijk is gewijzigd om direct weer de status codes in plaats van * /

/ * Het gebruik van de longjmps * /

/ * Deze code geeft een foutmelding waarde van 1 voor de meest likley fout: - * /

/ * - Geen apparaat beschikbaar.
Dit is niet een code die kan worden verward met de * /

/ * Status standaard waarden. * /

/ * Een monster van het gebruik ervan is getBattery () met behulp van een PCF8591 A / D-apparaat * /

/ * Owen Mooney * /jmp_buf i2cerror;# define STA 0x20

# define SIC 0x08

# define SI 0x08

# define STO 0x10

# define STAC 0x20

# define AA 0x04void InitI2C (void) (

I2CONCLR = 0xFF;

PINSEL0 | = 0x50; / / Set pinouts als SCL en SDA

I2SCLL = 19 / / snelheid 100Khz voor een VPB Klok Divider = 4 bij 14 MHz

I2SCLH = 19;

/ / I2SCLL = 60; / / snelheid 375Khz voor een VPB Klok Divider = 1

/ / I2SCLH = 70; / / Pierre Seguin oorspronkelijke waarden.

I2CONSET = 0x40; / / Active Master Mode op I2C-bus

)void SendI2CAddress (unsigned char Addr_S) (

unsigned char r;

I2CONCLR = 0xFF; / / clear I2C - opgenomen als gebruiker vergat "StopI2C ()"

/ / Else deze functie zou hangen.

I2CONSET = 0x40; / / Active Master Mode op I2C-bus

if ((Addr_S & 0x01)) / / test als het lezen

I2CONSET = STA | AA; / / set STA - laten kapitein acknowlege slave;

anders

I2CONSET = STA; / / set STA dont laten erkent;

while (I2STAT! = 0x08) / / Wacht tot beginnen te vullen

I2DAT = Addr_S; / / Charge slaaf Adres

I2CONCLR = SIC | STAC; / / Clear I2C onderbreken beetje om de gegevens te verzenden

while (! (I2CONSET & SI)); / / wachten tot de status beschikbaar

R = I2STAT; / / te lezen Status.
Zie standaard foutcodes pdf (link in de handleiding).

if (! (Addr_S & 0x01)) (/ / als we doen een schrijven

if (r! = 0x18) (/ / kijken naar "SLA W is doorgegeven; ACK is ontvangen"

if (r == 0x20) / / check voor "SLA W is doorgegeven; NIET ACK is ontvangen"

longjmp (i2cerror, 1); / / geen acknowlege - waarschijnlijk geen apparaat daar.
Terug een 1 in longjmp

longjmp (i2cerror, r); / / andere fout - return status code in longjmp

)

) Else (

if (r! = 0x40) (/ / kijken naar "SLA R is doorgegeven; ACK is ontvangen"

if (r == 0x48) / / check voor "SLA R is doorgegeven; NIET ACK is ontvangen"

longjmp (i2cerror, 1); / / geen acknowlege - waarschijnlijk geen apparaat daar.
Terug een 1 in longjmp

longjmp (i2cerror, r); / / andere fout - return status code in longjmp

)

)

)unsigned char ReadI2C (void) (

unsigned char r;

I2CONCLR = SIC; / / helder SIC;

while (! (I2CONSET & 0x8)) / / wachten tot de status beschikbaar

R = I2STAT; / / controleren op fouten

if (r! = 0x50) (/ / kijken naar "Data byte is ontvangen; ACK is teruggekeerd"

longjmp (i2cerror, r); / / te lezen niet

)

return I2DAT;

)void WriteI2C (unsigned char data) (

unsigned char r;

I2DAT = Data; / / Charge Data

I2CONCLR = 0x8; / / SIC; Clear i2c onderbreken beetje te sturen de gegevens

while (! (I2CONSET & 0x8)) / / wachten tot de status beschikbaar

R = I2STAT;

if (r! = 0x28) (/ / kijken naar "Data byte in S1DAT is doorgegeven; ACK is ontvangen"

longjmp (i2cerror, r); / / schrijven niet

)

)void StopI2C (void) (

I2CONCLR = SIC;

I2CONSET = STO;

while ((I2CONSET & STO)); / / wachten Stopped I2C-bus

)float getBattery (void) (/ / Lees de accuspanning met een PCF8591 A / D-apparaat

unsigned char err, r;

char mess [10];

int x;

InitI2C ();

if (err = setjmp (i2cerror)) (

if (err == 1)

fout ( "no A / D-apparaat gevonden");

anders

sprintf (puinhoop, "I2C fout% d", err);

error (mess);

return;

)

SendI2CAddress (0x90) / / PCF8591 A / D-apparaat adres

WriteI2C (0); / / Stel de controle poort waarde

WriteI2C (0); / / en de D / A-uitgang

StopI2C ();

SendI2CAddress (0x91) / / Start de lees

ReadI2C (); / / dummy lezen cyclus te doen de eerste conversie

R = ReadI2C (); / / lees het resultaat

StopI2C ();

return r * 12.15/118 / / terugkeer van de accuspanning

)
 
Ik gebruikte de LPC2148 en 8 PCA9555 met behulp van deze code.Alles behalve leuk StopI2C functie.Het moet veranderen, op de hand soms wacht voor eeuwig.

void StopI2C (void) (
I20CONSET = STO;
I20CONCLR = SIC;
while ((I20CONSET & STO)); / / wachten Stopped I2C-bus
)

 
HELP.Ik heb fout: Temperat.c (4): error: # 20: identifier "jmp_buf" is undefined

(Keil mVision 3)Toegevoegd na 6 minuten:Ohh lol))) Ik heb een fout gecorrigeerd.

Ik zou aansluiten bibliotheek: setjmp.h

 

Welcome to EDABoard.com

Sponsor

Back
Top