国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

USB -- STM32F103 USB AUDIO(音頻)Speaker同步傳輸(Out傳輸)講解(七)

這篇具有很好參考價(jià)值的文章主要介紹了USB -- STM32F103 USB AUDIO(音頻)Speaker同步傳輸(Out傳輸)講解(七)。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

鏈接快速定位

前沿??

1 描述符講解

1.1 設(shè)備描述符

1.2 配置描述符

1.3 接口描述符

1.4 功能描述符

1.4.1?音頻控制接口描述符(AudioControl Interface Descriptors)

1.4.2?音頻流接口描述符(AudioStreaming Interface Descriptors)

1.4.3?音頻流端點(diǎn)描述符(AudioControl Endpoint Descriptors)

1.5 端點(diǎn)描述符

1.6 字符串描述符

2 關(guān)鍵函數(shù)講解

2.1 GPIO配置講解

2.2 非零端點(diǎn)函數(shù)講解

2.3 中斷函數(shù)講解--USB復(fù)位函數(shù)講解

2.4 主函數(shù)講解

3 運(yùn)行演示


鏈接快速定位

USB -- 初識USB協(xié)議(一)

源碼下載請參考鏈接:USB -- STM32-FS-USB-Device驅(qū)動代碼簡述(二)

USB -- STM32F103虛擬串口bulk傳輸講解(三)

USB -- STM32F103自定義HID設(shè)備及HID上位機(jī)中斷傳輸講解(四)

USB -- STM32F103 U盤(MassStorage)SDIO接口SCSI協(xié)議Bulk傳輸講解(五)

USB -- STM32F103 USB DFU設(shè)備固件升級(IAP)控制傳輸講解(六)

audio數(shù)據(jù)手冊

前沿??

????????前面兩節(jié)主要是對USB的基本概念做了簡單講解,學(xué)習(xí)USB的最本質(zhì)目的還是要回到USB的應(yīng)用方向,接下來的幾章主要講解USB的各類應(yīng)用,包括:

  • 虛擬串口(環(huán)回測試)-- bulk傳輸(USB -- STM32F103虛擬串口bulk傳輸講解(三))
  • 自定義HID -- 中斷傳輸(USB -- STM32F103自定義HID設(shè)備及HID上位機(jī)中斷傳輸講解(四))
  • U盤 -- bulk傳輸(USB -- STM32F103 U盤(MassStorage)SDIO接口SCSI協(xié)議Bulk傳輸講解(五))
  • 在線固件升級(DFU)-- 控制傳輸(USB -- STM32F103 USB DFU設(shè)備固件升級(IAP)控制傳輸講解(六))
  • 語音錄制及播放 -- 同步傳輸(本章講解)
  • 照相機(jī) -- 同步傳輸
  • 復(fù)合設(shè)備 -- 中斷+bulk傳輸

????????主要還是帶領(lǐng)大家找相關(guān)的資料及相關(guān)的工具和代碼。

1 描述符講解

? ? ? ? 描述符是USB能夠正常通信的前提,沒有描述符,USB就不知道當(dāng)前是什么樣的設(shè)備,所以描述符在USB整個(gè)通信過程中占有十分重要的地位,所以這里重點(diǎn)講解一下USB的各類描述符。

? ? ? ? ST的例程為我們配置好了應(yīng)用的描述符,我們不需要關(guān)注也能正常運(yùn)行程序,但是我們這里講解一下怎么通過查找資料來知道具體描述符的含義。

1.1 設(shè)備描述符

? ? ? ? 以下是STM32F103系列的audio_speak的設(shè)備描述符代碼(每個(gè)字節(jié)對應(yīng)的含義可以在USB -- 初識USB協(xié)議(一)中查看):

const uint8_t Speaker_DeviceDescriptor[] =
  {
    SPEAKER_SIZ_DEVICE_DESC,          /* bLength */
    USB_DEVICE_DESCRIPTOR_TYPE,           /* bDescriptorType */
    0x00,          /* 2.00 */             /* bcdUSB */
    0x02,
    0x00,                                 /* bDeviceClass */
    0x00,                                 /* bDeviceSubClass */
    0x00,                                 /* bDeviceProtocol */
    0x40,                                 /* bMaxPacketSize 40 */
    0x83,                                 /* idVendor */
    0x04,
    0x30,                                 /* idProduct  = 0x5730*/
    0x57,
    0x00,          /* 2.00 */             /* bcdDevice */
    0x02,
    1,                                    /* iManufacturer */
    2,                                    /* iProduct */
    3,                                    /* iSerialNumber */
    0x01                                  /* bNumConfigurations */
  };

