/************************************************************************************************/
/**
* @file               i2c_bsp.c
* @author             MCU Ecosystem Development Team
* @brief              I2C BSP驱动函数，实现I2C从模式查询方式通信。
*
*
**************************************************************************************************
* @attention
* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
*
**************************************************************************************************
*/

/*------------------------------------------includes--------------------------------------------*/
#include "i2c_bsp.h"

/*------------------------------------------define----------------------------------------------*/
#define BUFF_SIZE               (8U)

/*------------------------------------------variables-------------------------------------------*/
uint8_t g_tx_buffer[BUFF_SIZE] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
uint8_t g_rx_buffer[BUFF_SIZE] = {0};

/*------------------------------------------functions-------------------------------------------*/
/**
* @brief  I2C1单字节控制查询方式发送数据流程
* @retval std_status_t API执行结果
*/
std_status_t bsp_i2c1_slave_send_single_byte(void)
{
    uint32_t index;
    
    /* 等待地址匹配 */
    while(!std_i2c_get_flag(I2C1, I2C_FLAG_ADDR));

    /* 确认传输方向 */
    if(std_i2c_get_flag(I2C1, I2C_FLAG_DIR) != true)
    {
        /* 传输方向错误 */
        return STD_ERR;
    }
    
    /* 清除地址匹配中断标志位 */
    std_i2c_clear_flag(I2C1, I2C_CLEAR_ADDR);
    
    for (index=0; index<BUFF_SIZE; index++)
    {
        /* 等待单字节状态 */
        while(!std_i2c_get_flag(I2C1, I2C_FLAG_SI));
        
        /* 发送数据 */
        if (std_i2c_get_flag(I2C1, I2C_FLAG_TXIS) == true)
        {
            std_i2c_transmit_byte(I2C1, g_tx_buffer[index]);
        }
        else
        {
            /* 发送数据错误 */
            return STD_ERR;
        }
        
        /* 清除单字节状态 */
        std_i2c_clear_flag(I2C1, I2C_CLEAR_SI);
    }
    
    /* 等待单字节状态 */
    while(!std_i2c_get_flag(I2C1, I2C_FLAG_SI));
    
    /* 确认NACKF标志置位 */
    if(std_i2c_get_flag(I2C1, I2C_FLAG_NACK) == true)
    {
        /* 清除NACKF标志和单字节状态标志 */
        std_i2c_clear_flag(I2C1, I2C_CLEAR_NACK | I2C_CLEAR_SI);
    }
    else
    {
        /* 检测NACK异常 */
        return STD_ERR;
    }
    
    /* 清除STOPF */
    while(!std_i2c_get_flag(I2C1, I2C_FLAG_STOP));
    std_i2c_clear_flag(I2C1, I2C_CLEAR_STOP);
    
    return STD_OK;
}

/**
* @brief  I2C1单字节控制查询方式接收数据流程
* @retval std_status_t API执行结果
*/
std_status_t bsp_i2c1_slave_receive_single_byte(void)
{
    uint32_t index;
    
    /* 等待单字节状态 */
    while(!std_i2c_get_flag(I2C1, I2C_FLAG_SI));
    
    /* 等待地址匹配 */
    while(!std_i2c_get_flag(I2C1, I2C_FLAG_ADDR));
    
    /* 确认传输方向 */
    if (std_i2c_get_flag(I2C1, I2C_FLAG_DIR) != false)
    {
        /* 传输方向错误 */
        return STD_ERR;
    }
    
    /* 清除地址匹配中断标志位和单字节状态标志位 */
    std_i2c_clear_flag(I2C1, I2C_CLEAR_ADDR | I2C_CLEAR_SI);
    
    for (index=0; index<BUFF_SIZE; index++)
    {
        /* 等待单字节状态 */
        while(!std_i2c_get_flag(I2C1, I2C_FLAG_SI));
        
        /* 接收数据 */
        if (std_i2c_get_flag(I2C1, I2C_FLAG_RXNE) == true)
        {
            g_rx_buffer[index] = std_i2c_receive_byte(I2C1);
        }
        else
        {
            /* 接收数据错误 */
            return STD_ERR;
        }
        
        /* 清除单字节状态 */
        std_i2c_clear_flag(I2C1, I2C_CLEAR_SI);
    }
    
    /* 清除STOPF */
    while(!std_i2c_get_flag(I2C1, I2C_FLAG_STOP));
    std_i2c_clear_flag(I2C1, I2C_CLEAR_STOP);
    
    return STD_OK;
}
