連続受信プログラムに送信部を追加してみます。この部分はとにかく送信だけはしますが、今のところ有為なデータを送るわけではありません。まずは形からです。
大幅に変更したのはsetupSport()とsetupTCB()です。この二つはこれまでの受信部の設定に加えて送信部の設定が加わりました。送信といっても受信と同じデータ形式を送るだけですから、同じサイズのバッファを同じようなTCB構成でとりあつかうだけです。従って、追加されたコードはほとんど受信部とかわりません。注意すべき点はsetupTCB()の中のconfiguration設定で、送信部はTRANビットをセットしていません。これはTRANビットがメモリーへの書き込みの場合のみ1にするビットだからです。
#include <def2191.h> #include "def2191bit.h" #include <sysreg.h> #include <signal.h> #define BUFSIZE 6 struct TDMADescriptor { int configuration, startPage, startAddress, count; struct TDMADescriptor * nextDescriptor; }; int rxBuffer[BUFSIZE*2], txBuffer[BUFSIZE*2]; struct TDMADescriptor rxTCB1, rxTCB2, txTCB1, txTCB2; void sportRxHandler( int sig ); void sportTxHandler( int sig ); void setupSport( void ); void setupTCB( void ); void reset1885( void ); int main(void) { reset1885( ); interrupt( SIG_INT5, sportRxHandler ); // SIG_INT5 is default interupt for SPORT0 RX interrupt( SIG_INT6, sportTxHandler ); // SIG_INT6 is default interupt for SPORT0 RX enable_interrupts(); // グローバル割り込みイネーブル setupTCB(); // TCB Configuratoin setupSport(); // SPORT0 Configuration while ( 1 ) ; } void setupSport( void ) { sysreg_write( sysreg_IOPG, SPORT0_Controller_Page ); // Disabling io_space_write( SP0DR_CFG, 0 ); // RX DMA Disable io_space_write( SP0DT_CFG, 0 ); // TX DMA Disable io_space_write( SP0_RCR, 0 ); // RX disable io_space_write( SP0_TCR, 0 ); // TX disable // RX setting. io_space_write( SP0_RFSDIV, 255 ); // 256 bit per frame io_space_write( SP0_MRCS0, 0x003f ); // only 6 channel io_space_write( SP0_MRCS1, 0 ); io_space_write( SP0_MRCS2, 0 ); io_space_write( SP0_MRCS3, 0 ); io_space_write( SP0_MRCS4, 0 ); io_space_write( SP0_MRCS5, 0 ); io_space_write( SP0_MRCS6, 0 ); io_space_write( SP0_MRCS7, 0 ); io_space_write( SP0DR_CP, (int) &rxTCB1 ); // set chain pointer io_space_write( SP0DR_CPR, 1 ); // ready descriptor pointer io_space_write( SP0DR_CFG, DEN ); // TX setting io_space_write( SP0_TFSDIV, 255 ); // 256 bit per frame io_space_write( SP0_MTCS0, 0x003f ); // only 6 channel io_space_write( SP0_MTCS1, 0 ); io_space_write( SP0_MTCS2, 0 ); io_space_write( SP0_MTCS3, 0 ); io_space_write( SP0_MTCS4, 0 ); io_space_write( SP0_MTCS5, 0 ); io_space_write( SP0_MTCS6, 0 ); io_space_write( SP0_MTCS7, 0 ); io_space_write( SP0DT_CP, (int) &txTCB1 ); // set chain pointer io_space_write( SP0DT_CPR, 1 ); // ready descriptor pointer io_space_write( SP0DT_CFG, DEN ); // start operation. io_space_write( SP0_MCMC1, 0 << WOFF_OFST | 1 << WSIZE_OFST | 1 << MFD_OFST | MCM ); io_space_write( SP0_MCMC2, MCDRXPE | MCDTXPE ); io_space_write( SP0_RCR, IRFS | SLEN_16 | RSPEN ); io_space_write( SP0_TCR, IRFS | SLEN_16 | TSPEN ); } void setupTCB( void ) { // setting up the DMA TCB1 rxTCB1.configuration = DOWN | DCOME | TRAN | DEN; rxTCB1.startPage = 0; rxTCB1.startAddress = (int)rxBuffer; rxTCB1.count = BUFSIZE; rxTCB1.nextDescriptor = &rxTCB2; // setting up the DMA TCB2 rxTCB2.configuration = DOWN | DCOME | TRAN | DEN; rxTCB2.startPage = 0; rxTCB2.startAddress = (int)&rxBuffer[BUFSIZE]; rxTCB2.count = BUFSIZE; rxTCB2.nextDescriptor = &rxTCB1; // setting up the DMA TCB1 txTCB1.configuration = DOWN | DCOME | DEN; txTCB1.startPage = 0; txTCB1.startAddress = (int)txBuffer; txTCB1.count = BUFSIZE; txTCB1.nextDescriptor = &txTCB2; // setting up the DMA TCB2 txTCB2.configuration = DOWN | DCOME | DEN; txTCB2.startPage = 0; txTCB2.startAddress = (int)&txBuffer[BUFSIZE]; txTCB2.count = BUFSIZE; txTCB2.nextDescriptor = &txTCB1; } int count = 0; void sportRxHandler( int sig ) { sysreg_write( sysreg_IOPG, SPORT0_Controller_Page ); io_space_write( SP0DR_IRQ, 1 ); // clear interrupt from SP0 RX if ( !( rxTCB1.configuration & DOWN ) ) // Descriptor2 Finish? rxTCB1.configuration |= DOWN; // give ownership of TCB1 to DMA engine. else rxTCB2.configuration |= DOWN; // give ownership of TCB2 to DMA engine. } void sportTxHandler( int sig ) { sysreg_write( sysreg_IOPG, SPORT0_Controller_Page ); io_space_write( SP0DT_IRQ, 1 ); // clear interrupt from SP0 TX if ( !( txTCB1.configuration & DOWN ) ) // Descriptor2 Finish? txTCB1.configuration |= DOWN; // give ownership of TCB1 to DMA engine. else txTCB2.configuration |= DOWN; // give ownership of TCB2 to DMA engine. count ++; } void reset1885( void ) { int curDIR, curIOPG, i; curIOPG = sysreg_read( sysreg_IOPG ); sysreg_write( sysreg_IOPG, General_Purpose_IO ); curDIR = io_space_read( DIR ); // get the current Direction Setting io_space_write( DIR, curDIR | 0x0080 ); // set PF7 output ( AD1885 /reset ) io_space_write( FLAGC, 0x0080 ); // asseart /reset_ad1885 for ( i=0; i<160; i++ ) asm volatile( "nop;" ); io_space_write( FLAGS, 0x0080 ); // asseart /reset_ad1885 sysreg_write( sysreg_IOPG, curIOPG ); }
⇒次はめんどくさい