? ? ? ? 設(shè)備描述符顧名思義就是描述USB設(shè)備的基本信息,主要包括以下信息:

  • USB版本號
  • USB設(shè)備類型
  • USB設(shè)備協(xié)議
  • 端點(diǎn)0最大傳輸大小(最大64byte)
  • 廠商向USBIF申請的VID(需付費(fèi),由芯片廠商提供)
  • 設(shè)備PID(廠商自定義)
  • 制造商的字符串描述符索引(描述生產(chǎn)這個(gè)產(chǎn)品的廠商)
  • 產(chǎn)品的字符串描述符索引(描述是什么產(chǎn)品)
  • 設(shè)備序號的字符串描述符索引(主要是芯片的UID)
  • 配置的數(shù)量(一般為1)

? ? ? ? 設(shè)備類型可以通過USB官網(wǎng)Class查詢,我們這里是CDC設(shè)備,所以bDeviceClass=0x01,其他兩項(xiàng)任意填寫。

USB -- STM32F103 USB AUDIO(音頻)Speaker同步傳輸(Out傳輸)講解(七),usb,stm32,嵌入式硬件,單片機(jī),音視頻?

????????但實(shí)際這里的bDeviceClass=0x00,是因?yàn)?x00表示class可以在接口與描述符中定義。

USB -- STM32F103 USB AUDIO(音頻)Speaker同步傳輸(Out傳輸)講解(七),usb,stm32,嵌入式硬件,單片機(jī),音視頻?

????????制造商的字符串描述符索引、產(chǎn)品的字符串描述符索引和設(shè)備序號的字符串描述符索引主要是制造商、產(chǎn)品和設(shè)備序列號在字符串描述符的索引位置。

????????比如這里舉個(gè)例子,以下三個(gè)是字符串描述符,分別是制造商描述符、產(chǎn)品描述符和序列號描述符:

const uint8_t Speaker_StringVendor[SPEAKER_SIZ_STRING_VENDOR] =
  {
    SPEAKER_SIZ_STRING_VENDOR, /* Size of manufacturer string */
    USB_STRING_DESCRIPTOR_TYPE,  /* bDescriptorType*/
    /* Manufacturer: "STMicroelectronics" */
    'S', 0, 'T', 0, 'M', 0, 'i', 0, 'c', 0, 'r', 0, 'o', 0, 'e', 0,
    'l', 0, 'e', 0, 'c', 0, 't', 0, 'r', 0, 'o', 0, 'n', 0, 'i', 0,
    'c', 0, 's', 0
  };

const uint8_t Speaker_StringProduct[SPEAKER_SIZ_STRING_PRODUCT] =
  {
    SPEAKER_SIZ_STRING_PRODUCT,  /* bLength */
    USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */
    'S', 0, 'T', 0, 'M', 0, '3', 0, '2', 0, ' ', 0,
    'S', 0, 'p', 0, 'e', 0, 'a', 0, 'k', 0, 'e', 0, 'r', 0
  };

uint8_t Speaker_StringSerial[SPEAKER_SIZ_STRING_SERIAL] =
  {
    SPEAKER_SIZ_STRING_SERIAL,  /* bLength */
    USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */
    'S', 0, 'T', 0, 'M', 0, '3', 0, '2', 0
  };

? ? 由下面代碼可知,他們的位置也是根據(jù)索引號排列的,所以主機(jī)請求index為1的描述符,那么設(shè)備就發(fā)送制造商描述符給主機(jī),告訴主機(jī)USB的制造商是什么。

ONE_DESCRIPTOR String_Descriptor[4] =
  {
    {(uint8_t*)Speaker_StringLangID, SPEAKER_SIZ_STRING_LANGID},
    {(uint8_t*)Speaker_StringVendor, SPEAKER_SIZ_STRING_VENDOR},
    {(uint8_t*)Speaker_StringProduct, SPEAKER_SIZ_STRING_PRODUCT},
    {(uint8_t*)Speaker_StringSerial, SPEAKER_SIZ_STRING_SERIAL},
  };

? ? ? ? 如果設(shè)備描述符的索引值修改了,那么String_Descriptor數(shù)組存放數(shù)據(jù)的順序也需要相應(yīng)的修改。

? ? ? ? VID可以通過USB官網(wǎng):USB_Members查看,比如這里的是ST的VID,0x0483的10進(jìn)制是1155,我們在USB官網(wǎng)查看,如下:

USB -- STM32F103 USB AUDIO(音頻)Speaker同步傳輸(Out傳輸)講解(七),usb,stm32,嵌入式硬件,單片機(jī),音視頻?

1.2 配置描述符

? ? ? ? 配置描述符顧名思義就是描述USB設(shè)備的配置信息,主要包括以下信息:

  • USB接口的數(shù)量(會在接口描述符講解)
  • USB的配置值(一般為1,根據(jù)設(shè)備描述符配置數(shù)量決定)
  • USB的供電信息
  • USB的最大電流
