lyz3432 发表于 2015-6-7 13:59:32

RL78 iic slave问题

两片单片机iic通信   一个主机 一个从机 从机地址100主机发送01   从机回复0xaa   但现在一直回复0xbf不知道问题出在哪里了还请大家帮忙看下


程序如下

/***********************************************************************************************************************
Includes
***********************************************************************************************************************/
#include "r_cg_macrodriver.h"
#include "r_cg_serial.h"
/* Start user code for include. Do not edit comment generated here */
#include "task_iic.h"
/* End user code. Do not edit comment generated here */
#include "r_cg_userdefine.h"

/***********************************************************************************************************************
Global variables and functions
***********************************************************************************************************************/
extern uint8_t   g_iica0_master_status_flag;/* iica0 master flag */
extern uint8_t   g_iica0_slave_status_flag;   /* iica0 slave flag */
extern uint8_t * gp_iica0_rx_address;         /* iica0 receive buffer address */
extern uint16_tg_iica0_rx_cnt;            /* iica0 receive data length */
extern uint16_tg_iica0_rx_len;            /* iica0 receive data count */
extern uint8_t * gp_iica0_tx_address;         /* iica0 send buffer address */
extern uint16_tg_iica0_tx_cnt;            /* iica0 send data count */
/* Start user code for global. Do not edit comment generated here */
/* 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
***********************************************************************************************************************/
#pragma vector = INTIICA0_vect
__interrupt static void r_iica0_interrupt(void)
{
    if ((IICS0 & _80_IICA_STATUS_MASTER) == 0U)
    {
      iica0_slavehandler();
    }
}

/***********************************************************************************************************************
* Function Name: iica0_slavehandler
* Description: This function is IICA0 slave handler.
* Arguments    : None
* Return Value : None
***********************************************************************************************************************/
static void iica0_slavehandler(void)
{
    /* Control for stop condition */
    if (1U == SPD0)
    {   
      /* Get stop condition */
      SPIE0 = 0U;
       // LREL0=1;
      WREL0 = 1U;
      g_iica0_slave_status_flag = 1U;
    }
    else
    {
      if ((g_iica0_slave_status_flag & _80_IICA_ADDRESS_COMPLETE) == 0U)
      {
            if (1U == COI0)
            {
                SPIE0 = 1U;
                g_iica0_slave_status_flag |= _80_IICA_ADDRESS_COMPLETE;
               
                if (1U == TRC0)
                {
                  ACKE0 = 0;

                  if (g_iica0_tx_cnt > 0U)
                  {
                        IICA0 = *gp_iica0_tx_address;
                        gp_iica0_tx_address++;
                        g_iica0_tx_cnt--;
                  }
                  else
                  {
                        r_iica0_callback_slave_sendend();
                        //WREL0 = 1U;
                        LREL0=1;
                  }
                }
                else
                {
                  ACKE0 = 1U;
                  //WTIM0 = 0U;
                  WREL0 = 1U;
                }
            }
            else
            {
                r_iica0_callback_slave_error(MD_ERROR);
                   ACKE0=1;
                   WREL0=1;
            }
      }
      else
      {
            if (1U == TRC0)
            {
                if (0U == ACKD0)
                {
                  LREL0 = 1;
                }
                else
                {
                  if (g_iica0_tx_cnt > 0U)
                  {
                        IICA0 = *gp_iica0_tx_address;
                        gp_iica0_tx_address++;
                        g_iica0_tx_cnt--;
                  }
                  else
                  {
                        r_iica0_callback_slave_sendend();
                        LREL0=1;
                  }
                }
            }
            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)
                  {
                        r_iica0_callback_slave_receiveend();
                        WTIM0 = 1U;
                        WREL0 = 1U;
                        ACKE0 = 0U;
                  }
                  else
                  {
                        WREL0 = 1U;
                  }
                }
                else
                {
                  WREL0 = 1U;
                }
            }
      }
    }
}

/***********************************************************************************************************************
* Function Name: r_iica0_callback_slave_error
* Description: This function is a callback function when IICA0 slave error occurs.
* Arguments    : None
* Return Value : None
***********************************************************************************************************************/
static void r_iica0_callback_slave_error(MD_STATUS flag)
{
    /* Start user code. Do not edit comment generated here */
    /* End user code. Do not edit comment generated here */
}

/***********************************************************************************************************************
* Function Name: r_iica0_callback_slave_receiveend
* Description: This function is a callback function when IICA0 finishes slave reception.
* Arguments    : None
* Return Value : None
***********************************************************************************************************************/
static void r_iica0_callback_slave_receiveend(void)
{
    /* Start user code. Do not edit comment generated here */
test_iic_send();
    test_iic_receive();
    /* End user code. Do not edit comment generated here */
}

/***********************************************************************************************************************
* Function Name: r_iica0_callback_slave_sendend
* Description: This function is a callback function when IICA0 finishes slave transmission.
* Arguments    : None
* Return Value : None
***********************************************************************************************************************/
static void r_iica0_callback_slave_sendend(void)
{
    /* Start user code. Do not edit comment generated here */
    /* 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 */
页: [1]
查看完整版本: RL78 iic slave问题