精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

采用DS80C400芯片軟件的互聯網揚聲器

星星科技指導員 ? 來源:ADI ? 作者:ADI ? 2023-02-20 10:02 ? 次閱讀

DS80C400微處理器網絡功能使其成為設計簡單以太網揚聲器的自然選擇。通過使用處理器ROM內置的TCP/IP堆棧,用8051匯編編寫的應用程序可以輕松地從網絡讀取流音頻數據,并使用該數據驅動數模轉換器DAC),為一組揚聲器提供線路電平輸出。本應用筆記介紹了運行支持以太網的簡單揚聲器所需的硬件設計和軟件。

系統概述

軟件

在頂層,應用程序由一臺主機組成,通過網絡連接將未壓縮的音頻(如WAV文件中的數據)發送到DS80C400,DS1C<>監聽和播放音頻數據。圖<>顯示了該系統的框

poYBAGPy1M2AP9VrAAArF8l5BBc415.gif?imgver=1


圖1.系統框圖。

必須有兩個軟件應用程序才能使該系統工作。一個應用程序必須在主機上運行,并將音頻數據發送到DS80C400。另一個應用程序必須在DS80C400上運行并播放音頻數據。

主機應用程序在此系統中的工作很容易。它必須從 WAV 文件中讀取原始音頻數據并通過網絡發送。由于主機上沒有使用大量處理能力,因此它也執行其他一些工作,例如流控制和簡單的數據格式化。

DS80C400上的應用稍微復雜一些。它需要通過網絡接收音頻數據,并以指定的采樣率將該數據推送到音頻電路。

接收音頻數據是在循環中實現的,該循環等待音頻數據,并在音頻數據可用時將其寫入循環緩沖區。當它接收新數據時,它還必須維護一個指向緩沖區中有效數據末尾的指針,以便應用程序不會播放無效數據。

揚聲器應用的第二部分是將數據推送到音頻電路的部分。音頻數據被饋送到數模轉換器,該轉換器反過來驅動普通的計算機揚聲器。由于常規時序對音頻應用至關重要,因此應用的這一部分作為定時器中斷實現。圖 2 顯示了應用程序的循環和計時器部分如何通過循環音頻緩沖區進行交互。

poYBAGPy1M6AAL57AAApWWuBfyo769.gif?imgver=1


圖2.循環音頻緩沖區。

硬件

圖3所示為音頻電路示意圖,可連接至TINIm400驗證模塊或基于DS80C400的定制設計。對于這個項目,揚聲器應用程序是在最初為網絡攝像機設計的電路板上開發的,并進行了一些小的修改。

pYYBAGPy1NKAZXpfAABGs10IY2c903.gif?imgver=1


圖3.硬件框圖。

在此配置中,數模轉換器提供 0 至 2V 的輸出。由于線路電平揚聲器輸入為±1V,因此揚聲器的接地連接到1V。本電路使用的數模轉換器為MAX542。1,其精度為 16 位。串行數據可以通過DS80C400的串行端口傳遞到DAC,這比以編程方式切換時鐘和數據引腳要快得多。MAX542具有一條片選線,在串行負載期間必須保持低電平,負載信號(Load DAC)必須在所有串行數據寫入后保持低電平。

主機應用程序:發送未壓縮的音頻

主機應用程序是一個名為 SendDataTCP 的 Java? 類。它是一個Java應用程序,讀取PCM編碼的WAV文件,執行一些簡單的格式化,并通過TCP連接將音頻樣本塊發送到DS80C400。

該程序假設正在讀取的WAV文件包含立體聲,16位數據,以44.1kHz的采樣率播放。但是,該應用程序支持發送 44.1、22.05 和 11.025kHz 的采樣率,因此音頻數據可能需要重新格式化。假設WAV文件中的數據為16位立體聲,因此每個樣本由4個字節組成(通道2為1字節,通道2為2字節)。如果DS80C400需要單聲道數據而不是立體聲數據,則僅從WAV文件中提取一個通道。如果采樣率低于44.1kHz,則跳過某些樣本。例如,如果DS80C400需要采樣率為22.05kHz的立體聲數據,則SendDataTCP程序將發送2字節的通道1數據,發送2字節的通道2數據,然后跳過下一個樣本。如果預計單聲道數據頻率為22.05kHz,則SendDataTCP程序將發送2字節的通道1數據,跳過通道2部分,然后跳過整個下一個樣本。

