電子書籍の厳選無料作品が豊富!

こんにちは。
トランジスタ技術2007年8月号付録のdsPIC30Fを使って色々といじっているのですが、UARTのところで問題が現れてしまいました。

付録基盤の23・24ピン(dsPIC30F2012の16・17ピン)のURx/UTxを使って、他の組み込みチップと20~30バイトのパケットを通信したいのですが、ボーレートやパリティの設定を正しく行っても送受信ができません。
PCのRS232-Cと組み込みチップを繋げて通信はできているのですが、付録基盤から同じパケットを送信すると不定値が現れてしまいます。

電圧や配線は確かめましたが、特に問題がありそうな場所はありませんでした。
ソースは次のような感じです。助けていただけないでしょうか。


#include <uart.h>
#include <p30f2012.h>

void init() {
unsigned int _U1BRG; // U1BRG register config
unsigned int _U1MODE; // U1MODE register config
unsigned int _U1STA; // U1STA register config

CloseUART1();
ConfigIntUART1( UART_RX_INT_DIS & UART_TX_INT_DIS );

// U1BRG register
_U1BRG=( (7370000*4/19200)/16); // Fcy / BaudRate / 16
// U1MODE register, I/O (U1TX/U1RX), N81
_U1MODE = UART_EN &
UART_IDLE_CON &
UART_RX_TX &
UART_DIS_WAKE &
UART_DIS_LOOPBACK &
UART_EN_ABAUD &
UART_NO_PAR_8BIT &
UART_1STOPBIT;
// U1STA register
_U1STA = UART_INT_TX_BUF_EMPTY &
UART_TX_PIN_NORMAL &
UART_TX_ENABLE &
UART_INT_RX_CHAR &
UART_ADR_DETECT_DIS &
UART_RX_OVERRUN_CLEAR;
// Open UART1
OpenUART1(_U1MODE, _U1STA, _U1BRG);
} // end of init()

int main(void){
unsigned int packet[] = {パケットデータ}
unsigned int result[30];
unsigned int i;

// write process
for(i=0; i<PACKET_LENGTH; i++) {
while(U1STAbits.UTXBF != 0) { ; }
U1TXREG = packet[i] & 0xFF;
}
while(!U1STAbits.TRMT) {;}

// read process
for(i=0; i<PACKET_LENGTH; i++) {
while(U1STAbits.URXDA != 0) {;}
result[i] = U1RXREG & 0xFF;
} // for(i)

while(1) {;}
} // end of main()

A 回答 (4件)

一番最後の受信ループのところ;


URXDA==0
じゃあないのかなあ。1になるまで待っている。
    • good
    • 0
この回答へのお礼

moochinさん
回答ありがとうございます。

>URXDA=0 : 少なくとも1文字は読み取り可能
>URXDA=1 : 受信バッファが空
while( URXDA==0 ) {;} が正解ですね・・・
送信フラグの方の条件とこんがらがっていたようです。

改めてテストしてみましたが、やはりランダム値(ノイズ?)が現れて、正しいデータの送信も受信も行えませんでした。

というか、dsPICの送信バッファに何も書き込んでないにも関わらず、ランダム値が延々と出力されているようです。
(ADM3202レベルコンバータ経由でハイパーターミナル確認)

根本的な問題で、基盤のUART回りが壊れてる可能性もあらわれてきました。ili○| ̄|_
dsPIC30F2012の17,18ピンと付録基盤の23,24ピンの間は通電はしているので、dsPIC30F2012自体が壊れているのかもしれません。

お礼日時:2007/12/18 16:09

ごめんなさい。

RIDLEは読み込み専用でしたね。ここを書き換えてもダメですね。うーん、判らない。
    • good
    • 0

あ、そうでしたか。

ピンは正しかった。するとソフトですね。
よく判らないけど、U1STAの論理績を見るとRIDLEが1になっているように
思えます。受信がアイドル状態なので読み込んだつもりでもデータがおかしいのでは?
U1STAbits.RIDLE=0;と明示してみたらどうでしょうか?
    • good
    • 0

ピンが違っているのでは?17--U1TX, 18--U1RX です。


または ALTIO を Enable にして、11,12 を使う。
    • good
    • 0
この回答へのお礼

moochinさん

回答ありがとうございました。
16,17ピンというのは私の間違いでした。実際には17,18ピンに接続していました。

dsPICとPCのRS-232のTx-Rxをレベルコンバータ越しに接続してみました。PICのU1TXをPCのRxに、PICのU1RXをPCのTxに繋げているのですが、正常な信号出力が確認できませんでした。でたらめなランダム値が出るか、PICからの信号が全く現れないのどちらか。
また片方の配線接続を外すとランダムな信号(ノイズ?)が受信されてしまいました。

ジャンパをカットしてALTTX、ALTRXで通信も試してみたのですが、やはりうまくいきませんでした。

お礼日時:2007/12/17 04:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!