STOP復帰後のUARTの送信

RL78/L13を使用して設計を行っています。

消費電流を抑えるために待機時はSTOPモードにしています。

STOPから復帰後約1mseウエイトを入れたのち周辺機能を動作させていますが、

UARTの送信がどうも正常にできていない状態です。

UARTはUART2を使用しており送受信とも動作許可しています。

受信は正常に割り込みが入りデータの読み出しもできているのですが、

送信はレジスタにデータを書き込んでも端子から出力されない状態です。

少し他の処理を進めた後だと問題なく送信もできているのですが、

なぜかSTOP復帰直後の送信だけがうまく動かない状態です。

解決策等をご存じの方がおりましたらご教授いただけますでしょうか?

Parents
  • チョコです。

    通信を行う際には、STOPモードは注意する必要があります。少なくとも、私はこのような使い方はしません。

    具体的な設定がどうなっているかが全く不明なので、きちんとしたことは答えられません。

    例えば、STOPモードにするときにはUARTの設定は完全に動作を禁止状態にしていますか。

    また、受信ができて、送信ができないことから想像すると、シリアル・スタンバイ・コントロール・レジスタのSWC1ビットが1になっていて、「SNOOZEモード機能」が有効になっているような気がします。この場合には、受信だけが動作し、送信はできません。

    STOPから復帰後約1mseウエイトを入れたのち周辺機能を動作させていますが

    具体的なUART2のレジスタの設定を明確にしてください。

    以上

  • ご返答ありがとうございます。

    レジスタの設定値は以下にしています。

    初期設定

     SMR10=0x0022

     SCR10=0x8097

     SDR10=0x4400

     SMR11=0x0122

     SCR11=0x4497

     SDR11=0x4400

    STOP遷移直前に設定

     ST1=0x0003

     SOE=0x0000

    STOPから復帰後に設定

     SO1=0x0001

     SOE=0x0001

     SS1=0x0003

    初期設定は自動生成されたR_UART2_Create()を使用しており設定を見落としていたので、

    初期設定時にSSC1に0x0000を入れるようにしてみましたが特に変わりなかったです。

    さらに今回の現象としては、

    STOP復帰して少し時間が経過したのちに再度送信処理を行うと送信が正常に出力されるのが、自分としてはよくわからない状態です。

  • チョコです。

    STOPから復帰後に「SO1=0x0001」とされていますが、STOPに入る前のSO1はどうなっているのでしょうか。

    (どのような状態でSTOPに入れようとしているか)

    TxD2がLowの状態(SO10=0)でUART2を停止すると、UARTの信号としてはブレーク状態となってしまうので、STOPする前にはSO10を1にしておく必要があります。ここらあたりを確認してください。

    以上

  • チョコです。

    ハードウェア マニュアルを眺めていたら、以下のようなフローが記述されていました。

    STOPモードにする場合(SNOOZEモードにしない場合)にはこの処理を行って、STOP解除後は初期設定からやり直したらどうでしょうか。

    以上

  • L13で単純にSTOP解除後どのぐらい待つと送信データが出力されるか見てみたのですが、

    r_cg_main_c.txt
    /***********************************************************************************************************************
    * DISCLAIMER
    * This software is supplied by Renesas Electronics Corporation and is only intended for use with Renesas products.
    * No other uses are authorized. This software is owned by Renesas Electronics Corporation and is protected under all
    * applicable laws, including copyright laws. 
    * THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING THIS SOFTWARE, WHETHER EXPRESS, IMPLIED
    * OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
    * NON-INFRINGEMENT.  ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY
    * LAW, NEITHER RENESAS ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE FOR ANY DIRECT,
    * INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR
    * ITS AFFILIATES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
    * Renesas reserves the right, without notice, to make changes to this software and to discontinue the availability 
    * of this software. By using this software, you agree to the additional terms and conditions found by accessing the 
    * following link:
    * http://www.renesas.com/disclaimer
    *
    * Copyright (C) 2013, 2021 Renesas Electronics Corporation. All rights reserved.
    ***********************************************************************************************************************/
    
    /***********************************************************************************************************************
    * File Name    : r_cg_main.c
    * Version      : Code Generator for RL78/L13 V1.04.05.02 [08 Nov 2021]
    * Device(s)    : R5F10WLG
    * Tool-Chain   : CCRL
    * Description  : This file implements main function.
    * Creation Date: 2024/05/17
    ***********************************************************************************************************************/
    
    /***********************************************************************************************************************
    Includes
    ***********************************************************************************************************************/
    #include "r_cg_macrodriver.h"
    #include "r_cg_cgc.h"
    #include "r_cg_port.h"
    #include "r_cg_tau.h"
    #include "r_cg_sau.h"
    #include "r_cg_intp.h"
    /* Start user code for include. Do not edit comment generated here */
    /* End user code. Do not edit comment generated here */
    #include "r_cg_userdefine.h"
    
    /***********************************************************************************************************************
    Pragma directive
    ***********************************************************************************************************************/
    /* Start user code for pragma. Do not edit comment generated here */
    /* End user code. Do not edit comment generated here */
    
    /***********************************************************************************************************************
    Global variables and functions
    ***********************************************************************************************************************/
    /* Start user code for global. Do not edit comment generated here */
    volatile unsigned short g_timer = 0;
    /* End user code. Do not edit comment generated here */
    
    static void R_MAIN_UserInit(void);
    /***********************************************************************************************************************
    * Function Name: main
    * Description  : This function implements main function.
    * Arguments    : None
    * Return Value : None
    ***********************************************************************************************************************/
    void main(void)
    {
        R_MAIN_UserInit();
        /* Start user code. Do not edit comment generated here */
    	{
    		int flag = 0;				//STOPモードに入るフラグ
    		
    		R_UART2_Start();
    		
    		R_TAU0_Channel0_Start();	//TAU0: 1秒タイマ(1秒経過毎に g_timer++)
    		
    		R_INTC0_Start();			//STOP解除用
    		
    		//起動後 boot\r\nを表示
    		
    		
    		while((SSR10 & 0x0020) != 0) __nop();	//SDRが空になっている事を確認
    		TXD2 = 'b';
    		
    		while((SSR10 & 0x0020) != 0) __nop();
    		TXD2 = 'o';
    		
    		while((SSR10 & 0x0020) != 0) __nop();
    		TXD2 = 'o';
    		
    		while((SSR10 & 0x0020) != 0) __nop();
    		TXD2 = 't';
    
    		while((SSR10 & 0x0020) != 0) __nop();
    		TXD2 = 0x0d;
    		
    		while((SSR10 & 0x0020) != 0) __nop();
    		TXD2 = 0x0a;
    		
    	    while (1U)
    	    {
    			if ((g_timer > 10) && (flag == 0))	//起動後10秒経過 かつ フラグが立っていない場合(起動後1回のみ)にSTOPモードに入る
    			{
    				flag = 1;
    				
    				//STOPモード移行前 STOP を表示
    				
    				while((SSR10 & 0x0020) != 0) __nop();
    				TXD2 = 'S';
    				
    				while((SSR10 & 0x0020) != 0) __nop();
    				TXD2 = 'T';
    				
    				while((SSR10 & 0x0020) != 0) __nop();
    				TXD2 = 'O';
    				
    				while((SSR10 & 0x0020) != 0) __nop();
    				TXD2 = 'P';
    				
    				while((SSR10 & 0x0040) != 0) __nop();	//送信完了を確認
    				
    				__stop();
    				__nop();
    				__nop();
    				
    				//STOP復帰後 0123456789 を表示
    
    				while((SSR10 & 0x0020) != 0) __nop();
    				TXD2 = 0x30;
    				
    				while((SSR10 & 0x0020) != 0) __nop();
    				TXD2 = 0x31;
    				
    				while((SSR10 & 0x0020) != 0) __nop();
    				TXD2 = 0x32;
    				
    				while((SSR10 & 0x0020) != 0) __nop();
    				TXD2 = 0x33;
    				
    				while((SSR10 & 0x0020) != 0) __nop();
    				TXD2 = 0x34;
    				
    				while((SSR10 & 0x0020) != 0) __nop();
    				TXD2 = 0x35;
    				
    				while((SSR10 & 0x0020) != 0) __nop();
    				TXD2 = 0x36;
    				
    				while((SSR10 & 0x0020) != 0) __nop();
    				TXD2 = 0x37;
    				
    				while((SSR10 & 0x0020) != 0) __nop();
    				TXD2 = 0x38;
    				
    				while((SSR10 & 0x0020) != 0) __nop();
    				TXD2 = 0x39;
    			}
    	    }
    	}
        /* End user code. Do not edit comment generated here */
    }
    /***********************************************************************************************************************
    * Function Name: R_MAIN_UserInit
    * Description  : This function adds user code before implementing main function.
    * Arguments    : None
    * Return Value : None
    ***********************************************************************************************************************/
    static void R_MAIN_UserInit(void)
    {
        /* Start user code. Do not edit comment generated here */
        EI();
        /* End user code. Do not edit comment generated here */
    }
    
    /* Start user code for adding. Do not edit comment generated here */
    /* End user code. Do not edit comment generated here */
    

    端末には

    -----

    boot
    STOP0123456789

    -----

    と出力されたので、添付のコードで試した限りでは、STOP解除直後のデータも、TXD2から出て来ています。こちらで試した限りでは、一定時間送信データが出ないという現象は再現させられませんました。(クロックは、内蔵クロックとXTALの両方試しました。)

    (起動後、タイマで10秒経過するとSTOPモードに入れる。INTP0(P137)=LでSTOPから復帰させています。)

    なお、

    while((SSR10 & 0x0040) != 0) __nop(); //送信完了を確認

    上記を入れないでSTOPモードに入れると、TXD2=LでSTOPモードに入り(STOPモードの間はTXD2=L)、出力データは文字化けしました。(が、STOP解除後も直ぐにデータは出ていました)

  • ご返答ありがとうございます。

    一度この方法を試してみます。

  • ご返答ありがとうございます。

    添付のコード参考にさせていただき、現在のコードと比較してみます。

Reply Children
No Data