const uint8_t Speaker_ConfigDescriptor[] =
  {
    0x09,                                 /* bLength */
    USB_CONFIGURATION_DESCRIPTOR_TYPE,    /* bDescriptorType */
    0x6D,                                 /* wTotalLength  110 bytes*/
    0x00,
    0x02,                                 /* bNumInterfaces */
    0x01,                                 /* bConfigurationValue */
    0x00,                                 /* iConfiguration */
    0xC0,                                 /* bmAttributes Self Powered*/
    0x32,                                 /* bMaxPower = 100 mA*/
  }

1.3 接口描述符

? ? ? ? 這里的接口描述符有兩個(gè),由配置描述符指定個(gè)數(shù)。

? ? ? ? 第一個(gè)接口描述符是標(biāo)準(zhǔn)音頻控制接口描述符(Standard AudioControl Interface Descriptors)。

? ? ? ? 第二個(gè)接口描述符是標(biāo)準(zhǔn)音頻流接口描述符(Standard AudioStreaming Interface Descriptors),它又分為兩個(gè)子類:

  • 備用設(shè)置0是一個(gè)零帶寬設(shè)置,用于在麥克風(fēng)未使用時(shí)放棄總線上要求的帶寬。這是通電后的默認(rèn)設(shè)置。通過指定接口的此備用設(shè)置沒有與其關(guān)聯(lián)的端點(diǎn)(bNumEndpoints=0)來實(shí)現(xiàn)零帶寬。此備用設(shè)置的描述符集合是為了減少標(biāo)準(zhǔn)接口描述符。
  • 備用設(shè)置1是接口的操作設(shè)置。它包含標(biāo)準(zhǔn)和類特定的接口和端點(diǎn)描述符。
uint8_t Speak_InterfaceDescriptor[ ] = 
{
    /* USB Speaker Standard interface descriptor */
    SPEAKER_SIZ_INTERFACE_DESC_SIZE,      /* bLength */
    USB_INTERFACE_DESCRIPTOR_TYPE,        /* bDescriptorType */
    0x00,                                 /* bInterfaceNumber */
    0x00,                                 /* bAlternateSetting */
    0x00,                                 /* bNumEndpoints */
    USB_DEVICE_CLASS_AUDIO,               /* bInterfaceClass */
    AUDIO_SUBCLASS_AUDIOCONTROL,          /* bInterfaceSubClass */
    AUDIO_PROTOCOL_UNDEFINED,             /* bInterfaceProtocol */
    0x00,                                 /* iInterface */
    。
    。
    。
    /* USB Speaker Standard AS Interface Descriptor - Audio Streaming Zero Bandwidth */
    /* Interface 1, Alternate Setting 0                                             */
    SPEAKER_SIZ_INTERFACE_DESC_SIZE,  /* bLength */
    USB_INTERFACE_DESCRIPTOR_TYPE,        /* bDescriptorType */
    0x01,                                 /* bInterfaceNumber */
    0x00,                                 /* bAlternateSetting */
    0x00,                                 /* bNumEndpoints */
    USB_DEVICE_CLASS_AUDIO,               /* bInterfaceClass */
    AUDIO_SUBCLASS_AUDIOSTREAMING,        /* bInterfaceSubClass */
    AUDIO_PROTOCOL_UNDEFINED,             /* bInterfaceProtocol */
    0x00,                                 /* iInterface */
    /* 09 byte*/

    /* USB Speaker Standard AS Interface Descriptor - Audio Streaming Operational */
    /* Interface 1, Alternate Setting 1                                           */
    SPEAKER_SIZ_INTERFACE_DESC_SIZE,  /* bLength */
    USB_INTERFACE_DESCRIPTOR_TYPE,        /* bDescriptorType */
    0x01,                                 /* bInterfaceNumber */
    0x01,                                 /* bAlternateSetting */
    0x01,                                 /* bNumEndpoints */
    USB_DEVICE_CLASS_AUDIO,               /* bInterfaceClass */
    AUDIO_SUBCLASS_AUDIOSTREAMING,        /* bInterfaceSubClass */
    AUDIO_PROTOCOL_UNDEFINED,             /* bInterfaceProtocol */
    0x00,                                 /* iInterface */
 }

?????????首先下載audio數(shù)據(jù)手冊,打開《audio10.pdf》文件,找到4.3.1小節(jié),這里有對接口描述符的全部解釋,由手冊可知,bInterfaceSubClass為Abstract Control Model,bInterfaceProtocol為Common AT commands,其它位也相同,查找手冊,找出對應(yīng)的解釋.

USB -- STM32F103 USB AUDIO(音頻)Speaker同步傳輸(Out傳輸)講解(七),usb,stm32,嵌入式硬件,單片機(jī),音視頻

USB -- STM32F103 USB AUDIO(音頻)Speaker同步傳輸(Out傳輸)講解(七),usb,stm32,嵌入式硬件,單片機(jī),音視頻

1.4 功能描述符

