[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