Page 1 of 1

Software I2C Slave

Posted: Wed Jun 27, 2018 4:06 am
by OutoftheBOTS_
I have created a software I2C Slave written in C for a STM32F10x chip but it would require very little modification to be able to run a STM32F4x chip used by a number of the MicroPython boards.

The code uses a hardware interrupt on the SDA line to detect a start condition sent from the master then disables the interrupt and deals with the transmission from the master. After the completion of the transmission it enables the interrupt and returns to your main code.

At the moment it is very basic and doesn't have a timeout watch dog as I haven't yet added it.

This is my very first ever C program so am keen for feedback so that I can learn.

I am not sure how complex it would be to modify it and add it to the MicroPython firmware that run on STMF4x chips but if anyone would like to have a poke at it the code is here https://github.com/OutOfTheBots/I2C_Slave-STM32f10x

Re: Software I2C Slave

Posted: Wed Jun 27, 2018 4:15 pm
by pythoncoder
Boards running STM32F4x chips such as the Pyboards can run pyb which supports I2C slave mode. You could look at the source to see how it is integrated into MicroPython.

Re: Software I2C Slave

Posted: Wed Jun 27, 2018 10:19 pm
by OutoftheBOTS_
Boards running STM32F4x chips such as the Pyboards can run pyb which supports I2C slave mode.
Yes it has a Slave mode but I was unable to use it.

Has anyone here managed to make it work??

When I posted here asking about it everyone said the same thing that they couldn't get it to work. I asked the guys at OpenMV cam and they said they were unable to get I2C Slave to work in micropython because of the same reason of master getting a NACK from Micropython Slave.

It didn't seem to have a callback system for when the master sends a start condition this means the master receives a NACK when it tries to start a transmission.

There doesn't seem to be a system where you can make a data_register to place data in for the master to read or write too.

This is why I wrote my I2C Slave driver as it has a n interrupt on the SDA line that detects the master sending a start condition. It also has a bytearray 256 bytes big that both the master and slave can read/write too.

Last night I added that the master will be able to read/write up to 256 bytes in 1 transmission.

Re: Software I2C Slave

Posted: Wed Jun 27, 2018 10:26 pm
by OutoftheBOTS_
You could look at the source to see how it is integrated into MicroPython.
This is my first C program and am still finding my way around C. It is my aim to learn how to be able to modify/contribute to MicroPython firmware but atm it is still probably a little over my head.

Before it can be added I also need to learn how to add a timeout to my code because at the moment if the tranmission broke half way though the slave will just sit there waiting for the next pulse of the SCL line instead to exiting the interrup and returning to the progrma after a time out period.

Any idea on the best way to implement a timeout watchdog??

Re: Software I2C Slave

Posted: Thu Jun 28, 2018 4:35 am
by OutoftheBOTS_
I have added a timeout now so that if it gets stuck in a loop for any lenght of time it will exit the interrupt and return to main program.
updated code here https://github.com/OutOfTheBots/I2C_Slave-STM32f10x