Hallo,
Ik heb een fpga die pulsen telt van een motor encoder en een microcontroller met usb. nu wilde ik de data van de fpga via i2c doorsturen naar de microcontroller. dus software gevonden/geschreven in verilog en asm. alleen het probleem is dat de fpga op 3,3V werkt en niet 5 volt tolerant is. de microcontroller geeft wel 0 en 5 volt.
hoe kan ik dit oplossen dat bijde lijnen naar 3,3v gaan. en andersom 3,3 naar 5V. ben niet echt ervaren in de electronica dus hoop dat iemand me kan helpen
mvg,
Torius
rimco
Digitaal - Mijn ding :P
weerstand in serie richting de fpga, en een zenerdiode parallel in sper bij de fpga. en de uC zou signalen van 3,3 V al moeten rekenen als 1 voor zover ik heb gemerkt.
sommige chippies zijn 5V input tolerant. Dat zou het verhaal een stukkie makkelijker maken.
Als dat bij jouw niet het gaval is: bustranciever voor de SDA lijn (SCL kan waarsch ernaast, maar denk niet dat je met multimaster in weer wilt??)
BTW doe je het voor die SCL niet, dan moet je die ook nog omzetten dus kan idd ook via die bustranciver
simpel, I2C werkt met pull-ups, als je microcontroller-pins standaard TTL aankunnen (1=hoog nivo=2,4 volt) gaat het goed als je de pull-ups van de I2C-bus aan 3,3 volt hangt.
Verder zijn d'r I2C level translator chipjes te krijgen die een 3,3V bus naar een 5V bus omzetten.
een device die I2C stuurt mag de bus omlaag trekken(pull-down) voor een 0, of loslaten voor een 1. Maar NOOIT actief een 1 aanbieden (+3,3/+5 volt) op de bus. De pull-ups doen dat. Anders gaat er iets roken.
stel 1 device trekt de bus omlaag terwijl de andere de boel omhoog duwt, dat geeft hoge stromen door de IC's.
free_electron
Silicon Member
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
kan je de microcontroller I/O in open drain of open collector programmeren ? indien ja is je probleem opgelost. pull ups naar 3.3 volt en vooruit met de geit
je high-level is hoog genoeg voor de 5 volt controller
indien dit niet kan :
effe rekenen : 5 - 3.3 = 1.7 stroom van 4 milliampere geeft mij pakweg 400 ohm (1600 /4 ). plak daar 470 ohm in serie met de scl en sda lijn en vort met de geit.
de esd diodes in de fpga doen de rest.
eigenlijk is het niet proper en ik ben de laatste om zoiets te doen , maar voor een one-off circuitje kan het
[Bericht gewijzigd door free_electron op ]
dat geintje gaat alleen lukken als je OOK pull-ups naar de 3,3 volt neerzet.
Probleem, als je de SDA van de controller als ingang programmeert (was hier d8 ik de bedoeling, data VAN fpga NAAR microcontroller) heb je ineens geen pull-up meer die het hoge nivo vastlegt als je alleen een serieweerstand van 470 ohm gebruikt (zoals voorgesteld)
Op 30 oktober 2006 15:18:27 schreef free_electron:
kan je de microcontroller I/O in open drain of open collector programmeren ? indien ja is je probleem opgelost. pull ups naar 3.3 volt en vooruit met de geit
als de uC een I2C interface heeft staan deze volgens mij altijd in open collector of open drain: anders zou je immers de pull ups niet nodig hebben extern toch?
Let wel op ik weet dat atmel ook interne pull ups weer kan activeren. ik weet neit of hij dan nog in open drain of open collector zit. IIG moeten ze uit, want die knoopt ze aan VCC wat 5 V zal zijn.
Wat je ook even moet checken: of je input TTL compatible is. Als hij CMOS compatible is, gaat de hele vlieger uiteraard niet op
Hallo
Allereerst bedankt voor de reacties.
Ehm de print met de microcontroller is al een bestaande print en op de print wordt geen 3,3V aangeboden, dus is een hoop modificatie voor mij om er 3,3V op te krijgen.
Dus het lijkt mij het handigst om een translator chipje op de fpga print te zetten die een 5V bus naar een 3,3V bus omzetten. zat te denken aan de 74LVC4245A. gaat dit werken? of de max3370, maar die is volgens mij moeilijker te verkrijgen?
mvg,
Torius
dat kan niet, die 74LVC4245A translator is weliswaar bidirectioneel, maar helaas niet de voor I2C zo nodige open-drain/collector.
@HmH: zijn die interne pull-ups niet voor als dat pinnetje ingang is ? (ken atmel niet, dus weet niet exact.)
ik zit nog te denken aan een smerige truuk met een NPN-tor in common-base geschakeld met de emitter aan de 3,3 volt zijde en de collector aan de 5 volt zijde, maar die zou wel eens niet 100% bidirectioneel kunnen zijn.
free_electron
Silicon Member
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
vcx of lcx4245 pakken. die heeft 2 vcc poten. ene voor 3.3 volt en ene voor 5 volt.
maar wat ik schreef voor die level shifting met die weerstand:
SCL is unidirectioneel ( als je tenminste geen multimaster aant maken bent )
dus voor die poot ist opgelost. daar je mage je zelfs push pull voor gebruiken en is open collector niet nodig)
SDA : als je die poot open collecotr zet ist ook opgelost.
dat je op je computer bord geen 3.3 volt hebt is gene probleem
op je fpga bord heb je 3.3 : zet daar je pull-up naar de 3.3 volt. en tis ook opgelost
free_electron
Silicon Member
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
Op 30 oktober 2006 15:38:47 schreef DC2PCC:
dat geintje gaat alleen lukken als je OOK pull-ups naar de 3,3 volt neerzet.Probleem, als je de SDA van de controller als ingang programmeert (was hier d8 ik de bedoeling, data VAN fpga NAAR microcontroller) heb je ineens geen pull-up meer die het hoge nivo vastlegt als je alleen een serieweerstand van 470 ohm gebruikt (zoals voorgesteld)
lees tweede zin in mijn eerste post 
ik praat over externe pull-up plaatsen.
free_electron
Silicon Member
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
Op 30 oktober 2006 16:08:13 schreef High met Henk:
[...]
als de uC een I2C interface heeft staan deze volgens mij altijd in open collector of open drain: anders zou je immers de pull ups niet nodig hebben extern toch?Wat je ook even moet checken: of je input TTL compatible is. Als hij CMOS compatible is, gaat de hele vlieger uiteraard niet op
bij een echte i2c wel ja.als je bitbangt ... opletten geblazen.
ook voor cmos is een hoog al 2.4 volt hoor.
hmm, externe pull-up naar 3,3 volt en dan richting MCU nog een serie-R van 470 ohm, akkoord, maar hoe trek je de FPGA dan vanuit de MCU naar 0 ?
of neem je een heel grote waarde voor de pull-up (4k7 ofzo)?
Op 30 oktober 2006 17:33:36 schreef free_electron:
bij een echte i2c wel ja.als je bitbangt ... opletten geblazen.
Dat stond er toch ook:.
Op 30 oktober 2006 16:08:13 schreef High met Henk:
[...]als de uC een I2C interface heeft[...]
ik ging ervanuit dat men die dan ook gebruikte 
ook voor cmos is een hoog al 2.4 volt hoor.
das waar, ik was ind e war met de uitgang, dis is 4,9 ofzo met een heel groot middengebied waar hij niet gedefinieerd is, sorry, foutje mijnerzijds, had het grafisch plaatje van de uitgang in mijn hoofd
Back to het probleem
Ik heb zo'n probleem met geheugen wat aan een data en adress bus hangt met 3,3 en 5 V.
Voor de unidirectionele gebruik ik de 74LVC245.
voor de bidirectionele de 74LVC244.
(of was het nou andersom)
dat lijkt goede resultaten te bieden.
[Bericht gewijzigd door High met Henk op ]
Op 30 oktober 2006 20:28:15 schreef High met Henk:
Back to het probleem
Ik heb zo'n probleem met geheugen wat aan een data en adress bus hangt met 3,3 en 5 V.
Voor de unidirectionele gebruik ik de 74LVC245.
voor de bidirectionele de 74LVC244.
(of was het nou andersom)
dat lijkt goede resultaten te bieden.
Dat werkt voor geheugens inderdaad prima.
MAAR die chipjes zijn GEEN open-collector/open drain chipjes.
EN je moet bij de bidirectionele chip zelf aangeven in welke richting die moet doorgeven. Bij I2C heb je dat doorgaans niet, omdat dat dan een extra lijn kost.
Daar moet een chip dus zelf uitzoeken of het van A naar B of van B naar A moet.
free_electron
Silicon Member
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
Op 30 oktober 2006 20:28:15 schreef High met Henk:
had het grafisch plaatje van de uitgang in mijn hoofdVoor de unidirectionele gebruik ik de 74LVC245.
ik haal ook soms VILmax , VIHmin , VOLmax en VOHmin door elkaar. . de truuk is : de VI's liggen dichter bij elkaar dan de VO's.
LVC's zijn inderdaad tolerant voor 5 volt.
en 5 volt logica is al content met een VIHmin van 2.4, en de VOHmin van een 3.3 volt systeem is 2.8 of zoiets. dus dat past perfect.
LCX is de cross-volt technoloigie( der zijn maar ene paar chips in die famileie.) die dingen hebben echt 2 voedingsspanningen.
Op 30 oktober 2006 17:30:44 schreef free_electron:
SCL is unidirectioneel ( als je tenminste geen multimaster aant maken bent )
dus voor die poot ist opgelost. daar je mage je zelfs push pull voor gebruiken en is open collector niet nodig)
Ik denk er toch iets anders over.
Als een chip de communicatie niet kan bijhouden, zal deze de SCL-lijn laag houden tot de data is gelezen. Dit moet dus WEL bidirectioneel zijn!
free_electron
Silicon Member
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
Op 31 oktober 2006 18:28:15 schreef Onbekend:
[...]Ik denk er toch iets anders over.
Als een chip de communicatie niet kan bijhouden, zal deze de SCL-lijn laag houden tot de data is gelezen. Dit moet dus WEL bidirectioneel zijn!
der is geen ENKELE i2c chip die dat doet !!!!
geen ENKELE .
de eneig eplaats waa rhet gedaan wordt is bij sommigge eeproms en dan is het nog in de ACK cycle.
de spec voorziet dat maar de slaves zijn te stom om dat te implementeren
dat is een techniek om tussen masters waar er ge-bitbanged wordt dergelijke dingen te kunnen doen.