/***********************************************************************
 * Copyright (c)  2017 - 2022, Unicmicro Co.,Ltd .
 * All rights reserved.
 * Filename    : app.c
 * Description : app source file
 * Author(s)   : Mason
 * version     : V1.0
 * Modify date : 2022-08-04
 ***********************************************************************/
#include  "app.h"
#include  "config.h"
#include  "common.h"
#include  "uart0.h"
#include  "uart1.h"
#include  "uart2.h"
#include  "spi0_slave.h"

uint8_t spi0_rx_count = 0;
volatile uint8_t spi0_rx_flag = 0;


uint32_t g_data_buf[512];

#ifdef UART0_COMM
uint8_t uart0_rx_flag = 0;
uint8_t uart0_rx_buf[64];
uint8_t uart0_rx_count = 0;
#endif

#ifdef UART1_COMM
uint8_t uart1_rx_flag = 0;
uint8_t uart1_rx_buf[64];
uint8_t uart1_rx_count = 0;
#endif

#ifdef UART2_COMM
uint8_t uart2_rx_flag = 0;
uint8_t uart2_rx_buf[64];
uint8_t uart2_rx_count = 0;
#endif

#ifdef UART0_COMM
/************************************************************************
 * Function     : uart0_rec_pro
 * Description  : uart0 rec pro 串口接收处理回调函数
 * Input        : none
 * Return       : none
 ************************************************************************/
void uart0_rec_pro(void)
{
	uart0_rx_buf[uart0_rx_count] = uart0_recv_byte();
	uart0_rx_count++;
	uart0_rx_flag = 1;	
}
#endif

#ifdef UART1_COMM
/************************************************************************
 * Function     : uart1_rec_pro
 * Description  : uart1 rec pro 串口接收处理回调函数
 * Input        : none
 * Return       : none
 ************************************************************************/
void uart1_rec_pro(void)
{
	uart1_rx_buf[uart1_rx_count] = uart1_recv_byte();
	uart1_rx_count++;
	uart1_rx_flag = 1;	
}
#endif

#ifdef UART2_COMM
/************************************************************************
 * Function     : uart2_rec_pro
 * Description  : uart2 rec pro 串口接收处理回调函数
 * Input        : none
 * Return       : none
 ************************************************************************/
void uart2_rec_pro(void)
{
	uart2_rx_buf[uart2_rx_count] = uart2_recv_byte();
	uart2_rx_count++;
	uart2_rx_flag = 1;	
}
#endif

/************************************************************************
 * Function     : uart_init
 * Description  : uart_init 串口初始化
 * Input        : none
 * Return       : none
 ************************************************************************/
void uart_init(void)
{
#ifdef  UART0_COMM     
	uart0_rx_flag = 0;
	uart0_init(PCLK, UART0_BAUD_RATE);
	uart0_irq_init(UART0_IRQ_ENABLE, uart0_rec_pro);
#endif

#ifdef  UART1_COMM	
	uart1_rx_flag = 0;	
	uart1_init(PCLK, UART1_BAUD_RATE);
	uart1_irq_init(UART1_IRQ_ENABLE, uart1_rec_pro);
#endif

#ifdef  UART2_COMM    
    uart2_rx_flag = 0;	
	uart2_init(PCLK, UART2_BAUD_RATE);
	uart2_irq_init(UART2_IRQ_ENABLE, uart2_rec_pro);
#endif
}

/************************************************************************
 * Function     : spi0_irq_func
 * Description  : spi0 interrupt callback function
 * Input        : none
 * Return       : none
 ************************************************************************/
void spi0_irq_func(void)
{
	rcv_buff[spi0_rx_count] = spi0_irq_receive_byte();
	spi0_rx_count++;
	spi0_rx_flag = 1;
}
	
/************************************************************************
 * Function     : spi0_slave_irq_test
 * Description  : spi0 slave irq test
 * Input        : none
 * Return       : none
 ************************************************************************/
void spi0_slave_irq_test(void)      			                        //从机模式下spi0中断模式接收数据测试
{
#ifndef FULL_DUPLEX_MODE
    uint8_t spi_tx_buf[12]={0,1,2,3,4,5,6,7,8,9,10,11};
	printfS("spi0_slave_irq_test! \r\n");
    
	while(1)
	{	
        spi0_slave_half_duplex_send_bytes(spi_tx_buf,12);			    //半双工发送
        while(!spi0_rx_flag);
		printfS("spi0 slave receive data:\r\n");
		printfB8(rcv_buff,12);
		spi0_rx_count = 0;
		spi0_rx_flag = 0;
	}
#endif
}

/************************************************************************
 * Function     : spi0_slave_inquire_test
 * Description  : spi0 slave inquire test
 * Input        : none
 * Return       : none
 ************************************************************************/
void spi0_slave_inquire_test(void)      			                    //从机模式下spi0查询模式收发测试	
{
#ifndef FULL_DUPLEX_MODE
    
	printfS("spi0_slave_inquire_test! \r\n");
    
	while(1)
	{
		spi0_slave_half_duplex_receive_bytes(rcv_buff, 12);	            //半双工接收
		spi0_slave_half_duplex_send_bytes(rcv_buff, 12);                //半双工发送
		
        printfS("spi0 slave receive data:\r\n");
		printfB8(rcv_buff, 12);
	}
#endif
}

/************************************************************************
 * Function     : spi0_test
 * Description  : spi0 test
 * Input        : none
 * Return       : none
 ************************************************************************/
void spi0_test(void)
{
	printfS("UM321xF run at %dHz\r\n", SystemCoreClock);
	printfS("spi0 slave test start\r\n");
	spi0_init(WORK_MODE_0);
    
#ifdef SPI_RX_INT_MODE
	spi0_irq_init(SPI0_IRQ_ENABLE, SPIIE_RXBFIE, spi0_irq_func); 	    //开启接收非空中断
    
    spi0_slave_irq_test();			                                    //SPI0从机中断模式收发测试  在spi0_slave.h中开启中断
#else
	spi0_irq_init(SPI0_IRQ_DISABLE, SPIIE_RXBFIE, spi0_irq_func);       //关闭接收非空中断
    
    spi0_slave_inquire_test();		                                    //SPI0从机查询模式收发测试
    
#endif
	  
}

/************************************************************************
 * Function     : soc_test
 * Description  : soc test 
 * Input        : none
 * Return       : none
 ************************************************************************/
void soc_test(void)
{
	spi0_test();
}
