/* * リングバッファ+割り込みを利用したシリアル通信 * * @author fenrir (M.Naruoka) * @since 04/05/30 * @version 1.0 */ #include <stdio.h> #include "AKI3694.h" #include <common.h> #include "sci.h" /* 送信 */ static fifo_char_size_t sci_write(fifo_char_t *, char *, fifo_char_size_t); static void sci_send(volatile struct st_sci3 *, fifo_char_t *); /* 受信 */ static fifo_char_size_t sci_read(fifo_char_t *, char *, fifo_char_size_t); static void sci_recieve(volatile struct st_sci3 *, fifo_char_t *); /* バッファサイズ */ static fifo_char_size_t sci_fifo_size(fifo_char_t *); /* エラー処理 */ static void sci_error_handler(volatile struct st_sci3 *); /**********/ /* SCI3 */ /**********/ #ifndef SCI3_DISABLE static fifo_char_t fifo_tx3; static fifo_char_t fifo_rx3; static char buffer_tx3[SCI3_TX_BUFFER_SIZE + 1]; static char buffer_rx3[SCI3_RX_BUFFER_SIZE + 1]; /** * SCI3を初期化します。 * */ void sci3_init(){ fifo_char_init(&fifo_tx3, buffer_tx3, SCI3_TX_BUFFER_SIZE + 1); fifo_char_init(&fifo_rx3, buffer_rx3, SCI3_RX_BUFFER_SIZE + 1); /* SCI3のレジスタ設定はここに書くこと */ /* 通信 全二重通信 * 通信モード 調歩同期式モード * クロック 内部クロック * データ長 8bit * パリティ 無 * ストップビット長 1bit * ビットレート 9600bps(BRR=64@20MHz) * 割り込み TXI(送信データエンプティ)、RXI(受信データフル)、ERI(受信エラー) */ SCI3.SCR3.BYTE = 0x00; SCI3.SMR.BYTE = 0x00; SCI3.BRR = 64; int i; for(i = 0; i < 10000; i++); // 1bit期間待機 SCI3.SSR.BYTE &= 0x80; // エラーフラグクリア SCI3.SCR3.BYTE |= 0xf0; // 割り込み許可 IO.PMR1.BIT.TXD = 1; } /** * SCI3から送信するデータを登録します。 * * @param data 送信データ * @param size 送信データサイズ * @return (int) 送信バッファに登録されたデータサイズ */ fifo_char_size_t sci3_write(char *data, fifo_char_size_t size){ fifo_char_size_t _size = sci_write(&fifo_tx3, data, size); /* * バッファが空の状態のときTXIは一時的に無効になっているので、 * それを再度有効にする */ if(_size > 0 && (SCI3.SCR3.BIT.TIE == 0)){SCI3.SCR3.BIT.TIE = 1;} return _size; } /** * SCI3の送信バッファにたまっているデータ量を返します。 * * @return (int) SCI3の送信バッファにたまっているデータ量 */ fifo_char_size_t sci3_tx_size(){return sci_fifo_size(&fifo_tx3);} /** * SCI3から受信したデータをもらいます。 * * @param c 受信したデータを格納するバッファ * @param size 受信したデータを格納するバッファのサイズ * @return (int) 実際にバッファから読み込んだサイズ */ fifo_char_size_t sci3_read(char *c, fifo_char_size_t size){return sci_read(&fifo_rx3, c, size);} /** * SCI3の受信バッファにたまっているデータ量を返します。 * * @return (int) SCI3の受信バッファにたまっているデータ量 */ fifo_char_size_t sci3_rx_size(){return sci_fifo_size(&fifo_rx3);} /* 割り込み処理 */ #pragma interrupt void int_sci3(){ /* エラー処理 */ if(SCI3.SSR.BYTE & 0x38){ /* フラグクリア */ SCI3.SSR.BYTE &= ~(0x38); sci_error_handler(&SCI3); } /* 送信データエンプティ */ if(SCI3.SSR.BIT.TDRE){ sci_send(&SCI3, &fifo_tx3); } /* 受信データフル */ if(SCI3.SSR.BIT.RDRF){ sci_recieve(&SCI3, &fifo_rx3); } } #endif /* SCI3_DISABLE */ /************/ /* 汎用 */ /************/ /* 送信 */ static fifo_char_size_t sci_write(fifo_char_t *fifo, char *data, fifo_char_size_t size){ return fifo_char_write(fifo, data, size); /* リングバッファに書き込み */ } static void sci_send(volatile struct st_sci3 *sci, fifo_char_t *fifo){ /* 書き込むデータがあるか確認 */ if(fifo_char_read(fifo, (char *)&(sci->TDR), 1) == 0){ /* 書き込むデータがないので、一時的にTXI割り込みがかからないようにする */ sci->SCR3.BIT.TIE = 0; } } /* 受信 */ static fifo_char_size_t sci_read(fifo_char_t *fifo, char *c, fifo_char_size_t size){ return fifo_char_read(fifo, c, size); /* リングバッファから読み込み */ } static void sci_recieve(volatile struct st_sci3 *sci, fifo_char_t *fifo){ fifo_char_write(fifo, (char *)&(sci->RDR), 1); /* リングバッファに1バイト書き出し */ } /* バッファサイズ */ static fifo_char_size_t sci_fifo_size(fifo_char_t *fifo){ return fifo_char_size(fifo); } /* エラー処理 */ static void sci_error_handler(volatile struct st_sci3 *sci){ }