UART
TWELITE 無線マイコンには 2ch の UART ハードウェアが利用できます。この UART ポートは各々16バイトのハードウェアFIFOバッファーがあります。
TWELITE NET での処理については SERIAL ライブラリを用いるのが標準的な方法です。SERIAL ライブラリ内でUART の割り込み処理を行い、マイコン内に割り当てたFIFOメモリを用いた入出力手続きを API としてを提供します。

初期化

tsSerialPortSetup 構造体に初期化パラメータを格納して SERIAL_vInit() 関数を呼び出します。ここでシリアルデータの入力用と出力用に使うFIFOバッファー用のメモリ領域を静的に確保しておく必要があります。
また出力用に tsFILE 構造体を用意しておきます。
1
tsFILE sSerStream;
2
tsSerialPortSetup sSerPort;
3
4
void vSerialInit(uint32 u32Baud) {
5
/* Create the debug port transmit and receive queues */
6
static uint8 au8SerialTxBuffer[256];
7
static uint8 au8SerialRxBuffer[256];
8
9
/* Initialise the serial port to be used for debug output */
10
sSerPort.pu8SerialRxQueueBuffer = au8SerialRxBuffer;
11
sSerPort.pu8SerialTxQueueBuffer = au8SerialTxBuffer;
12
sSerPort.u32BaudRate = u32Baud;
13
sSerPort.u16AHI_UART_RTS_LOW = 0xffff;
14
sSerPort.u16AHI_UART_RTS_HIGH = 0xffff;
15
sSerPort.u16SerialRxQueueSize = sizeof(au8SerialRxBuffer);
16
sSerPort.u16SerialTxQueueSize = sizeof(au8SerialTxBuffer);
17
sSerPort.u8SerialPort = UART_PORT_SLAVE;
18
sSerPort.u8RX_FIFO_LEVEL = E_AHI_UART_FIFO_LEVEL_1;
19
SERIAL_vInit(&sSerPort);
20
21
// for vfPrintf()
22
sSerStream.bPutChar = SERIAL_bTxChar;
23
sSerStream.u8Device = UART_PORT_SLAVE;
24
}
Copied!

出力

出力には vfPrintf() または vPutChar() を用います。パラメータに tsFILE 構造体へのポインタを指定します。
システム起動時またはスリープ復帰時の初期化直後の出力処理が不安定になる場合があります。動作に問題がある場合は、時間をおいて出力するようにしてください。
以下は無線パケット受信時に、パケットの情報を出力する例です。
1
void cbToCoNet_vRxEvent(tsRxDataApp *pRx) {
2
vfPrintf(&sSerStream, LB"[PKT Ad:%04x,Ln:%03d,Seq:%03d,Lq:%03d,Tms:%05d \"",
3
pRx->u32SrcAddr,
4
pRx->u8Len+4, // Actual payload byte: the network layer uses additional 4 bytes.
5
pRx->u8Seq,
6
pRx->u8Lqi,
7
pRx->u32Tick & 0xFFFF);
8
...
Copied!
全ての出力をしてからスリープに入る時など、出力完了を待ちたい場合は SERIAL_vFlush() 関数を呼び出します。この関数は出力のキューが空になるまでブロックします。
出力完了待ちの処理で動作が不安定になる場合があります。この場合は、この待ち処理を削除して動作確認します。
待ち処理を省略し出力が途切れる場合は、出力用のFIFOメモリを余分に確保します。

入力

入力があると、ライブラリ内で初期化時に登録したFIFOメモリにデータが投入されます。このデータを SERIAL_bRxQueueEmpty() と SEREAL_i16RxChar() により読み出します。
この処理は cbToCoNet_vMain() 処理中に記述します。
1
void cbToCoNet_vMain(void) {
2
while (!SERIAL_bRxQueueEmpty(sSerPort.u8SerialPort)) {
3
int16 i16Char;
4
5
i16Char = SERIAL_i16RxChar(sSerPort.u8SerialPort);
6
7
vfPrintf(&sSerStream, "\n\r# [%c] --> ", i16Char);
8
SERIAL_vFlush(sSerStream.u8Device);
9
...
10
}
11
}
Copied!
最終更新 1mo ago
リンクのコピー