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

/**********************************************************/
INT8S result _at_ 0x7F;
INT8U i, rDat[HOST_SEND_NUM];
INT8S cnt = 0, fail_cnt = 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
}
/**
	* @brief  SPI初始化 作为4线主机
  * @param  None
  * @retval None
	*/
void SPI_INIT(void)
{	
	P21_FUN_OUTPUT;    // SPI三线，IO做SS		
	SPI_CS_HIGH();		
	P11_FUN_SDO;   		 // SDO	
	P13_FUN_SCK;    	 // SCK  
	P12_FUN_SDI;   		 // SDI  	
	SPCON = SPEN + MSTR + CKOS + CPHA;//SPI使能+主机+T2溢出标准做时钟，每两次传输一次数据+下降沿采集数据
	SPFLG = 0x00;			//不开中断
}


/**
* @brief  使用SPI发送一个字节的数据
* @param  byte：要发送的数据
* @retval None
*/
void SPI_sendByte(unsigned char byte)
{

	/* 写入冲突标志位 */
	while((SPFLG & 0x04) == 0x04);
	SPDAT = byte;

	/* transfer finish */
	while((SPFLG & 0x01) == 0);	
	SPFLG &= 0xfe;		//清标志
}
/**
* @brief  使用SPI发送一个字节的数据,每发送一个字节后从机接收一个字节
* @param  recvBuff：接收的数据的缓存
* @retval None
*/  
void test_slave(unsigned char *recvBuff)
{	 
	unsigned char i = 0;	
	
	for(i=0;i<10;++i)	
	{	
		SPI_CS_LOW();				//CS输出低
		SPI_sendByte(i);		//使用SPI发送一个字节的数据
		SPI_CS_HIGH();			//CS输出高
		delay_ms(1);	
		
		SPI_CS_LOW();				//CS输出低
		SPI_sendByte(0xFF);	//发FF
		SPI_CS_HIGH();			//CS输出高
		recvBuff[i] = SPDAT;//将数据存到数组
		delay_ms(10);
	}	
} 
/**
	* @brief  SPI测试
  * @param  None
  * @retval None
	*/
void SPI_TEST2()
{
	test_slave(rDat);//使用SPI接收从机数据,每发一个字节数据后接收一个从机发来的字节数据
	printf("\nhost recv: ");
		for(i=0; i<HOST_SEND_NUM; ++i)	
		{
			printf("%bx ", rDat[i]);	
			/* 发送0-9, 对应收到 0x55，判断是否全部对应 */
			if(rDat[i] == 0x55)
			{
				cnt++;
			}
			else
			{
				cnt = 0;
			}
			rDat[i] = 0; 
		} 		
		/* 全部对应 */
		if(cnt == HOST_SEND_NUM)
		{
			result = PASS;
			cnt = 0;
			printf("\nPASS");
		}
		else
		{
			fail_cnt++;		
			/*超过5次没有对应，锁住*/
			if(fail_cnt >= 5) 
			{
				result = FAIL;
				printf("\nFAIL");
				while(1);
			}
		}   
}