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]