在發送數據之前,必須再執行兩次轉換。首先,必須將示例從有符號數據轉換為無符號數據。WAV文件包含表示-1至1之間電壓的有符號數據,但MAX542接受表示0至2之間電壓的無符號數據。請注意,由于電路為揚聲器提供1V的虛擬地,因此所需的轉換是簡單地在WAV文件中定義的電壓上增加1 V。由于輸入值8000十六進制代表MAX1輸出的542V,因此需要為每個8000位采樣增加16十六進制。請注意,這與切換樣本的高位的操作相同。表 1 顯示了來自 WAV 文件的單個 16 位樣本、所需電壓、未改變樣本產生的電壓以及 改變后的樣本將產生的電壓。

表 1.改變音頻樣本以實現所需的電壓輸出

16 位音頻樣本(十六進制) 所需電壓 來自未改變樣品的電壓 更改的樣本 來自改變樣品的電壓
0000 1.00 0.00 8000 1.00
7FFF 2.00 1.00 FFFF 2.00
8000 0.00 1.00 0000 0.00
4000 1.50 0.50 C000 1.50
C000 0.50 1.50 4000 0.50

必須發生的第二個轉換是位翻轉操作。DS80C400上的串行端口首先寫入最低有效位,但MAX542期望數據最高有效位優先。此操作是使用簡單的查找表執行的。

數據以80字節塊的形式發送到DS400C1400 - 該尺寸可提供最佳性能。數據流控制是通過跟蹤上一秒內發送的數據量并將其與每秒預期發送的數據量進行比較來執行的。例如,采樣率為22.05kHz的單聲道數據每秒將產生44,100字節。如果 SendDataTCP 程序在過去 44 毫秒內發送了 500,800 字節,它將休眠大約 200 毫秒。DS80C400使用超過400kB的緩沖器,相當于幾秒鐘的音頻數據。因此,準確的計時在SendDataTCP程序中很重要,但并不重要。一些變化是可以接受的。

請注意,SendDataTCP程序通常會盡可能快地發送數據。如果程序由于在最后一秒發送了太多數據而從未暫停,則可能是數據速率過高,應用程序無法處理。這可能是網絡流量過多的結果。

DS80C400:初始化揚聲器應用

DS80C400的應用完全用8051匯編編寫。請注意,也可以使用 Keil 的編譯器在 C 中實現應用程序。2,或在 Java 中使用 TINI? 運行時環境3.該應用程序足夠小,因此在匯編中編寫它并不是一項艱巨的任務。

在可能的情況下,揚聲器應用程序利用了ROM中的功能未占用或更改的資源。DS80C400有4個數據指針,其中只有一個不作系統更改。前兩個數據指針被所有函數廣泛使用,尤其是對于復制操作。第四個數據指針在某些網絡例程中使用,但始終保留。從不使用第三個數據指針。由于驅動揚聲器的中斷需要是高優先級中斷,因此第四個數據指針不適合使用,只剩下第三個數據指針可用。DS80C400還具有四個定時器。ROM 使用定時器 0 作為時鐘周期,使用定時器 2 作為串行端口輸出。這將計時器 1 和計時器 3 留給揚聲器應用程序。

揚聲器應用使用定時器3產生中斷,用于加載MAX542數模轉換器。選擇定時器 3 以在 16 位定時器模式下運行。在 3 位模式下,計時器 16 沒有自動重新加載,盡管硬件會自動清除中斷位。定時器3中斷作為高優先級運行,因為加載MAX542的時序對音頻質量至關重要。

在應用啟動之前,ROM已經設置了DS80C400的一些特殊功能。該處理器已經處于 24 位尋址模式,允許跨 64kB 邊界輕松訪問代碼和數據。擴展堆棧也已啟用,利用DS80C400的專用1024字節堆棧空間。這留下了間接內存空間可供應用程序使用,而不必擔心堆棧使用會破壞其內容。應用啟動后,時鐘四倍器使能,產生約54ns的單周期指令時間。接下來,初始化定時器3,這必須在ROM初始化和進程交換開始之前完成。這是因為ROM在進程交換時保留了中斷啟用位。由于計時器中斷需要一直運行,因此應在啟用進程本身之前啟用它。

