2013-05-01 2 views
0

안녕하세요 저는 간단한 DSO를 개발 중이고 FT245 sync FIFO에 문제가 있습니다. 4 바이트 승인을 읽을 때 FT245를 읽는 것이 정상적으로 작동하지만 샘플 데이터를 검색하려면 0 바이트를 반환합니다. ftdi_read_data는 0을 반환하고 연속 읽기는 -84와 -32를 반환합니다 (이 코드의 의미는 없습니다). readig에 대한FTDI sync에서 읽음 FT245 FIFO가 0 바이트를 반환합니다

기능 :

int Ft245sync::read(unsigned char * buf) 
{ 
    int res = ftdi_read_data(ftdic, buf, getReadChunkSize()); 
    std::cerr << "res rd: " << res << std::endl; 
    return res; 
} 

코드 읽기가 발생합니다

부 작동 (인정 읽기) :

//send SET TRIGGER 
recvbuf[0] = 0; 
while(recvbuf[0] != DATA_OK) 
{ 
    unsigned char buf3[10] = { SET_TRIGGER, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; 
    if(ft245.write(buf3) < 0) 
    { 
     std::cerr << "Error writing data3\n"; 
    } 
    if(ft245.read(recvbuf) < 0) 
    { 
     std::cerr << "Error receiving data\n"; 
    } 
} 

부 작동하지 않는 :

//send START CAPTURE 
unsigned char buf5[10] = { START_CAPTURE, 0x05, 0, 0, 0, 0, 0, 0, 0, 0 }; 
if(ft245.write(buf5) < 0) 
{ 
    std::cerr << "Error writing data5\n"; 
} 
usleep(700); 
std::cout << "Capture started\n"; 
for (int i = 0; i < 30; ++i) 
{ 
    if(ft245.read(recvbuf) < 0) 
    { 
     std::cerr << "Error reading data\n"; 
    } 
} 

에서 칩 스코프에서 Screenchots 읽기 사용 : 잘못된 읽기에서 enter image description here

스크린 샷 : 으로는 WR 두 개의 시계 TXE 후 두 경우 모두에서 낮은 넣어 볼 수있다 enter image description here

낮은 간다. 결함이 읽기

 when SEND_ACKNOWLEDGE0 => 
      if to_boolean(ft245busy) then 
       state <= SEND_ACKNOWLEDGE0; 
      else 
       state <= SEND_ACKNOWLEDGE1; 
      end if; 
     when SEND_ACKNOWLEDGE1 => 
      ft245rw <= '1'; 
      responseCounter <= "000"; 
      ft245din <= "10000000"; 
      if (ft245wr = '0') then 
       state <= SEND_ACKNOWLEDGE2; 
       ft245strobe <= '0'; 
      else 
       ft245strobe <= '1'; 
       state <= SEND_ACKNOWLEDGE1; 
      end if; 
     when SEND_ACKNOWLEDGE2 => 
      if (responseCounter < 1) then 
       responseCounter <= (responseCounter + 1); 
       ft245din <= "10000000"; 
       state <= SEND_ACKNOWLEDGE2; 
      else 
       ft245dataWaitIn <= '1'; 
       ft245rw <= '0'; 
       responseCounter <= "000"; 
       case command is 
        when "10101110" => 
         state <= INIT0; 
        when "00010000" => 
         state <= SET_VREF0; 
        when "00010001" => 
         state <= SET_VLOG0; 
        when "00100000" => 
         state <= SET_ATTENUATORS; 
        when "00100001" => 
         state <= SET_COUPLINGS; 
        when "00110000" => 
         state <= SET_DECIMATION; 
        when "00110001" => 
         state <= SET_ANALOGTRIGGER; 
        when "00110010" => 
         state <= SET_DIGITALTRIGGER; 
        when "01000000" => 
         state <= START_CAPTURE; 
        when others => 
         state <= IDLE; 
       end case; 
      end if; 

부 :의 VHDL 코드의

일부는 읽기 워킹

 when DUMP_DATA_PREPFT => 
      if to_boolean(ft245busy) then 
       state <= DUMP_DATA_PREPFT; 
      else 
       state <= DUMP_DATA0; 
      end if; 
     when DUMP_DATA0 => 
      adc1pd <= '1'; 
      adc2pd <= '1'; 
      ft245rw <= '1'; 
      bufferDataDirection <= '0'; 
      answerNumber <= "00"; 
      ft245din <= "01010000"; 
      if ((ft245wr = '0') and to_boolean(bufferReady)) then 
       state <= DUMP_DATA1; 
       ft245strobe <= '0'; 
      else 
       ft245strobe <= '1'; 
       state <= DUMP_DATA0; 
      end if; 
     when DUMP_DATA1 => 
      ft245din <= "01010000"; 
      ft245dataWaitIn <= '0'; 
      answerNumber <= (answerNumber + 1); 
      if (answerNumber = 3) then 
       state <= DUMP_DATA2; 
       bufferOutputInputReady <= '1'; 
      else 
       state <= DUMP_DATA1; 
      end if; 

그리고 코드 내 FT245 컨트롤러의 (보기의 FPGA 지점에서 쓰기) 읽기에 대한 책임이있다 :

 when IDLE => 
      if (strobe = '1') then 
       busy <= '1'; 
       if (rw = '1') then 
        state <= WRITE_PREP; 
       else 
        state <= READ_PREP; 
       end if; 
      else 
       busy <= '0'; 
       state <= IDLE; 
      end if; 
     when WRITE_PREP => 
      if (txe = '0') then 
       state <= WRITE; 
      else 
       state <= WRITE_PREP; 
      end if; 
     when WRITE => 
      if ((txe = '0') and (not to_boolean(dataWaitIn))) then 
       wr_int <= '0'; 
      else 
       wr_int <= '1'; 
       state <= IDLE; 
       busy <= '0'; 
      end if; 

그리고 프로그램 출력 목록이 있습니다 :

res wr: 10 
res rd: 4 
res wr: 10 
Capture started 
res rd: 0 
res rd: 0 
res rd: -84 
Error reading data 
res rd: -32 
Error reading data 
res rd: -32 
... 

내 관점에서 볼 때 FPGA의 모든 것이 OK (칩 스코프에 따라 다름)이며 프로그램 읽기는 동일하므로 왜 작동하는지, 그리고하지 않는지 (필자는 성공적으로 수십 개의 쓰기/읽기 사이클이 4byte인지 확인합니다.) ...

// 편집 : 엄청나게 큰 들어오는 버퍼 (16000 바이트 이상)를 설정하면 놀라 울 정도로 작동합니다. 하지만 여전히 나는 이유를 이해하지 못합니다 ..

답변

1

들어오는 버퍼를 최대 바이트 수 인 32768 바이트로 설정하여 해결했습니다. 지금 잘 작동합니다. 506 바이트마다 정렬되지 않은 바이트 (1 바이트 꺼짐)가 있습니다.하지만 아마 그럴 것입니다. 내 FPGA 디자인의 일부 오류.

// 편집 : 참고로, 가장 큰 문제는 타이밍이 아니라는 것입니다 (예 : 11ns 홀드 타이밍을 위반하더라도 올바르게 작동합니다. 예를 들어 7ns 만 설정할 수 있음). 상태 버퍼가 전체 개미 TXE는 하이가되고 TXE가 로우로 되돌아 가면 올바르게 전송됩니다.

1

Chipscope는 내부 만 보여줍니다. 당신이한다고

더 확인 사항 :

  • 당신이 FTDI 칩에 모든 IO 핀에 제대로 타이밍을 제한 있나요?
  • FTDI 칩의 핀에서 모든 타이밍 요구 사항을 충족했는지 (빠른 범위 사용) 확실합니까?

오류가 발생한 경로의 논리가 사양을 벗어났습니다.

관련 문제