2013-11-21 1 views
0

Поэтому мне нужно написать приложение в Android, который должен быть в состоянии прочитать данные, что исходит от FPGA SPARTAN 6.USB передачи хост Android с Spartan 6 FPGA

Мое приложение может определить, когда подключен USB , и может получить информацию о интерфейсах и конечных точках по этим интерфейсам. Но тогда ему нужно прочитать данные, которые кто-то посылает при нажатии кнопки, и это происходит, когда приложение выходит из строя.

Мой код выглядит следующим образом:

package com.example.usb; 

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.hardware.usb.*; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.widget.TextView; 

public class MainActivity extends Activity 
{ 
private UsbManager usbManager; 
private UsbDevice device; 
private TextView tv; 

Handler handler = new Handler() 
{ 
    public void handleMessage(Message m) 
    { 
     Integer datos = (Integer)m.obj; 
     tv.setText(datos + "\n"); 
    } 
}; 


@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    tv = (TextView)findViewById(R.id.tv); 
    usbManager = (UsbManager)getSystemService(Context.USB_SERVICE); 
} 

@Override 
protected void onResume() 
{ 
    super.onResume(); 
    Intent intent = getIntent(); 
    String action = intent.getAction(); 
    if (action.equals(UsbManager.ACTION_USB_DEVICE_ATTACHED)) 
    { 
     //conectar dispositivo 
     device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); 
     //muestraDatos(device); 
     UsbInterface intf = device.getInterface(1); 
     UsbEndpoint epIN = getIN(device); 
     //tv.setText(epIN.getDirection() + " " + epIN.getType()); 
     UsbDeviceConnection connection = usbManager.openDevice(device); 
     new Thread(new Read(connection,intf,epIN,handler)).start(); 
    } 
} 

private UsbEndpoint getIN(UsbDevice device) 
{ 
    UsbInterface intf = device.getInterface(1); 
    UsbEndpoint ep = null; 
    int numep = intf.getEndpointCount(); 
    for (int i = 0 ; i < numep ; i++) 
    { 
     UsbEndpoint aux = intf.getEndpoint(i); 
     if (aux.getDirection() == UsbConstants.USB_DIR_IN && aux.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) 
     { 
      ep = aux; 
     } 
    } 
    return ep; 
} 

и нить чтения (которая должна читать из FPGA) является:

package com.example.usb; 

import android.hardware.usb.UsbDeviceConnection; 
import android.hardware.usb.UsbEndpoint; 
import android.hardware.usb.UsbInterface; 
import android.os.Handler; 
import android.os.Message; 

public class Read implements Runnable 
{ 
private UsbDeviceConnection connection; 
private UsbEndpoint epIN; 
private Handler handler; 
private UsbInterface intf; 

    public Read(UsbDeviceConnection connection,UsbInterface intf,UsbEndpoint epIN,Handler handler) 
{ 
    this.connection = connection; 
    this.epIN = epIN; 
    this.handler = handler; 
    this.intf = intf; 
} 

public void run() 
{ 
    byte datos[] = new byte[50]; 
    int read_data = 0; 

    if (connection.claimInterface(intf,true)) 
    { 
     /*Message sms = new Message(); 
     sms.obj = "Success caliming interface: " + intf.getEndpointCount(); 
     handler.sendMessage(sms);*/ 
     //connection.controlTransfer(0x00000080, 0x03, 0x4138, 0, null, 0, 0); 


     while (true) 
     { 
      try 
      { 
       Thread.sleep(500); 
      } 
      catch(InterruptedException e){} 
      read_data = connection.bulkTransfer(epIN, datos, datos.length, 100); 
      datos = new byte[50]; 
      //if (read_data > -1) 
      //{ 
       Message sms = new Message(); 
       sms.obj = read_data; 
       handler.sendMessage(sms); 
      //} 
     } 
    } 
    else 
    { 
     Message sms = new Message(); 
     sms.obj = "Fail claiming interface "; 
     handler.sendMessage(sms); 
    } 



} 

}

Моя цель здесь это просто покажите количество байтов, которые считаются с функцией bulktransfer, но ничего не показывают. Кроме того, я верю, что мне нужно использовать функцию controlTransfer, но официальная документация не объясняет ничего о функции, это просто темная ссылка. Я видел сообщения вроде этого Android 4.0.3. USB Host - sending data via controlTransfer и этого Serial to USB Android application with health device, но не совсем понятно, что означает каждый параметр в функции. Кто-нибудь знает, что я делаю неправильно и/или имеет хорошее объяснение функции controTransfer?

+1

Вы хотели бы начать, имея гораздо лучше идеи о том, что операции ** ** именно аппаратное устройство требует - это не будет то, что кто-то без документации для конкретного устройства, которое вы используете, будет знать, если вы не сможете сказать, что он реализует какую-то известную схему. Вы действительно реализуете USB-движок непосредственно в FPGA (возможно, но необычно), или используете ли вы интерфейс USB-интерфейса? –

+0