為了完成系統的初始化,調用了許多ROM函數。調用的第一個 ROM 函數是 rom_init,它初始化內存管理器、進程管理器和網絡堆棧。接下來設置網絡參數,為DS80C400提供靜態IP地址。

系統現已初始化并準備好創建偵聽套接字。網絡功能是傳統伯克利式套接字的組裝版本。應用程序通過調用create_socket創建新的 TCP 套接字句柄,并通過調用bind_socket將其分配給端口號。該函數setup_listen將套接字設置為服務器套接字,accept_connection等待套接字連接。

在程序進入主循環之前,讀取和寫入指針被初始化。傳入數據來自 網絡連接將寫入存儲在間接內存區域中的 EndBuffer 指針,因為沒有可免費使用且跨進程交換安全的直接。第三個數據指針用于從緩沖區讀取下一個有效樣本。此指針由計時器 3 的中斷服務例程 (ISR) 獨占使用。在 ISR 讀取示例數據之前,它會檢查它是否也在讀取 靠近 EndBuffer 指針。如果兩個指針位于同一組(相同的 64kB 內存區域)中,則計時器 ISR 將簡單地退出而不播放音頻數據。這不僅可以防止 ISR 讀取緩沖區末尾以外的無效數據,但也提供一定量的緩沖,以防應用程序接收數據的速度不夠快。如果應用程序停止播放音頻數據,則在至少有 64,000 字節可用之前,它不會再次啟動。這里的權衡是,如果應用程序接收數據的速度不夠快,則可以聽到音頻中較長的間隙,但音頻是可識別的。

循環:等待來自網絡的數據

在應用程序的主循環開始等待數據之前,它會檢查 EndBuffer 指針以查看它是否已環繞在循環緩沖區的末尾,并在必要時調整指向循環緩沖區開頭的指針。然后,它調用 recv_data 函數,該函數讀取任何可用數據或塊,直到數據可用。接收到的網絡數據直接讀入循環緩沖區。這可以防止應用程序在recv_data函數返回后復制數據。如果 EndBuffer 指針靠近循環緩沖區的末尾,則 recv_data 函數僅請求足夠的數據到達緩沖區的末尾。這意味著應用程序有時可能會請求接收少量數據,但好處是應用程序可以直接將數據讀取到循環緩沖區中,而無需中間副本。讀取后,將更新 EndBuffer 指針,控件返回到循環的頂部。

如果在讀取時發生錯誤,應用程序將關閉其套接字并等待另一個套接字連接。通常,檢測到的錯誤實際上意味著主機關閉了發送套接字。這允許發送方隨時啟動和停止主機程序,并依次播放多個WAV文件。

計時器中斷:播放音頻數據

在執行任何任務之前,計時器 3 的中斷服務例程 (ISR) 必須重新加載計時器寄存器。計時器寄存器始終以相同的值重新加載。此重新加載值與音頻樣本的播放速率相關聯。較高的重新加載值(意味著計數器翻轉的時間越短)意味著更快的音頻樣本播放速度。較低的重新加載值意味著音頻樣本播放速度較慢。

重新加載計時器寄存器后,ISR 會檢查它讀取的數據是否太靠近 EndBuffer 指針。僅檢查銀行編號(指針的最高字節)有兩個好處。在前面初始化揚聲器應用程序一節中已經討論了一個 - 當應用程序接收數據的速度不夠快時,防止出現短而難以理解的音頻突發。另一個好處是可以更快地比較 ISR。ISR 每秒運行數千次,因此從 ISR 切割周期非常重要。通過僅檢查高地址字節,可以避免對中間和低地址字節進行兩次額外的比較。