? ? ? ? USB功能描述符這里分為三個(gè)部分:

  • 音頻控制接口描述符(AudioControl Interface Descriptors)
  • 音頻流接口描述符(AudioStreaming Interface Descriptors)
  • 音頻流端點(diǎn)描述符(AudioControl Endpoint Descriptors)

????????打開《audio10.pdf》文件,在4.3.2章節(jié)查看具體描述符的具體含義,這里不做詳細(xì)說明,音頻本身涉及的問題比較復(fù)雜,這里只是針對USB講解,不過多的講解音頻的具體協(xié)議。

1.4.1?音頻控制接口描述符(AudioControl Interface Descriptors)

uint8_t Speak_FunctionalDescriptor[ ] = 
{
    /* USB Speaker Class-specific AC Interface Descriptor */
    SPEAKER_SIZ_INTERFACE_DESC_SIZE,   /* bLength */
    AUDIO_INTERFACE_DESCRIPTOR_TYPE,      /* bDescriptorType */
    AUDIO_CONTROL_HEADER,                 /* bDescriptorSubtype */
    0x00,          /* 1.00 */             /* bcdADC */
    0x01,
    0x27,                                 /* wTotalLength = 39*/
    0x00,
    0x01,                                 /* bInCollection */
    0x01,                                 /* baInterfaceNr */
    /* 09 byte*/

    /* USB Speaker Input Terminal Descriptor */
    AUDIO_INPUT_TERMINAL_DESC_SIZE,       /* bLength */
    AUDIO_INTERFACE_DESCRIPTOR_TYPE,      /* bDescriptorType */
    AUDIO_CONTROL_INPUT_TERMINAL,         /* bDescriptorSubtype */
    0x01,                                 /* bTerminalID */
    0x01,                                 /* wTerminalType AUDIO_TERMINAL_USB_STREAMING   0x0101 */
    0x01,
    0x00,                                 /* bAssocTerminal */
    0x01,                                 /* bNrChannels */
    0x00,                                 /* wChannelConfig 0x0000  Mono */
    0x00,
    0x00,                                 /* iChannelNames */
    0x00,                                 /* iTerminal */
    /* 12 byte*/

    /* USB Speaker Audio Feature Unit Descriptor */
    0x09,                                 /* bLength */
    AUDIO_INTERFACE_DESCRIPTOR_TYPE,      /* bDescriptorType */
    AUDIO_CONTROL_FEATURE_UNIT,           /* bDescriptorSubtype */
    0x02,                                 /* bUnitID */
    0x01,                                 /* bSourceID */
    0x01,                                 /* bControlSize */
    AUDIO_CONTROL_MUTE,                   /* bmaControls(0) */
    0x00,                                 /* bmaControls(1) */
    0x00,                                 /* iTerminal */
    /* 09 byte*/

    /*USB Speaker Output Terminal Descriptor */
    0x09,      /* bLength */
    AUDIO_INTERFACE_DESCRIPTOR_TYPE,      /* bDescriptorType */
    AUDIO_CONTROL_OUTPUT_TERMINAL,        /* bDescriptorSubtype */
    0x03,                                 /* bTerminalID */
    0x01,                                 /* wTerminalType  0x0301*/
    0x03,
    0x00,                                 /* bAssocTerminal */
    0x02,                                 /* bSourceID */
    0x00,                                 /* iTerminal */
    /* 09 byte*/
 }

1.4.2?音頻流接口描述符(AudioStreaming Interface Descriptors)

uint8_t Speak_FunctionalDescriptor[ ] = 
{
    /* USB Speaker Audio Streaming Interface Descriptor */
    AUDIO_STREAMING_INTERFACE_DESC_SIZE,  /* bLength */
    AUDIO_INTERFACE_DESCRIPTOR_TYPE,      /* bDescriptorType */
    AUDIO_STREAMING_GENERAL,              /* bDescriptorSubtype */
    0x01,                                 /* bTerminalLink */
    0x01,                                 /* bDelay */
    0x02,                                 /* wFormatTag AUDIO_FORMAT_PCM8  0x0002*/
    0x00,
    /* 07 byte*/

    /* USB Speaker Audio Type I Format Interface Descriptor */
    0x0B,                                 /* bLength */
    AUDIO_INTERFACE_DESCRIPTOR_TYPE,      /* bDescriptorType */
    AUDIO_STREAMING_FORMAT_TYPE,          /* bDescriptorSubtype */
    AUDIO_FORMAT_TYPE_I,                  /* bFormatType */
    0x01,                                 /* bNrChannels */
    0x01,                                 /* bSubFrameSize */
    8,                                    /* bBitResolution */
    0x01,                                 /* bSamFreqType */
    0xF0,                                 /* tSamFreq 22000 = 0x55F0 */
    0x55,
    0x00,
    /* 11 byte*/
 }

1.4.3?音頻流端點(diǎn)描述符(AudioControl Endpoint Descriptors)

