【问题标题】:Connecting a Device as a USB Device with STM32 as a USB Host将设备连接为 USB 设备,STM32 作为 USB 主机
【发布时间】:2019-03-05 12:40:22
【问题描述】:

我想将 Android 设备作为 USB 设备连接到作为主机设备的 STM32 板。

我的 Android 应用程序代码如下:

Android 清单

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.usb_connection">
<uses-feature android:name="android.hardware.usb.accessory" />
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>
</manifest>

所以当我尝试获取连接的 USB 设备详细信息时,USB 设备列表始终为空:

UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
Map<String,UsbDevice> deviceList = manager.getDeviceList();

再次,我也尝试获取附件列表,USB附件列表也是空的。

UsbAccessory[] accessoryList = manager.getAccessoryList();

然后尝试 ADB 命令 连接设备。我在 JAVA 中创建了一个桌面应用程序来运行 ADB 命令并且它工作正常。但是当我尝试从我的 Android 应用程序运行 ADB 命令时,它给出了 java.io.IOException: Error running exec()。命令:[ ADB, pull , ...] 工作目录:null 环境:null.

STM32 固件是用 C 语言编写的。

请帮帮我,我卡了很长时间。

【问题讨论】:

    标签: android stm32


    【解决方案1】:

    嘿,这是我在 Stm32 上激活 Android 附件模式的库(在 f4 和 f1 系列上验证了立方体 Mx 和 HAL)和用于批量通信的 USB 类:

    https://github.com/once2go/Stm32-Android-Accessory

    【讨论】:

    • 哦,感谢上帝,至少有一些关于如何使用那个可怕的 STM32 IDE 的手册 :) 我会尝试采用该代码来挖掘 stm32g474 板。
    【解决方案2】:

    你想在 STM32 端做什么?您需要首先通过 USB 连接到 Android 设备并确定(在 STM32 端)Android 设备是否处于 AOA 模式(通过检查供应商和产品 ID)。如果不是,您需要发送一些 USB 请求来切换它(我已经包含了 STM32 USBH 库调用名称):

    USBH_GetProtocol 版本 USBH_SetString 0 制造商名称 USBH_SetString 1 型号名称 USBH_SetString 2 说明 USBH_SetString 3 版本 USBH_SetString 4 URI USBH_SetString 5 序列号 启动配件

    您可以在此处更详细地了解该过程: https://source.android.com/devices/accessories/aoa#attempt-to-start-in-accessory-mode

    完成此操作后,您将断开与 USB 设备的连接(它将重置连接),并且您需要重新执行枚举过程。这一次,供应商和产品 ID 应该是 AOA 设备的 ID(0x18D1 和 0x2D00/1)。现在您可以连接到它并使用相当标准的 USBH_CDC 通信过程,但有一些注意事项。当您尝试查找接口时(在您的接口 init 函数中),您的子类是 0xFF 而您的协议将是 0x00)。

    我花了一段时间才让一切正常通信,因此拥有 USB 逻辑分析仪是确保一切正常通信的非常方便的工具。

    这里有一些其他资源,用于让 Android 设备在 STM32 正常工作后进行通信。

    https://source.android.com/devices/accessories/aoa2 https://developer.android.com/guide/topics/connectivity/usb/accessory.html#manifest

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      • 1970-01-01
      • 2019-09-25
      • 1970-01-01
      • 2017-08-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多