I2C adress för MCP4728 beter sig konstigt?
Re: I2C adress för MCP4728 beter sig konstigt?
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.
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.
Re: I2C adress för MCP4728 beter sig konstigt?
Jag har en
https://www.mouser.se/ProductDetail/Mic ... LvhQ%3D%3D
Alltså A2 = 1, A1 = 0, A0 = 0.
0b1100100 = 0x64 = 100
Det sa du inte igår natt. Då yrade du om att banga bit hit och dit och I2C går inte använda.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.
Re: I2C adress för MCP4728 beter sig konstigt?
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.
Re: I2C adress för MCP4728 beter sig konstigt?
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.
Du hänvisar då till 5.3 och 5.3.1Jag analyserar min MCP4728 igenom att först kolla vad finns det för adresser.
Re: I2C adress för MCP4728 beter sig konstigt?
Har inte heller sett att Tomas skulle ha "yrat" nånting (i denhär tråden).
Re: I2C adress för MCP4728 beter sig konstigt?
Vad är det nu som får dig att tro att A2 skall vara 1 ???
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: I2C adress för MCP4728 beter sig konstigt?
För jag köpte denna
https://www.mouser.se/ProductDetail/Mic ... LvhQ%3D%3D
Det är alltså MCP4728A4T.
https://www.mouser.se/ProductDetail/Mic ... LvhQ%3D%3D
Det är alltså MCP4728A4T.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: I2C adress för MCP4728 beter sig konstigt?
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.
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.
Re: I2C adress för MCP4728 beter sig konstigt?
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:
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
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);
Re: I2C adress för MCP4728 beter sig konstigt?
Jag har alltid använt mig av en sådan for-sats för att kolla vad jag egentligen har för I2C adress.
Re: I2C adress för MCP4728 beter sig konstigt?
Som vanligt har du fel.
0x1 och 0x0 är korrekta adresser.
0x1 och 0x0 är korrekta adresser.
Re: I2C adress för MCP4728 beter sig konstigt?
Så här är det daniel.
Funktionen du använder, 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
Eller
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.
Funktionen du använder,
Kod: Markera allt
HAL_I2C_IsDeviceReady()
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;
}
}
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;
}
}
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.