i2s_subsystem.h File Reference

I2S操作関数群. More...

#include <LPC17xx.h>
#include <kernel.h>
#include <t_syslog.h>

Go to the source code of this file.

Defines

#define AUDIOBUFSIZE   64
 I2S DMAバッファの長さ.

Typedefs

typedef int AUDIOSAMPLE
 オーディオデータ型

Functions

void i2s_init ()
 I2S 初期化ルーチン.
void i2s_dma_init ()
 DMA初期化.
void i2s_start ()
 I2S 開始。DMA初期化後に行う.
void i2s_dma_intr_handler ()
 I2S DMA 割り込みハンドラの初期化を行う.
void process_audio (AUDIOSAMPLE input[2][AUDIOBUFSIZE/2], AUDIOSAMPLE output[2][AUDIOBUFSIZE/2], int count)
 オーディオ信号処理関数
void audio_task (intptr_t exinf)
 オーディオDMAに同期して動くタスク

Detailed Description

I2S操作関数群.

Date:
2011/02/19
Author:
Takemasa Nakamura

i2s_init 関数を使ってI2Sペリフェラルを初期化し、次に i2s_dma_init 関数を 使ってDMA機能を初期化する。最後に i2s_start 関数を呼ぶことで実際のI2S動作が 始まる。

I2Sはダブルバッファを使う。バッファのデータ転送が終わるたびにDMA割り込みが入る。 この割り込みを処理するにはDMA割り込みが起きるたびに、 i2s_dma_intr_handler 関数を 割り込みハンドラ内部から呼べばよい。

audio_task 関数は、オーディオ処理タスクの実態であり、TOPPERS/ASPのタスクに すること。この関数はSEM_I2SDMAセマフォを使って i2s_dma_intr_handler と 同期するため、SEM_I2SDMAセマフォを用意しておかなければならない。

process_audio 関数は、audio_processing.c でユーザーが実装すべき オーディオ信号処理関数である。この関数は audio_task から呼び出される。


Define Documentation

#define AUDIOBUFSIZE   64

I2S DMAバッファの長さ.

一回のDMA転送に使うデータバッファの長さ。AUDIOBUFSIZEがNならば、ステレオなので、 N/2サンプルのデータを一回のDMAで転送することになる。


Typedef Documentation

typedef int AUDIOSAMPLE

オーディオデータ型

プログラム内部で使うオーディオの基本型。左詰めの符号付き固定小数点型である。小数点はMSBの すぐ右にある。


Function Documentation

void audio_task ( intptr_t  exinf  ) 

オーディオDMAに同期して動くタスク

Parameters:
exinf コンフィギュレータがタスクに引き渡す変数。このタスクは無視する。

dma_intr_handler からのSEM_I2SDMA セマフォ・シグナルを受けて しかるべきデータ・バッファを特定し、信号処理を行う。

なお、このタスクはシステム起動時にはインアクティブである。 main_task から明示的にアクティベートして始めて動作を開始する。

void i2s_dma_init (  ) 

DMA初期化.

I2Sに関連づけされたDMAを初期化する。同時に、LLIを初期化して、ピンポンバッファをすぐに使えるような 状態にする。受信DMAは各バッファの受信完了ごとにDMA割り込みをおこす。送信では起こさない。プログラムは これに同期してタスクと協調動作をする。

DMA受信割り込みは dma_intr_handler で処理を行う。

Todo:
DMAの割り当ては決め打ちである。適切なDMA管理機構を使用して衝突を避ける。
void i2s_dma_intr_handler (  ) 

I2S DMA 割り込みハンドラの初期化を行う.

LPC1768のDMA割り込みステータスをチェックし、I2S DMA 受信TC割り込みが発生していたら、その割り込みに対処する。

void i2s_init (  ) 

I2S 初期化ルーチン.

LPC1768のI2Sペリフェラルを初期化する。送受信とも

  • スレーブ
  • 32bit
  • 4ワイアー である。DMA1をRXに、DMA2をTXに割り当てている。

なお、このルーチンは初期化はするが、I2Sを 起動しない。起動はDMAの設定が終わった後に i2s_start ルーチンを呼んで行う。

Todo:
現在の設定でも過不足なく動くが、TXのクロックを * RXから分けるようにすれば、 もっと少ないピン数で動作させることもできるはずである。

P0.4 - P0.9を I2Sに

void i2s_start (  ) 

I2S 開始。DMA初期化後に行う.

i2s_init ルーチンと i2s_dma_init ルーチンによって準備を終えた後、 このルーチンを呼び出してi2sによる転送を始める。

void process_audio ( AUDIOSAMPLE  input[2][AUDIOBUFSIZE/2],
AUDIOSAMPLE  output[2][AUDIOBUFSIZE/2],
int  count 
)

オーディオ信号処理関数

Parameters:
input 入力のオーディオデータ列。LchとRchに分かれて配列になっている
output 出力のオーディオデータ列。LchとRchに分かれて配列になっている
count 入出力データオンサンプル数。count=8のとき、入出力のデータ数はステレオなのでそれぞれ16となる。

ユーザー信号処理を行う関数である。入力はあらかじめLとRに分離されて関数に渡される。同様に出力は LとRを分離して受け取る。配列の添字としては、Lが0、Rが1である。

countはサンプル数を表す。

 All Data Structures Files Functions Variables Typedefs Defines
Generated on Sun Feb 20 21:24:43 2011 for TalkTrhough by  doxygen 1.6.3