logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[LPC1765][OV7670] - Niestabilna komunikacja po SCCB przy użyciu sprzętowego I2C

trwgQ26xxx 20 Sie 2012 17:47 2136 1
REKLAMA
  • #1 11227777
    trwgQ26xxx
    Poziom 11  
    Posty: 28
    Pomógł: 1
    Ocena: 103
    Witam kolegów bardzo serdecznie,

    natrafiłem na kosmiczny wręcz problem podczas próby odczytu\zapisu rejestrów kamery OV7670. Mianowicie, wykorzystując
    Cytat:
    MCB1700 Sample Code Bundle for LPC1769 Peripherals using LPCXpresso V2.00 (Jan 10, 2011)
    pobranej z tej strony Link nie mogę w żaden sposób dogadać się z kamerą.

    Wzorując się podanym przykładem, aby odczytać dane ustawień (tu akurat pierwsze 20 bajtów) z kamery powinienem napisać :
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    PORT_USED = 0, gdyż korzystam z I2C0. Powyższy kod nie działa, otrzymuję same 0x00. Gdy jednakże ograniczę się do takiego "prymitywizmu" :
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    ... to te 20 bitów zostaje bez problemu odczytane(od adresu 0x00, domyślny po resecie). Ponadto w większości zgadzają się z datasheetem OV7670(poza pierwszym bajtem, gdzie dostaję 0xFF, zamiast domyślnego w dokumentacji 0x00). Co więcej udaje się to tylko jeden raz po resecie procesora(powyższe operacje + wysłanie oczytanych danych przez terminal wywoływałem cyklicznie w pętli).

    Ponadto chcę zaznaczyć, że korzystałem już z tej biblioteki do komunikacji z czujnikiem MPL115A2 czy pamięciami AT24Cxx, i nie miałem żadnych problemów.

    Jeżeli chodzi o sprzęt, to I2C0 mam skonfigurowane na P0.27 i P0.28 (piny open-drain), do tego dwa pull-upy 2k2 do +2V8 (Bo I/O kamery chodzi na 2V8). Kamera tak samo jak procesor jest zasilana 3V3, ma stabilizatory 2V8 i 1V8 na własnym PCB. Do nóżki XCLK podłączony jest sygnał z generatora kwarcowego (typowy DIL16 na 5V) 14.31818MHz poprzez dzielnik rezystorowy złożony z dwóch rezystorów 10k (może tutaj jest problem ?). Pin RESET jest oczywiście podłączony do 2V8.

    Na forum TI, w dziale o
    Cytat:
    DaVinci™ Video Processors
    w temacie Link (jeśli dobrze zrozumiałem oczywiście) problem może zostać rozwiązany poprzez ustawienie bitu IGNACK w rejestrach I2C. Jednakże w moim User Manualu do LPC17xx nie znalazłem niczego podobnego. Domyślam się, że tak jak czytam w tym dokumencie Link problem polega na tym, że po ostatnim odczycie procesor powinien wysłać NACK, a tego nie robi i OV7670 dalej chce wysyłać dane a procesor przerywa komunikację. Skutkuje to tym, że dalsza komunikacja jest niemożliwa.

    Czy moje rozumowanie jest poprawne? Gdzie popełniam błąd? Może próba wykorzystania sprzętowego I2C to zły pomysł i powinienem napisać własne software'owe funkcje ?
  • REKLAMA
  • #2 11243122
    trwgQ26xxx
    Poziom 11  
    Posty: 28
    Pomógł: 1
    Ocena: 103
    Po paru dniach znów usiadłem do tego tematu i udało mi się rozwiązać problem, "zrzynając" kod z jakiegoś projektu z Ebay'a dostarczanego z tą kamerą. Oryginalnie biblioteka była dla AVR(!), ale po zmianie kilku makr kompiluje się w LPCXpresso.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Komentarze są w języku chińskim, także zabawa jest przednia.
    Cytat:
    Publiczność wstała i nagrodziła jego haniebny czyn brawami. A wszyscy szanujący się fachowcy starej daty załamali ręce, gdyż wiedzieli, że pojawi się problem z ilością danych.
REKLAMA