I want to test the I2C protocol between two STM32 (STM32L152RC) microcontrollers. Can somebody guide me on how to do it or suggest tutorials?
I have seen some online portals where they are communicating between a microcontroller and any sensor. That I have done already. Now I want to test it between two MCU boards.
I want to test the I2C protocol between two STM32 (STM32L152RC) microcontrollers. Can somebody guide me on how to do it or suggest tutorials?
I have seen some online portals where they are communicating between a microcontroller and any sensor. That I have done already. Now I want to test it between two MCU boards.
I want to test the I2C protocol between two STM32 (STM32L152RC) microcontrollers. Can somebody guide me on how to do it or suggest
tutorials?
I have seen some online portals where they are communicating between
a microcontroller and any sensor. That I have done already. Now I
want to test it between two MCU boards.
On 05/07/2022 15:28, Neelakantappa M wrote:
I want to test the I2C protocol between two STM32 (STM32L152RC)
microcontrollers. Can somebody guide me on how to do it or suggest
tutorials?
I have seen some online portals where they are communicating between
a microcontroller and any sensor. That I have done already. Now I
want to test it between two MCU boards.
I am always a little sceptical about using I²C between microcontrollers,
and a lot more sceptical about using it between boards. It can be good enough in simple cases, but all too often I have seen systems that
started out simple, and ended up trying to do far too much with I²C.
It is a protocol that works well with a microcontroller as the master communicating with slow slave devices (simple ADC/DACs, small EEPROMs,
etc.) on the same board. It works poorly when you need more data
transfer or higher speeds, and can be quite inefficient on many microcontrollers when they are acting as slaves.
It is also less than ideal for off-board traffic. For short range, with closely coupled ground and little electrical noise, it can work fine -
but it does not work well over longer distances, and multi-master (or
even multi-slave, with microcontroller slaves) can be very awkward. I
have seen systems where I²C has been used for bigger inter-card buses,
and the effort required to make it stable, noise-free and reliable meant
it was more costly and complex than alternatives such as CAN or RS-485
would have been.
So my advice here is to think about where you are going in the future.
I²C might be the most convenient protocol between two cards on your
desk. But will it be the best choice for the final product - or its
future versions? Obviously only you can answer that, but if it is not,
then it is better to think about it now than later.
I found that I2C peripherals embedded in most of MCUs are very complex
and most of the time they aren't reliable.
After some testing, I usually decide to write a bit-banging I2C code.
On 6 Jul 2022 at 09:52:23 CEST, "pozz" <pozzugno@gmail.com> wrote:
I found that I2C peripherals embedded in most of MCUs are very complex
and most of the time they aren't reliable.
After some testing, I usually decide to write a bit-banging I2C code.
I have to agree here. I2C is conceptually simple, bu it is an edge triggered protocol and is very sensitive to noise unless you use buffer devices. It
is excellent for master devices, but writing the slave software is much more complex to cover all cases.
On 6 Jul 2022 at 09:52:23 CEST, "pozz" <pozzugno@gmail.com> wrote:
I found that I2C peripherals embedded in most of MCUs are very complex
and most of the time they aren't reliable.
After some testing, I usually decide to write a bit-banging I2C code.
I have to agree here. I2C is conceptually simple, bu it is an edge triggered protocol and is very sensitive to noise unless you use buffer devices.
It
is excellent for master devices, but writing the slave software is much more complex to cover all cases. >
A client of ours carefully wrote hardware drivers for their CPUs and put
them on test. They saw one failure every hour or so. They then reverted
to the bit-bang drivers supplied by us with the compiler. No failures in two weeks.
I have looked at these problems every few years or so, and the problem
for hardware drivers has always been fast noise pulses on the I2C lines.
By fast I mean up to several 10s of nanoseconds at a volt or so.
On the other hand we once did a hospital autoclave for which all I/O was
over I2C and it was rock solid ... but we used the recommended buffer
chips everywhere.
Il 06/07/2022 10:27, Stephen Pelc ha scritto:
On 6 Jul 2022 at 09:52:23 CEST, "pozz" <pozzugno@gmail.com> wrote:
I found that I2C peripherals embedded in most of MCUs are very complex
and most of the time they aren't reliable.
After some testing, I usually decide to write a bit-banging I2C code.
I have to agree here. I2C is conceptually simple, bu it is an edge triggered >> protocol and is very sensitive to noise unless you use buffer devices.
Sorry for my stupid question, what do you mean with buffer devices?
When you have master and slave on the same board, you put a wire between SDA/SCL pins and a couple of pull-up resistors.
On the other hand we once did a hospital autoclave for which all I/O was
over I2C and it was rock solid ... but we used the recommended buffer
chips everywhere.
Again, what are buffer chips?
On 06/07/2022 10:27, Stephen Pelc wrote:
On 6 Jul 2022 at 09:52:23 CEST, "pozz" <pozzugno@gmail.com> wrote:
I found that I2C peripherals embedded in most of MCUs are very complex
and most of the time they aren't reliable.
After some testing, I usually decide to write a bit-banging I2C code.
I have to agree here. I2C is conceptually simple, bu it is an edge
triggered
protocol and is very sensitive to noise unless you use buffer devices. It
is excellent for master devices, but writing the slave software is
much more
complex to cover all cases.
A key problem for I²C is the multi-drop nature of the lines. The edges themselves are not the big problem, it is the weak pull-up that leaves
the lines very susceptible to noise and interference. SPI has edges, as
do most protocols with a clock signal, but there the master drives high
and low, giving a far more "solid" line.
I²C can be fine in simple cases, but there are several less-used
features that complicate it, especially when used together. That
includes multi-master, clock stretching, 10-bit addressing, and newer
faster speeds. Good luck trying to make a microcontroller slave that
works with all of that!
There is also the possibility of bus hang and invalid states. This can
hit you during development - if you stop your microcontroller and
restart it (perhaps with a new program version) in the middle of an I²C transaction, you can leave the slaves stuck - they may need a reset or power-cycle to recover.
On 07/06/22 10:52, David Brown wrote:
On 06/07/2022 10:27, Stephen Pelc wrote:
On 6 Jul 2022 at 09:52:23 CEST, "pozz" <pozzugno@gmail.com> wrote:
I found that I2C peripherals embedded in most of MCUs are very complex >>>> and most of the time they aren't reliable.
After some testing, I usually decide to write a bit-banging I2C code.
I have to agree here. I2C is conceptually simple, bu it is an edge
triggered
protocol and is very sensitive to noise unless you use buffer
devices. It
is excellent for master devices, but writing the slave software is
much more
complex to cover all cases.
A key problem for I²C is the multi-drop nature of the lines. The edges
themselves are not the big problem, it is the weak pull-up that leaves
the lines very susceptible to noise and interference. SPI has edges, as
do most protocols with a clock signal, but there the master drives high
and low, giving a far more "solid" line.
I²C can be fine in simple cases, but there are several less-used
features that complicate it, especially when used together. That
includes multi-master, clock stretching, 10-bit addressing, and newer
faster speeds. Good luck trying to make a microcontroller slave that
works with all of that!
There is also the possibility of bus hang and invalid states. This can
hit you during development - if you stop your microcontroller and
restart it (perhaps with a new program version) in the middle of an I²C
transaction, you can leave the slaves stuck - they may need a reset or
power-cycle to recover.
The original Iic from Philips was for consumer equipment and has
worked well for that sort of application, but it's not robust enough
for professional work imho. I would never use it unless an io
device needed it, such early Teletext devices. As you say spi
is a far better sorted design...
Chris
On 7/7/2022 19:19, chris wrote:
On 07/06/22 10:52, David Brown wrote:
On 06/07/2022 10:27, Stephen Pelc wrote:
On 6 Jul 2022 at 09:52:23 CEST, "pozz" <pozzugno@gmail.com> wrote:
I found that I2C peripherals embedded in most of MCUs are very complex >>>>> and most of the time they aren't reliable.I have to agree here. I2C is conceptually simple, bu it is an edge
After some testing, I usually decide to write a bit-banging I2C code. >>>>
triggered
protocol and is very sensitive to noise unless you use buffer
devices. It
is excellent for master devices, but writing the slave software is
much more
complex to cover all cases.
A key problem for I²C is the multi-drop nature of the lines. The edges
themselves are not the big problem, it is the weak pull-up that leaves
the lines very susceptible to noise and interference. SPI has edges, as
do most protocols with a clock signal, but there the master drives high
and low, giving a far more "solid" line.
I²C can be fine in simple cases, but there are several less-used
features that complicate it, especially when used together. That
includes multi-master, clock stretching, 10-bit addressing, and newer
faster speeds. Good luck trying to make a microcontroller slave that
works with all of that!
There is also the possibility of bus hang and invalid states. This can
hit you during development - if you stop your microcontroller and
restart it (perhaps with a new program version) in the middle of an I²C >>> transaction, you can leave the slaves stuck - they may need a reset or
power-cycle to recover.
The original Iic from Philips was for consumer equipment and has
worked well for that sort of application, but it's not robust enough
for professional work imho. I would never use it unless an io
device needed it, such early Teletext devices. As you say spi
is a far better sorted design...
Chris
I basically agree but things are not that bad as long as one
does not push things too far. For me the worst part has been dealing
with in-built I2C controllers, used two and both worked but each
took me *days* to defeat - unlike the first time I used I2C
some decades ago, bitbanging it from a HC11, which took me
only an hour or two. Never used an MCU as an I2C slave yet, may
do so soon but who knows.
The peripherals I have used - some eeprom, RTC, ADC and perhaps
some I can't think of now have all behaved; of course one has to
deal with hanged bus situations, I have not seen a part which
needs repower to get fixed (must have been lucky I guess).
I have managed to upset the bus, being open drain, routing it
too close to a flyback convertor switch, the latter doing 100V
excursions "pretty fast" (tens of ns for the 100V I think).
Changing the pullups on the I2c from 2k to 1k fixed that
(still not that much of "too close", some luck again :).
======================================================
Dimiter Popoff, TGI http://www.tgi-sci.com ====================================================== http://www.flickr.com/photos/didi_tgi/
On 7/7/22 12:49 PM, Dimiter_Popoff wrote:Isn't that why SMBus was invented?
On 7/7/2022 19:19, chris wrote:
On 07/06/22 10:52, David Brown wrote:
On 06/07/2022 10:27, Stephen Pelc wrote:
On 6 Jul 2022 at 09:52:23 CEST, "pozz" <pozzugno@gmail.com> wrote:
I found that I2C peripherals embedded in most of MCUs are veryI have to agree here. I2C is conceptually simple, bu it is an edge
complex
and most of the time they aren't reliable.
After some testing, I usually decide to write a bit-banging I2C code. >>>>>
triggered
protocol and is very sensitive to noise unless you use buffer
devices. It
is excellent for master devices, but writing the slave software is
much more
complex to cover all cases.
A key problem for I²C is the multi-drop nature of the lines. The edges >>>> themselves are not the big problem, it is the weak pull-up that leaves >>>> the lines very susceptible to noise and interference. SPI has edges, as >>>> do most protocols with a clock signal, but there the master drives high >>>> and low, giving a far more "solid" line.
I²C can be fine in simple cases, but there are several less-used
features that complicate it, especially when used together. That
includes multi-master, clock stretching, 10-bit addressing, and newer
faster speeds. Good luck trying to make a microcontroller slave that
works with all of that!
There is also the possibility of bus hang and invalid states. This can >>>> hit you during development - if you stop your microcontroller and
restart it (perhaps with a new program version) in the middle of an I²C >>>> transaction, you can leave the slaves stuck - they may need a reset or >>>> power-cycle to recover.
The original Iic from Philips was for consumer equipment and has
worked well for that sort of application, but it's not robust enough
for professional work imho. I would never use it unless an io
device needed it, such early Teletext devices. As you say spi
is a far better sorted design...
Chris
I basically agree but things are not that bad as long as one
does not push things too far. For me the worst part has been dealing
with in-built I2C controllers, used two and both worked but each
took me *days* to defeat - unlike the first time I used I2C
some decades ago, bitbanging it from a HC11, which took me
only an hour or two. Never used an MCU as an I2C slave yet, may
do so soon but who knows.
The peripherals I have used - some eeprom, RTC, ADC and perhaps
some I can't think of now have all behaved; of course one has to
deal with hanged bus situations, I have not seen a part which
needs repower to get fixed (must have been lucky I guess).
I have managed to upset the bus, being open drain, routing it
too close to a flyback convertor switch, the latter doing 100V
excursions "pretty fast" (tens of ns for the 100V I think).
Changing the pullups on the I2c from 2k to 1k fixed that
(still not that much of "too close", some luck again :).
======================================================
Dimiter Popoff, TGI http://www.tgi-sci.com
======================================================
http://www.flickr.com/photos/didi_tgi/
My experience is that to handle a "stuck" I2C bus, sometimes you need to
be able to turn "off" the I2C controller and manually "bit-bang" up to (generally) 8 I2C clock pulses, until the slave that is stuck lets go of
the I2C Data line, then you can force a START-STOP code (by pulling the
data line low then high with the clock high) to get the bus into a
usable state.
On 08/07/2022 04:22, Richard Damon wrote:
Isn't that why SMBus was invented?
My experience is that to handle a "stuck" I2C bus, sometimes you need
to be able to turn "off" the I2C controller and manually "bit-bang" up
to (generally) 8 I2C clock pulses, until the slave that is stuck lets
go of the I2C Data line, then you can force a START-STOP code (by
pulling the data line low then high with the clock high) to get the
bus into a usable state.
Sysop: | Keyop |
---|---|
Location: | Huddersfield, West Yorkshire, UK |
Users: | 308 |
Nodes: | 16 (2 / 14) |
Uptime: | 90:14:15 |
Calls: | 6,923 |
Calls today: | 1 |
Files: | 12,382 |
Messages: | 5,433,959 |