如果有可供播放的有效音頻數據,則會讀取樣本,并將數據指針遞增到下一個樣本。數據加載到MAX542數模轉換器,首先將片選線設置為低電平,將2個字節加載到串行端口,將片選線設置為高電平,然后將負載DAC線脈沖至低電平。串行端口處理串行時鐘和數據線的正確切換。每次加載串行端口后都會插入幾個nop指令,允許硬件完成字節移出。最后,ISR 檢查讀取音頻數據的指針,以查看它是否已環繞在循環緩沖區的末尾,并在必要時進行更正。

滴答聲:覆蓋系統計時器

為了以允許高質量音頻播放的速率接收數據,需要更改操作系統的計時器滴答功能。更改計時器時鐘周期將允許對 I/O 性能進行更多控制。以下是DS80C400 ROM中運行時的原始定時器滴答代碼:

IOPOLL_TICK_MS    equ    4

      WOS_Tick:
             ; The timer is running in divide by 12 mode.
             push    psw
             push    acc

             clr    tr0
             clr    tf0
             mov    a, sched_reload_lsb
             add    a, tl0
             mov    tl0, a
             mov    a, sched_reload_msb
             addc   a, th0
             mov    th0, a
             setb   tr0

             inc    ms_count_0
             mov    a, ms_count_0
             jnz    wos_tick_check_sched        ; Check for byte 0 roll.
             inc    ms_count_1
             mov    a, ms_count_1
             jnz    wos_tick_check_sched        ; Check for byte 1 roll.
             inc    ms_count_2
             mov    a, ms_count_2
             jnz    wos_tick_check_sched        ; Check for byte 2 roll.
             inc    ms_count_3
             mov    a, ms_count_3
             jnz    wos_tick_check_sched        ; Check for byte 3 roll.
             inc    ms_count_4                  ; If this wraps, we are in trouble

      wos_tick_check_sched:
             jb     need_sched, wos_tick_check_critical_section

             mov    a, ms_count_0               ; See if it's time to run the
             anl    a, #IOPOLL_TICK_MS-1        ;    scheduler/iopoll routines.
             jnz    wos_timer_reload            ; If not, don't do scheduler stuff.

      wos_tick_check_critical_section:
             clr    ea                          ; Make sure nobody interrupts
                                                ; us before we want to

             mov    a, STATUS                   ; Check for low priority interrupts
             jb     acc.5, wos_tick_low_priority_in_progress
                                                ; If low priority interrupts are being
                                                ; serviced, don't run the scheduler.
                                                ; If we don't do this, we'll start running
                                                ; the scheduler as a low priority interrupt.

             mov    a, wos_crit_count           ; Check the critical section count.
             jz     wos_tick_not_critical_section
                                                ; If we're not in a critical section,
                                                ; go ahead, jump and run the scheduler.

      wos_tick_low_priority_in_progress:
             setb   need_sched                  ; Signal to ourselves, or whoever, that
                                                ; we need to run the scheduler next time
             sjmp   wos_timer_reload            ; Going to blow off this tick.

      wos_tick_not_critical_section:
             WOS_ENTER_CRITICAL_SECTION
             pop    acc                         ; Clean up stack.
             pop    psw
             pop    curr_pc_x                   ; Return address to get out of interrupt.
             pop    curr_pc_h
             pop    curr_pc_l
             PUSH_DPTR1
             push   dps
             mov    dps, #0
             mov    dptr, #WOS_IOPoll           ; Get address of IOPoll
             mov    sched_l, dpl
             mov    sched_h, dph
             mov    sched_x, dpx
             pop    dps
             POP_DPTR1

             push   sched_l                     ; Push address of IOPoll
             push   sched_h
             push   sched_x
             reti                               ; Run IOPoll

      wos_timer_reload:
             ; Interrupts must have been on when the interrupt handler
             ; was called.
             setb   ea                          ; Enable interrupts
             pop    acc
             pop    psw
             reti
 

此即時報價函數最重要的更改是使用 1 而不是 4 的IOPOLL_TICK_MS值,并更改sched_reload_xxx值,以便即時報價函數更頻繁地運行。請注意,通過使用IOPOLL_TICK_MS值 1,行anl a#IOPOLL_TICK_MS-1的計算結果始終為 0,從而允許一些代碼和邏輯減少。此外,由于我們不擔心準確的系統時鐘計時,因此我們可以減少時鐘重新加載代碼。