uint8_t Speak_FunctionalDescriptor[ ] = 
{
    /* Endpoint - Audio Streaming Descriptor*/
    AUDIO_STREAMING_ENDPOINT_DESC_SIZE,   /* bLength */
    AUDIO_ENDPOINT_DESCRIPTOR_TYPE,       /* bDescriptorType */
    AUDIO_ENDPOINT_GENERAL,               /* bDescriptor */
    0x00,                                 /* bmAttributes */
    0x00,                                 /* bLockDelayUnits */
    0x00,                                 /* wLockDelay */
    0x00,
    /* 07 byte*/
 }

1.5 端點(diǎn)描述符

? ? ? ? 這里用到1個(gè)端點(diǎn),具體的解釋可參見USB -- 初識USB協(xié)議(一)。

uint8_t Speak_EndpointDescriptor[ ] = 
{
    /* Endpoint 1 - Standard Descriptor */
    AUDIO_STANDARD_ENDPOINT_DESC_SIZE,    /* bLength */
    USB_ENDPOINT_DESCRIPTOR_TYPE,         /* bDescriptorType */
    0x01,                                 /* bEndpointAddress 1 out endpoint*/
    USB_ENDPOINT_TYPE_ISOCHRONOUS,        /* bmAttributes */
    0x16,                                 /* wMaxPacketSize 22 bytes*/
    0x00,
    0x01,                                 /* bInterval */
    0x00,                                 /* bRefresh */
    0x00,                                 /* bSynchAddress */
    /* 09 byte*/
 }

1.6 字符串描述符

? ? ? ? 在設(shè)備描述符中已經(jīng)對制造商描述符、產(chǎn)品描述符和設(shè)備序號描述符做了說明,這里僅對語言ID描述符做簡單說明。

? ? ? ? 語言ID描述符相對很簡單,就是告訴主機(jī)用的哪種語言編碼,這里一般選擇0x0409,使用美國的編碼。一般使用最多的也是美國編碼。

/* USB String Descriptor (optional) */
const uint8_t Speaker_StringLangID[SPEAKER_SIZ_STRING_LANGID] =
  {
    0x04,
    0x03,
    0x09,
    0x04
  }
  ; /* LangID = 0x0409: U.S. English */

USB -- STM32F103 USB AUDIO(音頻)Speaker同步傳輸(Out傳輸)講解(七),usb,stm32,嵌入式硬件,單片機(jī),音視頻?

2 關(guān)鍵函數(shù)講解

2.1 GPIO配置講解

? ? ? ? 這里對USB的D+外部上拉電阻進(jìn)行了配置,如果讀者使用的開發(fā)板和ST官網(wǎng)的外部上拉不一致,需要修改這個(gè)位置的IO口定義。這里也需要注意,ST開發(fā)板使用的是PNP型三極管作為上拉電阻的使能信號,所以這里GPIO輸出低D+上拉。

USB -- STM32F103 USB AUDIO(音頻)Speaker同步傳輸(Out傳輸)講解(七),usb,stm32,嵌入式硬件,單片機(jī),音視頻?

USB -- STM32F103 USB AUDIO(音頻)Speaker同步傳輸(Out傳輸)講解(七),usb,stm32,嵌入式硬件,單片機(jī),音視頻?

USB -- STM32F103 USB AUDIO(音頻)Speaker同步傳輸(Out傳輸)講解(七),usb,stm32,嵌入式硬件,單片機(jī),音視頻?

2.2 非零端點(diǎn)函數(shù)講解

? ? ? ? 非0端點(diǎn)傳輸函數(shù)主要在“usb_endp.c”文件中實(shí)現(xiàn),我們打開usb_endp.c文件,看到只有1個(gè)函數(shù),因?yàn)槭荢peak,所以是OUT傳輸,并且同步傳輸不回ACK,類似于UDP協(xié)議。

USB -- STM32F103 USB AUDIO(音頻)Speaker同步傳輸(Out傳輸)講解(七),usb,stm32,嵌入式硬件,單片機(jī),音視頻?

2.3 中斷函數(shù)講解--USB復(fù)位函數(shù)講解

? ? ? ? USB復(fù)位函數(shù)十分的重要,因?yàn)樵赨SB主機(jī)識別到設(shè)備的時(shí)候,首先發(fā)出復(fù)位指令,USB設(shè)備收到復(fù)位指令之后,會去初始化一些使用到的端點(diǎn)(端點(diǎn)0必須初始化),然后再通過相應(yīng)的端點(diǎn)實(shí)現(xiàn)設(shè)備與主機(jī)間的通信。

? ? ? ? 下圖是利用DSVIEW抓取的USB枚舉過程的波形,每次在USB設(shè)備枚舉之前,都會產(chǎn)生一個(gè)復(fù)位信號。

