title

◎温度湿度計 r_cg_serial_user.c

r_cg_serial_user.c リストを示します。 E2studioのタブとブラウザのタブ位置が異なり見づらいですがご了承下さい。 /* Start user code ~から /* End user code の間だけに記述します。
/***********************************************************************************************************************
    * 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) 2011, 2021 Renesas Electronics Corporation. All rights reserved.
    ***********************************************************************************************************************/
    
    /***********************************************************************************************************************
    * File Name    : r_cg_serial_user.c
    * Version      : CodeGenerator for RL78/G13 V2.05.06.02 [08 Nov 2021]
    * Device(s)    : R5F100LG
    * Tool-Chain   : GCCRL78
    * Description  : This file implements device driver for Serial module.
    * Creation Date: 2023/01/13
    ***********************************************************************************************************************/
    
    /***********************************************************************************************************************
    Includes
    ***********************************************************************************************************************/
    #include "r_cg_macrodriver.h"
    #include "r_cg_serial.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"
    
    /***********************************************************************************************************************
    Global variables and functions
    ***********************************************************************************************************************/
    extern volatile uint8_t   g_iica0_master_status_flag;  /* iica0 master flag */ 
    extern volatile uint8_t   g_iica0_slave_status_flag;   /* iica0 slave flag */
    extern volatile uint8_t * gp_iica0_rx_address;         /* iica0 receive buffer address */
    extern volatile uint16_t  g_iica0_rx_cnt;              /* iica0 receive data length */
    extern volatile uint16_t  g_iica0_rx_len;              /* iica0 receive data count */
    extern volatile uint8_t * gp_iica0_tx_address;         /* iica0 send buffer address */
    extern volatile uint16_t  g_iica0_tx_cnt;              /* iica0 send data count */
    /* Start user code for global. Do not edit comment generated here */
    //extern volatile uint8_t iic_Tx_Buf[10];
    //extern volatile uint8_t iic_Rx_Buf[10];
    /* End user code. Do not edit comment generated here */
    
    /***********************************************************************************************************************
    * Function Name: r_iica0_interrupt
    * Description  : This function is INTIICA0 interrupt service routine.
    * Arguments    : None
    * Return Value : None
    ***********************************************************************************************************************/
    void r_iica0_interrupt(void)
    {
        if ((IICS0 & _80_IICA_STATUS_MASTER) == 0x80U)
        {
            iica0_master_handler();
        }
    }
    
    /***********************************************************************************************************************
    * Function Name: iica0_master_handler
    * Description  : This function is IICA0 master handler.
    * Arguments    : None
    * Return Value : None
    ***********************************************************************************************************************/
    static void iica0_master_handler(void)
    {
        /* Detection of stop condition handling */
        if ((0U == IICBSY0) && (g_iica0_tx_cnt != 0U))
        {
            r_iica0_callback_master_error(MD_SPT);
        }
        else
        {
            /* Control for sended address */
            if ((g_iica0_master_status_flag & _80_IICA_ADDRESS_COMPLETE) == 0U)
            {
                if (1U == ACKD0)
                {
                    g_iica0_master_status_flag |= _80_IICA_ADDRESS_COMPLETE;
                    
                    if (1U == TRC0)
                    {
                        WTIM0 = 1U;
                        
                        if (g_iica0_tx_cnt > 0U)
                        {
                            IICA0 = *gp_iica0_tx_address;
                            gp_iica0_tx_address++;
                            g_iica0_tx_cnt--;
                        }
                        else
                        {
                            r_iica0_callback_master_sendend();
                        }
                    }
                    else
                    {
                        ACKE0 = 1U;
                        WTIM0 = 0U;
                        WREL0 = 1U;
                    }
                }
                else
                {
                    r_iica0_callback_master_error(MD_NACK);
                }
            }
            else
            {
                /* Master send control */
                if (1U == TRC0)
                {
                    if ((0U == ACKD0) && (g_iica0_tx_cnt != 0U))
                    {
                        r_iica0_callback_master_error(MD_NACK);
                    }
                    else
                    {
                        if (g_iica0_tx_cnt > 0U)
                        {
                            IICA0 = *gp_iica0_tx_address;
                            gp_iica0_tx_address++;
                            g_iica0_tx_cnt--;
                        }
                        else
                        {
                            r_iica0_callback_master_sendend();
                        }
                    }
                }
                /* Master receive control */
                else
                {
                    if (g_iica0_rx_cnt < g_iica0_rx_len)
                    {
                        *gp_iica0_rx_address = IICA0;
                        gp_iica0_rx_address++;
                        g_iica0_rx_cnt++;
                        
                        if (g_iica0_rx_cnt == g_iica0_rx_len)
                        {
                            ACKE0 = 0U;
                            WTIM0 = 1U;
                            WREL0 = 1U;
                        }
                        else
                        {
                            WREL0 = 1U;
                        }
                    }
                    else
                    {
                        r_iica0_callback_master_receiveend();
                    }
                }
            }
        }
    }
    
    /***********************************************************************************************************************
    * Function Name: r_iica0_callback_master_error
    * Description  : This function is a callback function when IICA0 master error occurs.
    * Arguments    : None
    * Return Value : None
    ***********************************************************************************************************************/
    static void r_iica0_callback_master_error(MD_STATUS flag)
    {
        /* Start user code. Do not edit comment generated here */
        if(flag == MD_SPT) P7_bit.no6 = 1;
        if(flag == MD_NACK)P7_bit.no7 = 1;
        while(1);
        /* End user code. Do not edit comment generated here */
    }
    
    /***********************************************************************************************************************
    * Function Name: r_iica0_callback_master_receiveend
    * Description  : This function is a callback function when IICA0 finishes master reception.
    * Arguments    : None
    * Return Value : None
    ***********************************************************************************************************************/
    static void r_iica0_callback_master_receiveend(void)
    {
        SPT0 = 1U;
        /* Start user code. Do not edit comment generated here */
    
        /* End user code. Do not edit comment generated here */
    }
    
    /***********************************************************************************************************************
    * Function Name: r_iica0_callback_master_sendend
    * Description  : This function is a callback function when IICA0 finishes master transmission.
    * Arguments    : None
    * Return Value : None
    ***********************************************************************************************************************/
    static void r_iica0_callback_master_sendend(void)
    {
        SPT0 = 1U;
        /* Start user code. Do not edit comment generated here */
        P7_bit.no3 = 1;
        NOP();
        NOP();
        P7_bit.no3 = 0;
        /* 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 */
    

void r_iica0_interrupt(void):自動生成された関数、IICの1バイトアクセス終了毎に起動される割り込み関数であり、ここから static void iica0_master_handler(void)を呼び出します。

呼び出されたstatic void iica0_master_handler(void)が上記void r_iica0_interrupt(void)の実体です。上記関数とともにuserの関わる余地はありません。

static void r_iica0_callback_master_error(MD_STATUS flag)

ストップコンディションとノーアクノーリッジに関するエラー処理です。 自動生成ではwhile(1);だけが記述されています。エラーがなければ問題ありませんがエラーが起きるとwhile(1);の無限ループに入りますのでmain関数の処理は出来ません。 if(flag == MD_SPT) P7_bit.no6 = 1;if(flag == MD_NACK)P7_bit.no7 = 1; はこれを目視表示させるものです。(開発試験中にE1でレジスターを見たり、オシロで波形を調べたりしなくても良いよう 目視確認するためです。)

static void r_iica0_callback_master_receiveend(void)IIC受信終了関数です。この処理完了のお知らせです。

static void r_iica0_callback_master_sendend(void)IIC送信終了関数です。 (スレーブアドレスは数に含みません)

注意

r_cg_serial.c内の受信関数をR_IICA0_Master_Receive(0x70,iic_Rx_Buf, 7,16);の用に呼び出すとiic_Rx_Bufに結果が入ります。 この例では0x70(7bit表記では0x38)からiic_Rx_Bufに7バイト入ります。 割り込み処理が行われています。また関数R_IICA0_Master_Send(0x70,iic_Rx_Buf, 3,16)では予め用意しておいたiic_Tx_Buffから3バイト送ります。 送受信の関数は呼び出し側から見ると戻ってくれば終了ですが、呼び出された関数内ではハードウェアによる処理とそれに伴う割り込み処理が継続しています。 不用意にIICバスにアクセスするとトラブルが起こりますので完了確認の後次の処理に進むのが良いと思います。 今回のプログラムでは処理完了関数を使用せずにタイミングループにより十分な時間待ちで処理しています。

次はr_cg_rtc_user.c