[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [oc] I2C polling question
> > I was referring specifically to this: When I want to write several
> > bytes to the slave, do I need to set the STOP bit explicitly when
> > transmitting the last char or do I first transmit it and _then_
> > the problem.
>--
>This I2C core is byte based. So any multibyte transfer is broken down into
>several 1 byte transfers. I think after the address phase (1 byte transfer
>from master), every successive byte is transferred only after the
>interrupt for the current byte transfer is serviced.The ISR for this
>should be somewhat like this :
> a) read SR and verify that TIP='0'
> b) Write next byte into TXR
> c) Write into CR to set WR bit and IACK bit
>This sequence is repeated for every byte transfer. Note that for the
>address phase , additionally STA also has to be set in CR. Do not set the
>STA/STO bits in any subsequent ISRs, until the last byte to be transferred
>is written to TXR. In that ISR, set the STO bit along with the above
>mentioned bits.
> -- I think the diagram given in the programming example in the spec doc
>is slightly wrong bcos it shows back to back transfers : actually there is
>a ISR phase in between. During that time the core will hold
>SCL line low.Any comments Richard .......?
I assume you are talking about "example 2". As described in the "commands"
section there is an ISR stage between each byte transfer. But I assumed the
ISR to be much faster than the I2C bus, so I made it look like a continuous
transfer. Between each byte transfer the core will hold the SCL and SDA
lines in the current state, which is low for SCL and transfer dependant for
SDA.
>
> > Also, I found out by simulation
> > that the TIP and ACK flags are not set properly, ACK being 0 at
> > startup whereas it should be 1 (NACK!), and TIP being strobed
>
>-- I think ACK being '0' or '1' during startup does'nt make any difference
>in the functioning of the core. TIP shows '0' correctly. Also it is not
>required to know the 'exact' moment when the byte goes out into the
>I2C bus, as the processor will anyway get an interrupt on completion
>
> >
> > At read, do I need to issue NACK/ACK commands explicitly or implicitly,
> > at the time the last byte being read or _after_ it is read. No mention
> > of this in the docs. The example, once again does not scale to multiple
>
>-- The I2C specs say that the I2C slave has to issue a ACK on every
>intermediate byte transfers and a NACK on the last byte transfer for
>write. I did'nt quite get what does implicit/explicit setting mean. The
>I2C core does generate ACK/NACK on reads.
>-- One discrepancy I found when core is doing a slave read is that during
>the first read (immediately after the address phase following a slave
>ACK), the RxACK bit gets set. This happens almost immediately after
>the D7 bit transfer. I found no reason why it should get set there. I am
>yet to look into the code in detail , but any pointers ?
Wow, this is a strange bug. Does the bug also occur in the new core
version, or is it a bug in the old version ??
A final question/thought;
Is the I2C document unclear and should it be updated, or are these problems
which should be handled by a FAQ (on the web-page) ??
If the document is unclear please send any comments/updates and I will
incorporate them. If we should have some kind of FAQ please help to
assemble it.
Richard
>Regards, Ujjal.
>
>
> > f.
> > --
> > To unsubscribe from cores mailing list please visit
> http://www.opencores.org/mailinglists.shtml
> >
>
>
>
>--
>To unsubscribe from cores mailing list please visit
>http://www.opencores.org/mailinglists.shtml
--
To unsubscribe from cores mailing list please visit http://www.opencores.org/mailinglists.shtml