Ну, я, правда, ничего не реализовал в FPGA. Предполагается, что FPGA отправит строку бит, и мне нужно будет записать эти биты. Человек, у которого есть ПЛИС, реализовал программу чтения в лабораторном режиме, и из этого он может читать то, что посылает FPGA. Я не знаю ничего о лаборатории или электронике, я просто работаю с API-интерфейсом хоста, который поставляется с Android, но опять же, он не работает. И я не знаю, какие операции требует аппаратное устройство, Im completley здесь потерян, вот почему я просил руку. Thanx. – Zaratustra

+1

Никто не сможет вам помочь, пока вы не предоставите исчерпывающую документацию на свое собственное оборудование - части, которые вы полностью игнорировали в своем ответе выше. Вам нужно будет попросить разработчика board/fpga получить информацию о его интерфейсе USB, без которого вы не сможете использовать плату с Android * или любым другим USB-хостом *. –

ответ

0

Ну, наконец, я смог решить проблему. Чип на FPGA, с которым я был связан, был atmega32q4. Это был класс устройств CDC, поэтому на основании этого мне пришлось найти правильные параметры для функции controlTransfer() для работы. Тем не менее, я не мог понять, как работает функция или какова цель функций на устройствах CDC (например: SET_LINE_CODING, GET_LINE_CODING, ETC). Затем я нашел ссылку this, которая дает вам набор параметров для использования с функцией controlTransfer, и это сработало как шарм.

Вот код, который способен считывать данные с чипа:

package com.example.calentadorsolar; 

import android.hardware.usb.*; 
import android.os.Handler; 
import android.os.Message; 

public class Lectura_Solar implements Runnable 
{ 
private UsbDeviceConnection connection; 
private UsbEndpoint epIN; 
private Handler handler; 
private UsbInterface intf; 
private Datos_Solar aux; 

public Lectura_Solar(UsbDeviceConnection connection,UsbInterface intf,UsbEndpoint epIN, Handler handler) 
{ 
    this.connection = connection; 
    this.epIN = epIN; 
    this.handler = handler; 
    this.intf = intf; 
    aux = new Datos_Solar(); 
} 



public void run() 
{ 
    connection.claimInterface(intf,true); 
    connection.controlTransfer(0x21, 34, 0, 0, null, 0, 0); 
    connection.controlTransfer(0x21, 32, 0, 0, new byte[] { (byte) 0x80, 
        0x25, 0x00, 0x00, 0x00, 0x00, 0x08 }, 7, 0); 
    byte datos [] = new byte[64]; 
    while (true) 
    { 
     int data = connection.bulkTransfer(epIN, datos, datos.length, 5000); 
     try 
     { 
      Thread.sleep(500); 
     } 
     catch (Exception e){} 
     if (datos[0] == 0) 
     { 
      aux.temp1 = String.valueOf(datos[1]); 
      aux.temp2 = String.valueOf(datos[2]); 
      aux.temp3 = String.valueOf(datos[3]); 
      aux.temp4 = String.valueOf(datos[4]); 
      this.sendMessage(aux);//here we send the data to the main GUI 
     } 

    } 
} 

public void sendMessage(Datos_Solar message) 
    { 
    Message sms = new Message(); 
    sms.obj = message; 
    handler.sendMessage(sms); 
    } 
    } 
1

Ну, вам нужно иметь USB-последовательное устройство для подключения к хосту Android на стороне FPGA, это обычный последовательный интерфейс.

Вы можете увидеть примеры на одной из этих страниц:

http://www.fpga4fun.com/SerialInterface.html или http://www.bealto.com/fpga-uart.html

+0

Нет, это только один из многих возможных способов. Нет никаких оснований полагать, что это тот, который уже был реализован **. –

+0

Что значит? – FarhadA

+0

Вопрос сильно подразумевает, что код FPGA уже разработан кем-то другим, и нигде не говорится, что он реализует асинхронный последовательный интерфейс или используется USB-последовательный преобразователь. Единственное упоминание о USB-сериале было связано с другим проектом Android, который, по-видимому, проконсультировался с проницательностью для Android USB API. Таким образом, вы в основном относитесь к применимости к нынешней системе плаката, и даже если применимо то, что вы разместили, это ссылка на часть разработчика FPGA, а не на разработчика Android, на которую был поставлен вопрос. –

0

В основном вы не можете получить данные от порта USB. Это может быть вызвано несколькими причинами:

  1. Интерфейс USB не работает (со стороны FPGA).

  2. Интерфейс USB работает, но FPGA не отправляет данные.

  3. Интерфейс USB работает, и FPGA отправляет данные через интерфейс Labview, но программа Android по-прежнему не получает никаких данных.

Решение

  1. Вы должны написать (или скачать) код драйвера к блоку USB (на плате FPGA).
  2. Вы должны изменить FPGA-код.
  3. Он работает для Labview, но не для вашей программы. Возможно, FPGA и Labview договорились о протоколе. Например, Labview отправляет некоторую команду, а FGPA отправляет данные обратно.

Вы не понимаете FPGA и аппаратную часть, это все еще возможно, если вы понимаете коды Labview. Восстановите инженера, как реализован код Labview, и попробуйте его на Android.

Программа Labview не слишком сложна для понимания.

Смежные вопросы