Sida 1 av 1

i2c och SPI på samma bus

Postat: 14 april 2006, 15:27:47
av DragonOrb
Hej

Håller på med ett projekt.
Det är en PIC18F4550.
Där ska det sitta en Real-time clock (DS1337) som använder i2c bussen.
Sedan ska jag även ha ett minne 25AA256 som använder SPI-bussen.

SPI och I2C använder ju samma pinnar på pic´en. Jag har kollat igenom databladet och kollat på google men inte hittat något.

Kan man köra dom på samma buss ?

Postat: 14 april 2006, 15:37:26
av bearing
SPI kräver att man "chipselectar" på en pinne medans i2c har mjukvaruadressering (har jag för mig). Antar att det är där problemet kommer hamna. Om i2c-enheten har en chipselect-pinne borde det inte vara något problem.

Postat: 14 april 2006, 15:46:04
av Icecap
På i²C kan slaven hålla CLK låg under en väntperiod, alltså _kan_ det skita sig vid vissa data men det är mest en teoretisk möjlighet.

Postat: 14 april 2006, 16:06:45
av DragonOrb
Vid nogrannare koll av databladet så vill även DS1337 att man skickar adressen till den.

Såhär ser det ut för att skriva till den.

Kod: Markera allt

Start data transfer: A change in the state of the data line, from HIGH to LOW, while the clock is HIGH, defines a
START condition

Acknowledge: Each receiving device, when addressed, is obliged to generate an acknowledge after the reception
of each byte. The master device must generate an extra clock pulse that is associated with this acknowledge bit.

Stop data transfer: A change in the state of the data line, from LOW to HIGH, while the clock line is HIGH,
defines the STOP condition.

"Start > Skicka adressen 1101000 > R/W  > Acknowledge > Data >  Acknowledge > STOP "

Detta är om man kör DS1337´n i slavemode
Att man lyckas med detta är väll inte så stor chans. Jag kör på :)

Postat: 14 april 2006, 16:23:13
av bearing
Även? det var ju den som skulle ha det! (i2c)
(minneskretsen ha väl ingen adress? annat än dataadresserna)

Jag är rädd att data du skickar med SPI kommer att råka bli instruktioner till i2c-enheten.

Men nu kom jag på en ide', använd en bufferkrets, typ 74HC244 mellan uC:en och enheterna.

Postat: 14 april 2006, 16:42:16
av DragonOrb
Har löst problemet nu:

Från databladet till PIC´en

Kod: Markera allt

SPI-Mode:
 Serial Data Out (SDO)  RC7/RX/DT/SDO
 Serial Data In (SDI)  RB0/AN12/INT0/FLT0/SDI/SDA
 Serial Clock (SCK)  RB1/AN10/INT1/SCK/SCL
I2C använder "Serial DATA In (SDI)" för att prata med UC´n.
Så alla kommandon man skickar till SPI-minnet skickas över "Serial Data Out"
Inget som I2C-bussen känner av.

Jag ska läsa databladen nogrannare i framtiden :lol:

Postat: 14 april 2006, 16:53:14
av sodjan
Vanlig fråga.

Och det vanligaste svaret är att det sannolikt kommer att bli problem.

En lösning är att köra I2C via MSSP modulen och bit-banga SPI (eftersom SPI är enklare).

Eller, det självklara alternativt, se till att RTC och EEPROM kör *samma* interface, I2C *eller* SPI.

> I2C använder "Serial DATA In (SDI)" för att prata med UC´n.

Alltså så skickar du data till SPI minnets utgång när du skickar på I2C.
Jag vet inte om minnet tål det, men det kanske är satt i High-Z, när det inte är "valt".

Det är hur som helst ingen vidare bra lösning...

Postat: 14 april 2006, 18:26:24
av DragonOrb
Får göra som du säger.

Tack för hjälpen ialafall. :)

Postat: 14 april 2006, 18:57:05
av sodjan
> Får göra som du säger.

Om "du" är jag, vilket av alternativen ?

Postat: 14 april 2006, 19:50:58
av DragonOrb
> Om "du" är jag, vilket av alternativen ?

Bit-banga SPI

:)