[elektro] AVR TWI nyug
Szima Gábor
sygma at tesla.hu
Thu Mar 13 08:46:02 CET 2008
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
More information about the Elektro
mailing list