一個復雜情況是通過覆蓋計時器滴答函數來引入的。揚聲器代碼應在DS80C400 ROM的任何未來版本上運行,因此我們無法對WOS_IOPoll功能的地址進行硬編碼。幸運的是,WOS_IOPoll函數的地址在 ROM 導出表中。揚聲器程序在啟動時讀取此地址并將其存儲在間接內存中,然后由計時器 tick 函數用于調用 WOS_IOPoll 函數。以下是針對揚聲器應用定制的定時器滴答功能:

 speaker_wos_tick:
             ; The timer is running in divide by 12 mode.
             push   psw
             push   acc

             ;
             ; We know what we want our timer reload to be.
             ; And our millisecond count doesn't have to be too
             ; accurate, so we can just straight load the
             ; timer registers.
             ;
             mov    tl0, #TICK_RELOAD_LOW       ; TICK_RELOAD_LOW  = 80h
             mov    th0, #TICK_RELOAD_HIGH      ; TICK_RELOAD_HIGH = FDh

             inc    ms_count_0
             mov    a, ms_count_0
             jnz    wos_tick_check_sched        ; Check for byte 0 roll.
             inc    ms_count_1
             mov    a, ms_count_1
             jnz    wos_tick_check_sched        ; Check for byte 1 roll.
             inc    ms_count_2
             mov    a, ms_count_2
             jnz    wos_tick_check_sched        ; Check for byte 2 roll.
             inc    ms_count_3
             mov    a, ms_count_3
             jnz    wos_tick_check_sched        ; Check for byte 3 roll.
             inc    ms_count_4                  ; If this wraps, we are in trouble

      wos_tick_check_sched:
             clr    ea                          ; Make sure nobody interrupts
                                                ; us before we want to
             mov    a, STATUS                   ; Check for low priority interrupts
             jb     acc.5, wos_tick_low_priority_in_progress
                                                ; If low priority interrupts are being
                                                ; serviced, don't run the scheduler.
                                                ; If we don't do this, we'll start running
                                                ; the scheduler as a low priority interrupt.
             mov    a, wos_crit_count           ; Check the critical section count.
             jz     wos_tick_not_critical_section
                                                ; If we're not in a critical section, go
                                                ; ahead, jump and run the scheduler.

      wos_tick_low_priority_in_progress:
             setb   need_sched                  ; Signal to ourselves, or whoever, that we
                                                ; need to run the scheduler next time
             sjmp   wos_timer_reload            ; Going to blow off this tick.

      wos_tick_not_critical_section:
             WOS_ENTER_CRITICAL_SECTION
             mov    psw, #0
             push   r0_b0
             mov    r0, #wos_iopoll_x
             mov    a, @r0                      ; xhigh byte of wos_iopoll address
             inc    r0
             mov    sched_x, a
             mov    a, @r0                      ; high byte of wos_iopoll address
             inc    r0
             mov    sched_h, a
             mov    a, @r0                      ; low byte of wos_iopoll address
             inc    r0
             mov    sched_l, a
             pop    r0_b0

             pop    acc                         ; Clean up stack.
             pop    psw

             pop    curr_pc_x                   ; Return address to get out of interrupt.
             pop    curr_pc_h
             pop    curr_pc_l

             push   sched_l                     ; Push address of IOPoll
             push   sched_h
             push   sched_x

             reti                               ; Run IOPoll

      wos_timer_reload:
             ; Interrupts must have been on when the interrupt handler
             ; was called.
             setb   ea                          ; Enable interrupts
             pop    acc
             pop    psw
             reti

通過實驗測定了FD80h的定時器重載值。此重新加載值允許以每秒約 88,000 字節發送的音頻數據流暢播放,中斷最小,具體取決于其他網絡流量。這意味著以44.1kHz播放單聲道音頻數據,或以22.05kHz播放立體聲音頻數據。

應用:構建和運行

主機應用程序是 Java 應用程序,因此需要 Java 開發工具包來構建和運行它。在開發過程中使用了版本 1.3.1,但 SendDataTCP 程序中的代碼非常簡單,任何已發布的 Java 開發工具包版本都應該足夠了。要構建的命令行很簡單:

  javac SendDataTCP.java

