Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

Reading the status of GPIO when configured for I2C

Status
Not open for further replies.

Prasad.hegde.sirsi

Newbie level 2
Joined
Nov 2, 2011
Messages
2
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Activity points
1,302
Hi,
I would like to implement I2C on GPIO's in Infineon microcontroller. I need a small help.
I am using bit banging technology, while reading the status of the GPIO pin, do I need to make the pin as input and read? (Because there is no GPIO status register).
What will be the status of the pin if previously the pin is configured in output mode and driven to low?

Thanks for your answers, if anyone needs more clarity I would like to write more about this.

Regards
Prasad
 

By I2C design, the pin will be only read in open drain state (when it's tri-stated). In other words, it's already set as input.
 

Hi,
Thanks for your inputs, still I am facing issues with this.
Our microcontroller GPIO's are in such a way that both input and output stages can be enabled at the same time.
What I am doing is as follows.
1. Enable both in/out stage.
2. Enable pull up from the AARDWARK reader (which is slave).
3. Send the address byte by bitbanging and write each data bit to the GPIO in OUT register.

Now problem!!
While I am reading the ack from the slave, I read the ack bit from the IN register and clock pulse is generated properly. And this returns me always '1' where as slave has to pull this low for the acknoledge.
I am not able to figure out what is the problem,
whether slave is not able to pull out the SDA to low? or the SDA line is not in the tristate? Am I missing something here?

Thanks in advance for the help
Prasad
 

In bit-banging I2C operation, you'll usually drive the pins by the direction register, leaving the output latch in low state. This way, the output changes betweeen output low and tristate. According to I2C standard, both SDA and SCL are operated this way. If none of the involved I2C slaves is performing clock stretching, SCL can be operated push-pull without problems, saving the power for a strong SCL pull-up resistor and speeding up edges.
 

If your controller using software i2c in master mode, you can use pull-up and open drain only for SDA line. Slave devices can't drive SCL. So, after you send last bit and waiting acknowledge, you need to reconfigure SDA pin as input and read their status on next SCL pulse.
 

Slave devices can't drive SCL.
They actually do if implementing clock stretching. It can be often found with microprocessor slaves and other complex peripherals.
 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top