我正在使用連接到FPGA的FT232H器件,並且正在嘗試向其寫入一些字節。讀取(傳送FPGA→PC)完美工作,但寫入(傳送PC→FPGA)完全不起作用。我正在使用以下代碼:使用FT245同步模式寫入芯片
libusb_open(board, &board_handle);
if (libusb_kernel_driver_active(board_handle, 0) == 1) {
if(libusb_detach_kernel_driver(board_handle, 0) == 0);
}
libusb_set_configuration(board_handle, 1);
libusb_claim_interface(board_handle, 0);
libusb_control_transfer(board_handle, 0x40, 0x0B, 0x00FF, 0x01, NULL, 0, 5000);
libusb_control_transfer(board_handle, 0x40, 0x0B, 0x40FF, 0x01, NULL, 0, 5000);
libusb_bulk_transfer(board, 0x02, bufout, 3, &transfered, 5000);
bufin = calloc(512, 1);
libusb_bulk_transfer(board, 0x81, bufin, 512, &transfered, 5000);
Bufout
中充滿了數據。當我試圖將在FPGA上生成的一些數據發送到PC時,沒有問題; bufin
填充了正確的數據。
但是,當我試圖發送一些數據到FPGA,並顯示它在LED或發回它,問題開始。
無論bufout
的內容如何,我在FPGA站點上接收到的每個字節都是0xFF。 Bufout
和bufin
都被聲明爲無符號字符*。
unsigned char *bufin, *bufout;
令人驚訝的(或不)接收到的字節數FPGA匹配由PC sended的字節數,但所有字節具有值爲0xFF。
我做錯了什麼?
我試過使用libftdi,但效果是一樣的(不奇怪libftdi是使用libusb作爲引擎我認爲)。
也許我忘了在主機端調用一些重要的功能?在FPGA上側
代碼也很簡單:
process(ftdi_clk, sys_rst)
begin
if sys_rst = '0'then
ftdi_wr <= '1';
ftdi_data <= "ZZZZZZZZ";
ftdi_rd <= '1';
ftdi_oe <= '1';
read <= '1';
elsif rising_edge(ftdi_clk) then
if ftdi_txe = '0' then
ftdi_wr <= '0';
ftdi_data <= buf;
else
ftdi_wr <= '1';
ftdi_data <= "ZZZZZZZZ";
end if;
if (read = '0') and (ftdi_rxf = '0') then
ftdi_rd <= '0';
buf <= ftdi_data;
else
ftdi_rd <= '1';
end if;
if ftdi_rxf = '0' then
ftdi_oe <= '0';
read <= '0';
else
ftdi_oe <= '1';
read <= '1';
end if;
end if;
end process;
編輯:我已經檢查了所有可能的電氣配置,上拉,I/O電壓,一切似乎罰款。仍然所有從FTDI傳輸到FPGA的數據都是1,在2個獨立的芯片上檢查,所以很可能這是一個軟件問題。我已經檢查過仿真,即使是適配後的仿真,通信也應該按照文檔工作。
編輯2:我曾嘗試與原始供應商庫。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ftd2xx.h>
int main(){
FT_STATUS ftStatus;
FT_HANDLE ftHandle;
DWORD BytesWritten;
unsigned char data[512];
int i;
FT_PROGRAM_DATA ftData = {
0x00000000, 0xFFFFFFFF, // Headers
0x00000005, // Version (5 = 232H)
0x0403, 0x6014, // VID:PID
"StackOverflow", "Stack", "StackBoard", NULL,
500, 0, 1, 1, // MaxPower, PnP, SelfPowered, Remote WakeUp
// FT232B
0, 0, 0, 0, 0, 0, 0,
// FT2232
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
// FT232R
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
// FT2232H
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0,
// FT4232H
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0,
// FT232H
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0,
};
ftStatus = FT_Open(0, &ftHandle);
ftStatus = FT_SetTimeouts(ftHandle, 5000, 5000);
ftStatus = FT_EE_Program(ftHandle, &ftData);
ftStatus = FT_EE_Program(ftHandle, &ftData);
ftStatus = FT_SetBitMode(ftHandle, 0xFF, FT_BITMODE_SYNC_FIFO);
for(i = 0; i<512; i++) data[i] = 0x02;
ftStatus = FT_Write(ftHandle, data, 512, &BytesWritten);
printf("%d bytes written\n", BytesWritten);
ftStatus = FT_Read(ftHandle, &data, 512, &BytesWritten);
printf("%d bytes read\n", BytesWritten);
for(i = 0; i<BytesWritten; i++) printf("%#2x ", data[i]);
FT_Close(ftHandle);
}
還是完全一樣的行爲。我已將Linux內核更新爲最新版本(4.2.3),但結果相同。可悲的是我檢查了幾臺不同的機器和3個不同的芯片。
如果您嘗試將數據發送到另一臺PC上的終端仿真器,它會通過嗎? –
我有一個非常模糊的記憶,但也許它會給你一個線索。是否沒有必須編寫觸發閱讀的序列?就像,從地址A讀取X個字節? –
據我所知,這是CPU模式的工作原理。但是我處於FIFO模式,EEPROM編程爲FIFO模式。 (http://www.ftdichip.com/Support/Documents/DataSheets/ICs/DS_FT232H.pdf第27頁)。我正在密切關注文檔中的波形。但實際上讀取數據總線的時間總是包含0xFF,我將檢查FPGA內部的上拉/下拉配置,可能這是一個問題。 – mucka