若要運行 SendDataTCP 程序,請使用如下所示的命令行: 在本例中,10.0.0.1 是偵聽端口 80 上的連接的 DS400C5555 的 IP 地址。WAV文件some_song.wav將用于將音頻樣本發送到DS80C400。請注意,假定使用的WAV文件包含44.1kHz立體聲數據樣本。有幾種工具可用于從 MP3 文件生成 WAV 文件。JavaLayer MP3套件中包含一個免費工具

      java SendDataTCP 10.0.0.1 5555 some_song.wav

大多數(但不是全部)MP3 文件都包含 44.1kHz 立體聲數據,因此請注意任何工具生成的 WAV 文件類型。

在DS80C400上運行的揚聲器應用采用8051匯編編寫,需要TINI軟件開發套件中免費提供的工具5.揚聲器應用程序是為地址為400000-47FFFF(十六進制)具有閃存,在地址00000-7FFFF和60000-67FFFF(十六進制)具有RAM的電路板開發的。圖 4 描述了該板的內存配置。

poYBAGPy1NOAatGAAAB_ZWeRzmg903.gif?imgver=1


圖4.板內存配置。

其他主板的開發人員需要記住,可能需要更改地址以匹配其主板配置。以下是用于創建揚聲器應用程序的生成腳本:

 macro speaker.a51
      a390 -l -Ftbin -d -p 390 speaker.mpp
      java fixBankNum speaker.tbin 66

工具宏和 a390 是 TINI SDK 的一部分。fixBankNum 程序是一個小型 Java 應用程序,它更改了用于加載應用程序的目標內存庫,并包含在達拉斯半導體 FTP 站點上本應用筆記的源文件中6.請注意,“66”是十進制的,因此speaker.tbin文件將針對位于閃存中的銀行 42(十六進制)。

fixBankNum程序是必需的,因為揚聲器應用程序不會耗盡閃存,但將程序存儲在閃存中是確保在DS80C400電源中斷時不會擦除程序的唯一方法。揚聲器應用程序不會用完閃存,因為時鐘翻了兩番,它超過了指定的閃存訪問時間。因此,將運行一個小的初始化應用程序,將揚聲器應用程序從閃存復制到RAM中。然后,控制跳轉到 RAM 中揚聲器應用程序的副本,然后啟用時鐘四倍器并開始正常運行。此初始化應用程序的源稱為 init.a51,也包含在本應用筆記的源文件中。使用以下腳本生成初始化應用程序:

 macro init.a51
      a390 -l -Ftbin -d -p 390 init.mpp

要運行揚聲器應用,必須將初始化和揚聲器文件加載到DS80C400上。這是使用JavaKit完成的,JavaKit是TINISDK中包含的另一個應用程序。文檔Running_JavaKit.txt(也是 TINI SDK 的一部分)詳細介紹了如何運行 JavaKit。上面的構建腳本生成名為speaker.tbin和init.tbin的文件。使用 JavaKit 將這些文件加載到 DS80C400 中。文件應加載到庫 41 和 42(十六進制)中。要運行揚聲器應用程序,請在 JavaKit 裝入器提示符處鍵入以下內容: 初始化應用程序應將揚聲器應用程序復制到內存,打印一些調試,并且揚聲器應用程序已啟動。運行 SendDataTCP 程序以發送音頻數據。經過一兩秒鐘的音頻緩沖后,音樂應該開始。 B41 X

應用:更改程序參數

揚聲器應用程序和主機代碼支持以 44.1kHz、22.05kHz 或 11.025kHz 播放單聲道數據。選擇數據速率時要考慮的權衡是音頻質量與網絡中斷。在低流量網絡上,應用程序可能能夠以 44.1kHz 的頻率播放數據而不會中斷。在高流量網絡上,音頻中的可聽見的閃光點可能會變得明顯。請按照以下步驟更改采樣率:

