/*Copyright (C), 2024-2030
*文件名:	USER.c
*版  本:	Ver1.00
*日  期:	2025/07/07
*描  述:	常用函数定义
*备  注:     
**********************************************************/
#include "USER.h"
#include "BL51F003T.h"	
#include "stdio.h"

/**********************************************************/
INT8U	i;
INT8S cnt = 0, fail_cnt = 0, is_pass;
INT8U rDat[SLAVE_RX_NUM], rx_ok = 0;

/**
	* @brief  time2初始化
  * @param  None
  * @retval None
	*/
void TIME2_INIT()
{
	
	/* 周期约为100us方波 */
	T2CH = (65536-225)>>8;	//100us = 12/27M*225
	T2CL = (65536-225);	
	TL2 = T2CL;
	TH2 = T2CH;    
	T2MOD = 0x20;						//选择系统时钟
	TR2 = 1;								//启动TIME2
}
void spi_isr(void) interrupt 6
{
	INT8S tmp;
	
	if(SPFLG & 0x01)				//数据传输完成标志
	{	
		SPFLG &= 0xFE;				//清标志
		if(SPFLG & 0x08)			//SPI接收异常标志
		{
			//printf("\nOV");
			SPFLG &= 0xF7;			//清标志
		}		
		tmp = SPDAT;					//数据赋值到tmp
		//printf("\nR:%bx", tmp);
		/* 0x00 - 0x09 */
		if((tmp >= 0x00)&&(tmp <= 0x09))
		{
			SDI_OUT;						//SDI发送数据,SPI发送SDO数据
			rx_ok = 1;
			rDat[tmp] = tmp;
			SPDAT = 0x55;
		}
		else
		{			
			SDI_IN;							//清标志
		}
	}
}
/**
	* @brief  SPI初始化
  * @param  None
  * @retval None
	*/
void SPI_INIT()
{	
	P14_FUN_SCS;    	 // SCS
	P13_FUN_SCK;    	 // SCK  
	P12_FUN_SDI;   		 // SDI  	
	SPCON = SPEN + CKOS + CPHA; //SPI使能+从机+T2溢出标准做时钟，每两次传输一次数据+下降沿采集数据
	SPFLG = 0x80;				//SPI中断使能
	INT_SPI;										//SPI中断配置
	SDI_IN;											//清标志
	for(i=0; i<SLAVE_RX_NUM; i++)
	{
		rDat[i]=0;	
	}	
}
 
/**
	* @brief  SPI测试
  * @param  None
  * @retval None
	*/
void SPI_TEST1()
{
		if(rx_ok == 1)
		{
			rx_ok = 0;
			printf("\r\nslave recv: ");
			for(i=0; i<SLAVE_RX_NUM; i++)
			{
				printf("%bx ", rDat[i]);
				//发送0x55, 对应收到 0x0-0x9，判断是否全部对应
				if(rDat[i] == i)
				{
					cnt++;
				}
				else
				{
					cnt = 0;
				}
			}		
			/* 全部对应 */
			if(cnt == SLAVE_RX_NUM) 
			{
				cnt = 0;
				printf("\nPASS");
			}
			else 
			{
				fail_cnt++;
				/*超过5次没有对应，锁住*/
				if(fail_cnt >= 5) 
				{
					printf("\nFAIL");
					while(1);
				}
			}
			delay_ms(100);     
		}
}