0

アプリケーションに AT32UC シリーズ (カスタム ボード) を使用していますが、現在、Usart RS485 割り込みが原因で困っています。Rx 割り込みをセットアップして動作させています。データを送信できる場合に呼び出される Tx 割り込みを追加しようとしています。私の問題は、tx 割り込みが呼び出されないことです。これのために数時間戦った後、私は奇妙なものを見つけました。

int main()
.....// other initialisations
INTC_init_interrupts();
INTC_register_interrupt(&timerInterrupt, AVR32_TC_IRQ0, AVR32_INTC_INT0);
INTC_register_interrupt(&rs485TxInterrupt, AVR32_USART2_IRQ, AVR32_INTC_INT1);
INTC_register_interrupt(&rs485RxInterrupt, AVR32_USART2_IRQ, AVR32_INTC_INT0);              
Enable_global_interrupt();

上記から、rx 割り込みが機能し、INTC rx 割り込みの順序を tx 割り込みで変更すると、tx 割り込みが機能し、rx 割り込みは発生しません。各割り込みを呼び出す関数もメインです。誰かが割り込みの実装における私の理解の何が問題なのかを説明できますか? さらに参照できるように、関連するコードのスニペットも添付しました。

static void SendTx(void)
{   
    txLength = 5;
    gpio_set_pin_high(AVR32_PIN_PA10);
    txBuf[0] = ATEAddress;
    AVR32_USART2.THR.txchr = txBuf[0];
    tx_outctr = 1;

    if(peaksRdy_flag == true)
    {
        txBuf[1] = peaks[loop][0];  
        txempty_flag = false;
        AVR32_USART2.ier = AVR32_USART_IER_TXRDY_MASK;
    }
}
__attribute__((__interrupt__)) static void rs485TxInterrupt(void)
{   
    //AVR32_USART2.IDR.txrdy = 1;
    AVR32_USART2.THR.txchr = txBuf[1];
    AVR32_USART2.CR.sttbrk = 1;
    gpio_set_pin_low(AVR32_PIN_PA10);
    gpio_set_pin_low(AVR32_PIN_PA06);
    if(!txempty_flag)
    {   
       //gpio_set_pin_high(AVR32_PIN_PA06);
        //AVR32_USART2.IMR.txrdy;
    }
}

static void readRx(void)
{   
AVR32_USART2.CR.txdis = 1;
AVR32_USART2.ier = AVR32_USART_IER_RXRDY_MASK;
}

__attribute__((__interrupt__)) static void rs485RxInterrupt(void)
{

//AVR32_USART2.IDR.rxrdy = 1;
uint32_t data;
static char RxDatalength = 98;
data = AVR32_USART2.RHR.rxchr;

    if(data & 0x00000100)
    {
        if((data & 0x000000ff) == 0x92) //dsp board address = 0x92
        {

            rxBuf[0] = data;
            addr_flag = true;
            rxInCtr = 1;
        }
        else
        {
            addr_flag = false;
            return;
        }
     }

     else if (addr_flag == true)
     {
         rxBuf[rxInCtr++] = data;
         if(rxInCtr == 2)           // command check
         {
            if(data < 0x80)
            {   
                addr_flag = false;  // reset addr flag
                if(data==0x10)//START
                {

                    start_flag = true;

                }
                else if(data == 0x11) //CANCEL
                {
                    gpio_set_pin_high(AVR32_PIN_PA13);
                    break_flag = true;
                }
            }
            else if(data >= 0x80)

                RxDatalength = 3;
        }

         if ((rxInCtr == RxDatalength) || ((RxDatalength == 98) && (rxInCtr == rxBuf[2]+1)))
         {
            //gpio_set_pin_high (AVR32_PIN_PA16);
            addr_flag = false;
            start_flag = true;
         }
     }
gpio_set_pin_low(AVR32_PIN_PA13);
}

前もって感謝します!

4

1 に答える 1