Dzień dobry,
Mam nietypowy problem z zapisem pamięci I2C z serii 24...1024/1025/1026 (różnią się tylko adresowaniem). Krótki wstęp: pamięci te mają dwa bloki po 512kb każdy. Blok jest wybierany po przesłaniu bajtu kontrolnego (control byte) z 7-bitowym adresem, przykładowo dla pamięci 24...1026 control byte ma postać [1 0 1 0 A2 A1 B0 R/W] gdzie B0 to wybór jednego z dwóch bloków, A0 i A1 sprzętowe adresowanie (w moim przypadku - masa) i R/W (odczyt/zapis).
Aby zapisać 1-wszy blok przesyłam Control Byte = 0xA0, aby zapisać drugi blok Control Byte = 0xA2.
Teraz do rzeczy.
- odczytuje pierwszy i drugi blok bezbłędnie
- zapisuje tylko pierwszy blok, a na drugim transmisja się wiesza od razu po przesłaniu control byte. Jak próbuje zapisać od razu drugi blok - to samo. Tak jakby przesłany adres (0xA2) był nieprawidłowy - jednak w trybie odczytu wszystko działa, więc tego typu błąd wykluczam.
- a teraz żeby było ciekawiej - w trybie debugowania wszystko działa step-by-step i transmisja się nie wiesza, jak puszczę program z marszu i ustawię break-point na timeout_callback, to widać że transmisja się wiesza zaraz po przesłaniu adresu (control byte) w trybie zapisywania (w trybie odczytu jest OK.)
Dodam, że komunikacja z pamięcią 24..512 działa niezawodnie (tam jest jeden blok). Z ciekawości sprawdziłem też dla 24...16 (tam jest 8 bloków) i co ciekawe - również działa.
Korzystam z przykładu od ST dla pamięci EEPROM z wykorzystaniem ich bibliotek od I2C.
Czy ktoś miał podobny problem albo ma pomysł co może być przyczyną?
Mam nietypowy problem z zapisem pamięci I2C z serii 24...1024/1025/1026 (różnią się tylko adresowaniem). Krótki wstęp: pamięci te mają dwa bloki po 512kb każdy. Blok jest wybierany po przesłaniu bajtu kontrolnego (control byte) z 7-bitowym adresem, przykładowo dla pamięci 24...1026 control byte ma postać [1 0 1 0 A2 A1 B0 R/W] gdzie B0 to wybór jednego z dwóch bloków, A0 i A1 sprzętowe adresowanie (w moim przypadku - masa) i R/W (odczyt/zapis).
Aby zapisać 1-wszy blok przesyłam Control Byte = 0xA0, aby zapisać drugi blok Control Byte = 0xA2.
Teraz do rzeczy.
- odczytuje pierwszy i drugi blok bezbłędnie
- zapisuje tylko pierwszy blok, a na drugim transmisja się wiesza od razu po przesłaniu control byte. Jak próbuje zapisać od razu drugi blok - to samo. Tak jakby przesłany adres (0xA2) był nieprawidłowy - jednak w trybie odczytu wszystko działa, więc tego typu błąd wykluczam.
- a teraz żeby było ciekawiej - w trybie debugowania wszystko działa step-by-step i transmisja się nie wiesza, jak puszczę program z marszu i ustawię break-point na timeout_callback, to widać że transmisja się wiesza zaraz po przesłaniu adresu (control byte) w trybie zapisywania (w trybie odczytu jest OK.)
Dodam, że komunikacja z pamięcią 24..512 działa niezawodnie (tam jest jeden blok). Z ciekawości sprawdziłem też dla 24...16 (tam jest 8 bloków) i co ciekawe - również działa.
Korzystam z przykładu od ST dla pamięci EEPROM z wykorzystaniem ich bibliotek od I2C.
Czy ktoś miał podobny problem albo ma pomysł co może być przyczyną?