I2C adress för MCP4728 beter sig konstigt?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45176
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: I2C adress för MCP4728 beter sig konstigt?

Inlägg av TomasL »

Suck. Är det så svårt att förstå.
Vid normal användning fungerar det som ett helt vanligt I2C, dvs du använder de funktioner som din HAL och eventuell driver använder.
DET ÄR ENBART OM DU SKALL ÄNDRA KRETSENS ADRESS som du måste bit-banga, men det finns normalt sett INGA som helst behov att ändra kretsens adress.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: I2C adress för MCP4728 beter sig konstigt?

Inlägg av DanielM »

sodjan skrev: 2 maj 2022, 11:42:51 Men, var det fler än en i detta fall?
Annars är det väl bara att köra på default adressen?
Daniel, varför behöver du läsa adressen? Om du inte
innan har ändrat adressen så lär den ju vara = A0.
Jag har en
https://www.mouser.se/ProductDetail/Mic ... LvhQ%3D%3D

Alltså A2 = 1, A1 = 0, A0 = 0.
0b1100100 = 0x64 = 100
TomasL skrev: 2 maj 2022, 20:16:19 Suck. Är det så svårt att förstå.
Vid normal användning fungerar det som ett helt vanligt I2C, dvs du använder de funktioner som din HAL och eventuell driver använder.
DET ÄR ENBART OM DU SKALL ÄNDRA KRETSENS ADRESS som du måste bit-banga, men det finns normalt sett INGA som helst behov att ändra kretsens adress.
Det sa du inte igår natt. Då yrade du om att banga bit hit och dit och I2C går inte använda.
agehall
Inlägg: 418
Blev medlem: 12 augusti 2020, 19:27:54

Re: I2C adress för MCP4728 beter sig konstigt?

Inlägg av agehall »

Nej, det har varit rätt tydligt hela tråden att I2C-funktioner fungerar bra men men när du ska göra operationer som inte stödjs av I2C måste du hantera det manuellt.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45176
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: I2C adress för MCP4728 beter sig konstigt?

Inlägg av TomasL »

Du behöver nog glasögon, det jag skrev om var dina försök att läsa ut adressregistren, vilket var det tråden handlar om.
Jag analyserar min MCP4728 igenom att först kolla vad finns det för adresser.
Du hänvisar då till 5.3 och 5.3.1
Användarvisningsbild
rvl
Inlägg: 5721
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: I2C adress för MCP4728 beter sig konstigt?

Inlägg av rvl »

Har inte heller sett att Tomas skulle ha "yrat" nånting (i denhär tråden).
ToPNoTCH
Inlägg: 4847
Blev medlem: 21 december 2009, 17:59:48

Re: I2C adress för MCP4728 beter sig konstigt?

Inlägg av ToPNoTCH »

DanielM skrev: 2 maj 2022, 20:26:02 Alltså A2 = 1, A1 = 0, A0 = 0.
Vad är det nu som får dig att tro att A2 skall vara 1 ???


Namnlös.png
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: I2C adress för MCP4728 beter sig konstigt?

Inlägg av DanielM »

För jag köpte denna
https://www.mouser.se/ProductDetail/Mic ... LvhQ%3D%3D

Det är alltså MCP4728A4T.
Skärmklipp.PNG
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45176
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: I2C adress för MCP4728 beter sig konstigt?

Inlägg av TomasL »

Jösses
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: I2C adress för MCP4728 beter sig konstigt?

Inlägg av DanielM »

Ja, du tror man själv blir förvirrad då?
När jag får en C-funktion som kan kolla om en enhet är redo eller inte, dvs den I2C funktionen som jag använde mig utav. Då tolkar jag som att det ÄR den korrekta adressen, punkt.
Sedan vad databladet säger, är en helt annan betydelse.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45176
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: I2C adress för MCP4728 beter sig konstigt?

Inlägg av TomasL »

Jösses gäller ju dig, du försöker läsa från nånting som skall ligga på address 0, när du i verkligheten har din krets på adress 4.

Du skriver själv tidigare:

Kod: Markera allt

I2C_HandleTypeDef hi2c1;
uint8_t address = 0x0;
mcp4728_init(&hi2c1, address);
mcp4728_analogWrite(4095, 4095, 4095, 4095);
Dvs du försöker intitiera och skriva till/läsa från nånting som inte existerar, inte så konstigt att du har problem
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: I2C adress för MCP4728 beter sig konstigt?

Inlägg av DanielM »

Jag har alltid använt mig av en sådan for-sats för att kolla vad jag egentligen har för I2C adress.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45176
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: I2C adress för MCP4728 beter sig konstigt?

Inlägg av TomasL »

Och den kan inte fungera
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: I2C adress för MCP4728 beter sig konstigt?

Inlägg av DanielM »

Som vanligt har du fel.

0x1 och 0x0 är korrekta adresser.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45176
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: I2C adress för MCP4728 beter sig konstigt?

Inlägg av TomasL »

Nej, det är det inte.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45176
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: I2C adress för MCP4728 beter sig konstigt?

Inlägg av TomasL »

Så här är det daniel.
Funktionen du använder,

Kod: Markera allt

HAL_I2C_IsDeviceReady()
förväntar sig en vänsterskiftad adress.
Funktionen kontrollerar om du får en ACK eller inte.
Får du en ACK så antar funktionen att det finns en levande I2C-enhet.
Eftersom bit0 i adressen är en Läs/Skriv-flagga får funktionen en ACK när den först försöker skriva till adressen i fråga, dvs bit0 == 0, och den får en ACK när du försöker läsa från samma adress dvs bit0 == 1.

så, om du nu har en krets med A0=A1=A2 = 0 och DEV_ID är 0b1100 så blir din fulla I2C-address 0b11000000 för skrivning och 0b11000001 för läsning.
Eftersom du har en loop som går från 0-127 och sätter in den direkt i funktionen, så testar du skrivning och läsning på de I2C enheter som har den fulla adressen 0b11000000 till 0b11000111, dvs du testar läsning OCH skrivning för de första 64 enheterna, du testar alltså inte samtliga möjliga adresser.
Följaktligen får du en ACK 2 gånger för varje enhet, därav förleds du tro att kretsen har två adresser, vilket inte stämmer.
det finns två sätt för dig att göra detta korrekt:
Antingen

Kod: Markera allt

for(int i = 0 i >= 255; i+=2){
	  if(HAL_I2C_IsDeviceReady(&hi2c1, i, 10, 10) == HAL_OK){
		  address = i;
	  }
  }
Eller

Kod: Markera allt

for(int i = 0; i < 128; i++){
	  if(HAL_I2C_IsDeviceReady(&hi2c1, (uint16_t)(i<<1), 10, 10) == HAL_OK){
		  address = i;
	  }
  }
Som en notis måste jag nog säga att STs API-beskrivningar är under all kritik, de är fullständigt värdelösa, och saknar egentligen all nödvändig information.
Ytterligare en notis:
Om du får en ACK på både 0b1100 0000 och 0b1100 0001, vilket man kan tolka det som enligt ditt första inlägg, så har du inte köpt en A4-krets utan en A0-krets.
Skriv svar