[elektro] [Avr-hun] AVR TWI nyug
Andras Tantos
andras at tantosonline.com
Thu Mar 13 15:50:41 CET 2008
Hali!
Az I2C/TWI interfeszen az ACK bit mindig az adatkuldes iranyaval
ellentetesen megy, azaz slave TX eseten az ACK bitet a master kuldi. Ha a
master egyszer NACK-ot kuld, akkor *kotelezo* stop bitet is generalni (es
viszont, stop bit elott kotelezo NACK-ot kuldeni), de ezt azt hiszem
manualisan kell kerni a TWI periferiatol az AVR-ben.
Udv,
Tantos Andras
----- Original Message -----
From: "Szima Gábor" <sygma at tesla.hu>
To: "Elektro Lista" <elektro at tesla.hu>; "AVR Lista" <avr-hun at x-dsl.hu>
Sent: Thursday, March 13, 2008 12:46 AM
Subject: [Avr-hun] AVR TWI nyug
>
> Sziasztok!
>
> Kuzdok a TWI (I2C)-vel ket AVR kozott. Mega16 a Master, Mega8 a Slave.
>
> A kovetkezo szerint van felepitve a kod:
>
> http://hubbard.engr.scu.edu/avr/avrlib/docs/html/i2c_8c-source.html
>
> Elmeletileg oda-vissza mennek az adatok, csak van egy kis gond. Megpedig
> az, hogy amikor a Slave-en TX eseten elfogynak a kuldendo adatok, hiaba
> kuldok NAK-ot, a Masterhez ez el sem jut (status valtozatlan), es
> mindaddig gyotri szegenyt, amig a veteli oldalon (Master RX) be nem telik
> a puffer (akkor kapcsolja csak le a vetelt).
> Ebben az esetben a Slave biztosan nem ad, mert FF-ek jonnek.
>
> A kerdeses kodreszlet (Slave TX)
>
> 00545 case TW_ST_DATA_ACK: // 0xB8: data byte has been
> transmitted, ACK has been received
>
> 00551 // transmit data byte
> 00552 outb(TWDR, I2cSendData[I2cSendDataIndex++]);
> 00553 if(I2cSendDataIndex < I2cSendDataLength)
> 00554 // expect ACK to data byte
> 00555 outb(TWCR,
> (inb(TWCR)&TWCR_CMD_MASK)|BV(TWINT)|BV(TWEA));
> 00556 else
> 00557 // expect NACK to data byte
> 00558 outb(TWCR, (inb(TWCR)&TWCR_CMD_MASK)|BV(TWINT));
> 00559 break;
>
> Illetve (Master RX)
>
> 00404 case TW_MR_DATA_NACK: // 0x58: Data received, NACK
> reply issued
> 00410 // store final received data byte
> 00411 I2cReceiveData[I2cReceiveDataIndex++] = inb(TWDR);
> 00412 // continue to transmit STOP condition
> 00413 case TW_MR_SLA_NACK: // 0x48: Slave address not
> acknowledged
> 00414 case TW_MT_SLA_NACK: // 0x20: Slave address not
> acknowledged
> 00415 case TW_MT_DATA_NACK: // 0x30: Data not
> acknowledged
> 00421 // transmit stop condition, enable SLA ACK
> 00422 i2cSendStop();
> 00423 // set state
> 00424 I2cState = I2C_IDLE;
> 00425 break;
>
> A TW_MR_DATA_NACK (0x58) statusz akkor jon, amikor a Master az RX-puffer
> elfogyasakor kuld en NAK-ot (sajat maganak?).
>
> A sebesseg 100 es 400 kHz, az SCL/SDA labakon Master oldalon aktiv
> aramgeneratoros (kb. 15-15 mA) felhuzas van, a vezetek kb. 2 meter.
>
>
> Mi lehet a problema?
>
>
> -Sygma
>
> _______________________________________________
> Avr-hun mailing list
> Avr-hun at x-dsl.hu
> http://x-dsl.hu/mailman/listinfo/avr-hun_x-dsl.hu
>
More information about the Elektro
mailing list