USB -- STM32F103 USB AUDIO(音頻)Speaker同步傳輸(Out傳輸)講解(七),usb,stm32,嵌入式硬件,單片機(jī),音視頻?

? ? ? ? 下面代碼是USB復(fù)位信號來臨之后,USB所做的一些事情,主要就是初始化了端點(diǎn)的狀態(tài),為后續(xù)枚舉過程做準(zhǔn)備,這里把端點(diǎn)1配置為雙buffer模式,為了提高傳輸效率,后面有機(jī)會可以給大家講解。

/*******************************************************************************
* Function Name  : Speaker_Reset.
* Description    : Speaker reset routine.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void Speaker_Reset()
{
  /* Set Speaker device as not configured state */
  pInformation->Current_Configuration = 0;

  /* Current Feature initialization */
  pInformation->Current_Feature = Speaker_ConfigDescriptor[7];

  SetBTABLE(BTABLE_ADDRESS);

  /* Initialize Endpoint 0 */
  SetEPType(ENDP0, EP_CONTROL);
  SetEPTxStatus(ENDP0, EP_TX_NAK);
  SetEPRxAddr(ENDP0, ENDP0_RXADDR);
  SetEPRxCount(ENDP0, Device_Property.MaxPacketSize);
  SetEPTxAddr(ENDP0, ENDP0_TXADDR);
  Clear_Status_Out(ENDP0);
  SetEPRxValid(ENDP0);

  /* Initialize Endpoint 1 */
  SetEPType(ENDP1, EP_ISOCHRONOUS);
  SetEPDblBuffAddr(ENDP1, ENDP1_BUF0Addr, ENDP1_BUF1Addr);
  SetEPDblBuffCount(ENDP1, EP_DBUF_OUT, 0x40);
  ClearDTOG_RX(ENDP1);
  ClearDTOG_TX(ENDP1);
  ToggleDTOG_TX(ENDP1);
  SetEPRxStatus(ENDP1, EP_RX_VALID);
  SetEPTxStatus(ENDP1, EP_TX_DIS);

  SetEPRxValid(ENDP0);
  /* Set this device to response on default address */
  SetDeviceAddress(0);

  bDeviceState = ATTACHED;

  In_Data_Offset = 0;
  Out_Data_Offset = 0;
}

2.4 主函數(shù)講解

? ? ? ? 主函數(shù)代碼相對簡單,就是實(shí)現(xiàn)了收到的數(shù)據(jù)然后發(fā)送出去和音頻芯片的初始化,初始化ST已經(jīng)為我們做好了,如果想進(jìn)一步了解需要自行下載AK4343芯片手冊,并查看相應(yīng)的寄存器位的功能,并配置,音頻芯片使用的是AK4343芯片。