1) 在文件揚聲器頂部附近找到等效RELOAD_44_1_at_18.a51。對于 390.44kHz,將此值更改為 1,對于 800.22kHz,將此值更改為 05,對于 1600.11kHz,將此值更改為 025。
2) 在文件頂部附近找到變量 static int audio_quality SendDataTCP.java。將此值更改為MONO_44100、MONO_22050或MONO_11025。
3) 重新編譯并重建應用的兩個部分,并在DS80C400上重新加載揚聲器應用。

數據存儲在音樂光盤上,以立體聲、44.1kHz 16 位樣本形式存儲。單聲道數據僅表示播放一個通道,而不是兩個通道。音樂的足夠質量是22.05kHz;11.025kHz 足以滿足語音數據的需求。

揚聲器應用程序的 IP 地址和參數也是可配置的。在 speaker.a51 文件底部附近是以下聲明:

network_parameters:
    db  0, 0, 0                                                 ; 3 bytes overhead
    db  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 1         ; ip address
    db  255, 255, 0, 0                                          ; subnet mask
    db  16                                                      ; ipv4 netmask len
    db  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 2         ; gateway

該結構的格式在DS80C400用戶指南中有描述。但是,請注意,揚聲器應用程序中使用的當前 IP 地址為 10.0.0.1,當前網關設置為 10.0.0.2。更改以使應用程序使用不同的 IP 地址應該是微不足道的。在源文件中稍低一點,指定了服務器套接字的端口號:請注意,傳遞給 SendDataTCP 程序的端口號假定為十六進制值。

address:
    db  0, 0, 0                                             ; overhead
    db  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 1     ; address
    db  55h, 55h                                            ; port
    db  0                                                   ; family

未來:添加第二個頻道和其他改進

可以對揚聲器應用程序進行許多改進和修改。組播UDP可以取代TCP,允許一臺服務器向多個DS80C400廣播消息。DHCP 可用于動態獲取 IP 地址,從而允許自行配置安裝。配置字節可能會告訴揚聲器應用程序音頻質量是多少,因此它可以輕松地動態播放 11kHz、22kHz 或 44kHz 的音頻數據。控制從主機到DS80C400的數據流也有待改進。

另一個關鍵的改進是增加了另一個音頻通道,允許立體聲。這里的訣竅是確保添加另一個通道不會使計時器 3 中斷例程運行太長。最好的解決方案可能是使用串行端口 0 輸出另一個音頻通道。應用程序將失去通過串行端口發送調試消息的能力,但計時器中斷的額外開銷將降至最低。

結論

DS80C400 是支持互聯網的揚聲器的完美選擇。DS80C400的ROM使應用能夠以傳輸原始音頻數據的速度通過網絡進行通信。通過增加一個16位DAC、一些電阻和少量的焊接工作,DS80C400成為互聯網揚聲器。

審核編輯:郭婷

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 芯片
    +關注

    關注

    454

    文章

    50460

    瀏覽量

    421980
  • 揚聲器
    +關注

    關注

    29

    文章

    1291

    瀏覽量

    62915
  • 計時器
    +關注

    關注

    1

    文章

    419

    瀏覽量

    32647
