안녕하세요 저는 간단한 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 읽기 사용 : 잘못된 읽기에서
스크린 샷 : 으로는 WR 두 개의 시계 TXE 후 두 경우 모두에서 낮은 넣어 볼 수있다
낮은 간다. 결함이 읽기
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 바이트 이상)를 설정하면 놀라 울 정도로 작동합니다. 하지만 여전히 나는 이유를 이해하지 못합니다 ..