/*******************************************************************************
* Function Name  : main.
* Description    : Main routine.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
int main(void)
{
  Set_System();
  Set_USBClock();
  USB_Config();
  USB_Init();
  Speaker_Config();
  while (1)
  {}
}

? ? ? ? 這里附圖一張ST官網(wǎng)的AK4343的原理圖。

USB -- STM32F103 USB AUDIO(音頻)Speaker同步傳輸(Out傳輸)講解(七),usb,stm32,嵌入式硬件,單片機(jī),音視頻

? ? ? ? 但是經(jīng)過我們的實(shí)際測試,如果接耳機(jī),ST官網(wǎng)提供的原理圖是不能識別到聲音的,所以需要修改一下原理圖,修改的原理圖如下圖所示,主要修改了輸出聲道的串聯(lián)電容,把它去掉了。

USB -- STM32F103 USB AUDIO(音頻)Speaker同步傳輸(Out傳輸)講解(七),usb,stm32,嵌入式硬件,單片機(jī),音視頻

3 運(yùn)行演示

1. 正確下載程序,能夠在設(shè)備管理器查看到Speak設(shè)備。

USB -- STM32F103 USB AUDIO(音頻)Speaker同步傳輸(Out傳輸)講解(七),usb,stm32,嵌入式硬件,單片機(jī),音視頻

2. 打開音樂播放器,并且禁止所有增強(qiáng)效果。

USB -- STM32F103 USB AUDIO(音頻)Speaker同步傳輸(Out傳輸)講解(七),usb,stm32,嵌入式硬件,單片機(jī),音視頻

3. 通過聲音屬性查看STM32 Speak正在播放音樂,并且邏輯分析儀住區(qū)波形也有數(shù)據(jù)(注意查看這里的OUT包沒有ACK應(yīng)答)。

USB -- STM32F103 USB AUDIO(音頻)Speaker同步傳輸(Out傳輸)講解(七),usb,stm32,嵌入式硬件,單片機(jī),音視頻

4. 抓取USB波形每包數(shù)據(jù)為22字節(jié),這是因?yàn)樵O(shè)置的頻率是22000Hz,1個(gè)SOF是1ms,22000Hz就是1ms傳輸22個(gè)字節(jié),所以每個(gè)SOF傳輸是22字節(jié)。

USB -- STM32F103 USB AUDIO(音頻)Speaker同步傳輸(Out傳輸)講解(七),usb,stm32,嵌入式硬件,單片機(jī),音視頻

USB -- STM32F103 USB AUDIO(音頻)Speaker同步傳輸(Out傳輸)講解(七),usb,stm32,嵌入式硬件,單片機(jī),音視頻

?

接下來講解STM32 USB AUDIO Microphone同步傳輸(In傳輸)通信實(shí)驗(yàn),敬請期待。。。文章來源地址http://www.zghlxwxcb.cn/news/detail-765088.html

到了這里,關(guān)于USB -- STM32F103 USB AUDIO(音頻)Speaker同步傳輸(Out傳輸)講解(七)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • STM32F103C8用內(nèi)部Flash做一個(gè)優(yōu)盤(USB+MSC+FATFS)

    STM32F103C8用內(nèi)部Flash做一個(gè)優(yōu)盤(USB+MSC+FATFS)

    STM32F103C8用內(nèi)部Flash做一個(gè)優(yōu)盤(USB+MSC+FATFS),輕松實(shí)現(xiàn)APP升級、數(shù)據(jù)存儲。 直接使用STM32CubeMX生成基本的工程,省得我們?nèi)フ{(diào)底層。 時(shí)鐘配置為外部8MHz晶振,這個(gè)需要根據(jù)自己開發(fā)板的晶振選擇。? 啟用SWD下載和滴答定時(shí)器 ?啟用USB ?啟用FATFS,MAX_SS和MIN_SS設(shè)置為1024。 ?配

    2024年02月14日
    瀏覽(35)
  • 野火指南者(STM32F103VET6)應(yīng)用:實(shí)現(xiàn)USB虛擬串口(CDC_VPC)

    野火指南者(STM32F103VET6)應(yīng)用:實(shí)現(xiàn)USB虛擬串口(CDC_VPC)

    MCU:STM32F103VET6 開發(fā)環(huán)境:STM32CubeMX+MDK5 ? 實(shí)現(xiàn)USB的虛擬串口不需要去理解USB的底層驅(qū)動,只需要STM32CubeMX去配置生成工程即可。在野火的指南者中,是沒有這一類的視頻和示例的,博主使用這款開發(fā)板實(shí)現(xiàn)USB虛擬串口。 首先需要打開STM32CubeMX工具。輸入開發(fā)板MCU對應(yīng)型號,找

    2024年02月08日
    瀏覽(24)
  • STM32f103c8t6小白學(xué)習(xí)筆記(一)從點(diǎn)燈開始之USB轉(zhuǎn)TTL

    STM32f103c8t6小白學(xué)習(xí)筆記(一)從點(diǎn)燈開始之USB轉(zhuǎn)TTL

    步驟一:與stm32f103c8t6最小系統(tǒng)板接線: ? ? ? 一共四根,PA9,PA10分別對應(yīng)連接RXD,TXD (如下圖),GND連GND ,3V3連32系統(tǒng)板的3.3V,跳線帽將5V和VCC相連(如上圖),原因 from數(shù)據(jù)手冊 步驟二:跳線帽:接法如上圖 BOOT0置1,BOOT1置0 ,原因from參考手冊 ? ? ?因?yàn)槲沂褂玫氖谴谙螺d模

    2023年04月09日
    瀏覽(26)
  • 【正點(diǎn)原子STM32連載】 第六十章 USB讀卡器實(shí)驗(yàn)摘自【正點(diǎn)原子】STM32F103 戰(zhàn)艦開發(fā)指南V1.2

    【正點(diǎn)原子STM32連載】 第六十章 USB讀卡器實(shí)驗(yàn)摘自【正點(diǎn)原子】STM32F103 戰(zhàn)艦開發(fā)指南V1.2

    1)實(shí)驗(yàn)平臺:正點(diǎn)原子stm32f103戰(zhàn)艦開發(fā)板V4 2)平臺購買地址:https://detail.tmall.com/item.htm?id=609294757420 3)全套實(shí)驗(yàn)源碼+手冊+視頻下載地址: http://www.openedv.com/thread-340252-1-1.html# 本章,我們將向大家介紹如何利用USB OTG FS在STM32F1開發(fā)板實(shí)現(xiàn)一個(gè)USB 讀卡器。本章分為如下幾個(gè)部分

    2024年02月16日
    瀏覽(21)
  • 基于STM32F103C8T6的高速DMA傳輸多通道ADC數(shù)據(jù)

    ADC在STM32系列單片機(jī)的使用中占用著很大的比例,常見的案例是通過ADC單次轉(zhuǎn)換電壓值,這種方式的缺陷在于轉(zhuǎn)換效率不高。一般的單片機(jī)帶有ADC1和ADC2兩個(gè)ADC轉(zhuǎn)換,單次轉(zhuǎn)換需要執(zhí)行一定的程序,想得到結(jié)果需要耗費(fèi)一些時(shí)間在賦值,調(diào)用中斷上面。在此基礎(chǔ)上,為了提高轉(zhuǎn)

    2024年02月11日
    瀏覽(29)
  • 使用USB轉(zhuǎn)TTL下載器將固件燒寫到STM32F103C8T6最小系統(tǒng)板中

    使用USB轉(zhuǎn)TTL下載器將固件燒寫到STM32F103C8T6最小系統(tǒng)板中

    ch340驅(qū)動下載地址: https://www.wch.cn/download/CH341SER_EXE.html mcuisp下載地址: 百度云盤資源: 鏈接:https://pan.baidu.com/s/1TuecWD0T1HTMkEpobuesFw 提取碼:visk Flymcu下載地址: 百度云盤資源 鏈接:https://pan.baidu.com/s/1VxMUZFOVvpAf-L_YbATMag 提取碼:fasf usb轉(zhuǎn)TTL下載器的跳線帽接3V3 開發(fā)板BOOT0跳線

    2024年01月18日
    瀏覽(20)
  • STM32F103C8T6使用USB轉(zhuǎn)TTL程序下載與BOOT0,BOOT1設(shè)置的誤區(qū)

    STM32F103C8T6使用USB轉(zhuǎn)TTL程序下載與BOOT0,BOOT1設(shè)置的誤區(qū)

    1.STM32F103C8T6使用 USB轉(zhuǎn)TTL下載 程序 方式 燒錄前的準(zhǔn)備工作操作: (1)BOOT0置3.3V,就是將跳帽接1 (2)BOOT1置GND,就是將跳帽接0 連接好線序開始燒錄工作: 1:電源---此處省略一萬字--- 2:TXD接PA10,RXD接PA9 3:使用燒錄軟件進(jìn)行程序燒錄(由于軟件有很多就不談細(xì)節(jié)了,我使用

    2024年02月14日
    瀏覽(22)
  • 基于STM32F103C8T6以USB to TTL 和 ST-LINK V2兩種方式點(diǎn)亮LED小燈泡

    基于STM32F103C8T6以USB to TTL 和 ST-LINK V2兩種方式點(diǎn)亮LED小燈泡

    ? ? ? ? 所需設(shè)備: ? ? ? ????????? 1、STM32F103C8T6; ? ? ????????? ? 2、USB 轉(zhuǎn) TLL 或 ST-LINK V2 01-0; ? ? ? ????????? 3、杜邦線若干; ? ? ????????? ? 4、面包板1個(gè); ? ? ????????? ? 5、USB安卓數(shù)據(jù)線(使用USB 轉(zhuǎn) TLL需要用到); ? ? ? ? 1、首先需要建

    2024年02月03日
    瀏覽(129)
  • STM32+ESP-01s+EMQX實(shí)現(xiàn)單片機(jī)MQTT協(xié)議傳輸數(shù)據(jù)上云(二)STM32F103與ESP-01s的Usart通信,實(shí)現(xiàn)STM32連接上網(wǎng)上云

    STM32+ESP-01s+EMQX實(shí)現(xiàn)單片機(jī)MQTT協(xié)議傳輸數(shù)據(jù)上云(二)STM32F103與ESP-01s的Usart通信,實(shí)現(xiàn)STM32連接上網(wǎng)上云

    單片機(jī):STM32F103c8t6 WiFi模塊:ESP8266-01s EMQX:自身服務(wù)器上搭載emq服務(wù)器或者借用emqx window 版本? USB TO TTL模塊:CH340 因?yàn)镃H340不能給ESP-01s供3.3V的電,所以測試時(shí)需要外加供電 ? ? ? ? ? 本章中涉及到的技術(shù)原理主要為ESP01S wfi模塊的AT指令通信,我在上一篇文章給大家提到了

    2024年02月16日
    瀏覽(26)
  • 基于STM32F103C8T6四路AD采集數(shù)據(jù)顯示在oled屏上非DMA傳輸方式(附百度網(wǎng)盤下載鏈接)

    基于STM32F103C8T6四路AD采集數(shù)據(jù)顯示在oled屏上非DMA傳輸方式(附百度網(wǎng)盤下載鏈接)

    本文采用四路AD采集 光照強(qiáng)度、煙霧濃度、一氧化碳、空氣質(zhì)量 等四個(gè)物理量,并采用 中位值平均濾波(防脈沖干擾平均濾波法)算法 對偶然出現(xiàn)的脈沖性干擾,消除由其引起的采樣值偏差。 STM32F103C8T6有兩個(gè)ADC,12位ADC是一種逐次逼近型模擬數(shù)字轉(zhuǎn)換器。它有多達(dá)18個(gè)通道,

    2024年02月13日
    瀏覽(14)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包