收藏 人收藏

    評論

    相關推薦

    用IAR編譯開發DS80C400

    本應用筆記闡述了如何開始使用8051 IAR Embedded Workbench?來創建DS80C400C語言應用程序。通過一個簡單的HTTP服務演示如何使用DS80C400的R
    發表于 12-07 09:35 ?3044次閱讀
    用IAR編譯<b class='flag-5'>器</b>開發<b class='flag-5'>DS80C400</b>

    工業互聯網

    工業互聯網是全球工業系統與高級計算、分析、感應技術以及互聯網連接融合的結果。它通過智能機器 間的連接并最終將人機連接,結合軟件和大數據分析,重構全球工業、激發生產力,讓世界更美好、更快速、更安全、更
    發表于 01-25 09:29

    怎樣在80C51單片機中寫揚聲器報警程序

    怎樣在80C51單片機中寫揚聲器報警程序
    發表于 04-14 21:31

    工業互聯網

    斷發展。伴隨著這樣的發展,三種元素逐漸融合,充分體現出工業互聯網之精髓:智能機器:以嶄新的方法將現實世界中的機器、設備、團隊和網絡通過先進的傳感、控制軟件應用程序連接起來。高級分
    發表于 04-17 15:56

    什么是產業互聯網

    2018年10月,騰訊宣傳進軍產業互聯網;2019年9月,騰訊完成了史上最大的組織架構調整,新成立云與智慧產業事業群,正式發力產業互聯網;2020年1月,騰訊發布《2020產業安全報告:產業互聯網
    發表于 01-18 11:40

    如何在音視頻范例網絡多媒體系統中應用DS80C400網絡型微控制

    本文對如何在音視頻范例網絡多媒體系統中應用DS80C400網絡型微控制進行分析與討論。
    發表于 06-02 06:24

    DS80C400評估板中文資料pdf

    DS80C400評估板
    發表于 04-15 17:42 ?50次下載

    采用DS80C400創建網絡多媒體應用

    采用DS80C400建立網絡多媒體應用令人振奮的多媒體應用——包括有線廣播(PA)系統、網絡門、MP3播放以及安全攝像機等——可以采用一種低成本的網絡型微處理
    發表于 07-21 00:47 ?16次下載

    DS80C400在嵌入式智能網橋中的應用

    文章提出了以DS80C400 為核心處理將多路CAN 網絡與多路以太網互連的嵌入式智能網橋實現方案。給出了 DS80C400 MII 與外部物理設備之間的連接,詳細闡述JAVAKIT 在WINDOWS 開發平臺下的
    發表于 06-03 08:51 ?7次下載

    采用DS80C400建立網絡多媒體應用

    令人振奮的多媒體應用——包括有線廣播(PA)系統、網絡門、MP3播放以及安全攝像機等可以采用一種低成本的網絡型微處理建立。本文將討論如何在音視頻范例系統中應用DS80C40
    發表于 12-09 15:11 ?8次下載

    用Keil MON390編程TINIm400

    在設計 DS80C400軟件時就決定公開一套組合功能可以由C 語言編程者來訪問在一些程序庫的幫助下C語言編程者可以訪問網絡堆棧過程管理
    發表于 12-10 16:03 ?29次下載

    基于DS80C400微控制實現音視頻范例網絡多媒體系統的設計

    新型DS80C400是具有高性能結構和多層網絡節點和I/O口及穩定的ROM固件的網絡微控制,它廣泛應用于工業控制/自動化、數據轉換、遠距離數據采集設備、環境監測、家庭/辦公室自動化、交易/支付
    的頭像 發表于 06-23 15:38 ?2473次閱讀
    基于<b class='flag-5'>DS80C400</b>微控制<b class='flag-5'>器</b>實現音視頻范例網絡多媒體系統的設計

    利用DS16C32/DS80C390加速80/400位數學運算

    Maxim DS80C390/DS80C400高速微控制為最終用戶提供專用的硬件16/32位數學加速。訪問數學加速是通過使用五個專用的
    的頭像 發表于 02-21 10:36 ?1138次閱讀
    利用<b class='flag-5'>DS16C</b>32/<b class='flag-5'>DS80C</b>390加速<b class='flag-5'>80</b>/<b class='flag-5'>400</b>位數學運算

    采用DS80C400芯片軟件互聯網揚聲器

    DS80C400 是支持互聯網揚聲器的完美選擇。DS80C400的ROM使應用能夠以傳輸原始音頻數據的速度通過網絡進行通信。通過增加一個16位DAC、一些電阻和少量的焊接工作,
    的頭像 發表于 06-13 15:41 ?585次閱讀
    <b class='flag-5'>采用</b><b class='flag-5'>DS80C400</b><b class='flag-5'>芯片</b><b class='flag-5'>軟件</b>的<b class='flag-5'>互聯網</b><b class='flag-5'>揚聲器</b>

    DS80C400應用中使用SDCC編譯

    DS80C400包含一個提供網絡棧、內存管理和進程調度的ROM,可以靈活地用于由Java、C和8051匯編編程的應用中。SDCC為8051器件提供了一個免費、開放源碼的編譯,并兼容DS80C
    的頭像 發表于 06-16 17:32 ?1280次閱讀
    在<b class='flag-5'>DS80C400</b>應用中使用SDCC編譯<b class='flag-5'>器</b>