首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以FT245同步模式写入芯片

以FT245同步模式写入芯片
EN

Stack Overflow用户
提问于 2015-10-16 19:14:48
回答 1查看 1.1K关注 0票数 2

我正在使用连接到现场可编程门阵列的FT232H设备,并且我正在尝试向它写入一些字节。读取(transfer FPGA->PC)工作正常,但写入(transfer PC->FPGA)根本不起作用。我使用了以下代码:

代码语言:javascript
复制
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,并将其显示在leds上或发回时,问题开始出现。

无论bufout内容如何,我在现场可编程门阵列接收的每个字节都是0xFF。Bufoutbufin都声明为unsigned char *。

代码语言:javascript
复制
unsigned char *bufin, *bufout;

令人惊讶的是(或不是) FPGA接收的字节数与PC发送的字节数匹配,但所有字节的值均为0xFF。

我做错了什么吗?

我尝试使用libftdi,但效果是一样的(我认为libftdi使用libusb作为引擎并不奇怪)。

也许我忘了在主机端调用一些重要的函数?

FPGA端的代码也非常简单:

代码语言:javascript
复制
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;

编辑:我已经检查了所有可能的电气配置,拉升,输入/输出电压,一切正常。尽管如此,所有从FTDI传输到FPGA的数据都是在两个独立的芯片上检查的数据,所以很可能是软件问题。我已经检查了模拟,即使是后拟合模拟,通信应该是按照文档工作的。

EDIT2:我已经尝试过原始的厂商库了。

代码语言:javascript
复制
#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个不同的芯片。

EN

回答 1

Stack Overflow用户

发布于 2015-11-04 06:07:27

我不确定这是否是你唯一的问题,但我认为你的ftdi_data出现了一些短路。当ftdi_oe处于活动状态时,它可以同时由FPGA驱动。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33169125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档