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


/**********************************************************/

INT8U tx_dat[SLAVE_RECV_NUM] = {0};
INT8U rx_dat[SLAVE_RECV_NUM] = {0};
INT8U rx_first = 0;
INT8U wr_addr;
INT8U adrtmp;	

#define I2C_ADR	 0x5A //从机地址

/**
	* @brief  I2C中断服务
  * @param  None
  * @retval None
	*/
void i2c_trdata(void) interrupt 5
{
	static INT8S wr = 0; 
	
	/* 器件地址 */
	if(IF_RXADR == (I2CFLG & IF_RXADR)) //接收到正确从机地址标志
	{
		adrtmp = I2CDAT;

		if(adrtmp == I2C_ADR || adrtmp == (I2C_ADR+1))
		{			
			if(adrtmp&0x01 == 0x01) 					//从机地址正确时，I2CDAT的bit0为1时主机读，为0时主机写
			{
				wr = READ;											//wr为1，主机读
				
				/* 先发一个字节 */
				if(wr_addr < SLAVE_RECV_NUM)
				{
					I2CDAT = tx_dat[wr_addr]; 		//发送数据
				}
			}
			else
			{
				wr = WRITE;
				rx_first = 1;
				wr_addr = 0;
			}
			I2CFLG &= ~IF_RXADR; 							//清标志
		}
	}
	
	if(adrtmp == I2C_ADR || adrtmp == (I2C_ADR+1))
	{
		/* 接收数据 */
		if(IF_RXDAT == (I2CFLG & IF_RXDAT)) //I2C接收到一个字节数据
		{
			//printf("\nRX: %bx", I2CDAT);
			if(wr_addr >= SLAVE_RECV_NUM)    
			{
				wr_addr = SLAVE_RECV_NUM;
			}
			else
			{
				if(wr == WRITE)
				{
					/* 写入的第一个数据为地址 */
					if(rx_first == 1) 
					{
						wr_addr = I2CDAT;
						rx_first = 0;
					}		
					else
					{
						rx_dat[wr_addr++] = I2CDAT;
					}
				}
			}
			I2CFLG &= ~IF_RXDAT;							//清标志
		}
		
		/* 发送数据 */
		if(IF_TXDAT == (I2CFLG & IF_TXDAT)) //I2C发送完一个字节数据
		{
			//printf("\nTX");
			wr_addr++;
			if(wr_addr >= SLAVE_RECV_NUM) 
			{
				wr_addr = SLAVE_RECV_NUM;
			}
			else
			{
				I2CDAT = tx_dat[wr_addr];
			}
			I2CFLG &= ~IF_TXDAT;							//清标志
		}	
	}
	/* NAK */
	if(RXNAK == (I2CFLG & RXNAK))				//总线接收到NAK
	{
		//printf("\nNAK");
		I2CFLG &= ~RXNAK;									//清标志
	}
}

/**
	* @brief  I2C初始化
  * @param  None
  * @retval None
	*/
void I2C_Init(void)
{
	P00_FUN_I2C;												  //P00配置为IIC功能
	P01_FUN_I2C;													//P01配置为IIC功能
	SCL_P00;															//P00做SCL
	SDA_P01;															//P01做SDA
	I2CCON = I2CE + I2CIE + AD2E + ICKS;	//I2C使能+I2C中断使能+可配置从机地址+13.5MHz时钟
	I2CFLG = BUSIDLE;											//总线空闲
	INT_I2C;															//I2C中断配置
	
}

/**
	* @brief  I2C数据初始化
  * @param  None
  * @retval None
	*/
void I2C_data_init()
{
	INT16S i;
	
	for(i=0; i<SLAVE_RECV_NUM; i++)//从机发送字节长度10
	{
		tx_dat[i] = i + 0x30;	//0123......
	}	
		
	for(i=0; i<SLAVE_RECV_NUM; i++)
	{
		rx_dat[i] = 0;
	}	
}

/**
	* @brief  I2C接收数据打印
  * @param  None
  * @retval None
	*/
void I2C_recv_print()
{
	INT16S i;
	
	printf("\nrecv:");
	for(i=0; i<SLAVE_RECV_NUM; i++)
	{
		printf("%bx ", rx_dat[i]);
	}
}

/**
	* @brief  I2C接收数据检查
  * @param  None
	* @retval 0：接收错误, 1: 接收正确
	*/
char I2C_recv_check()
{
	INT16S i;
	
	for(i=0; i<SLAVE_RECV_NUM; i++)
	{
		if(i != rx_dat[i])
		{
			return 0; 
		}
	}
	return 1; 
}
/**
	* @brief  I2C接收数据测试
  * @param  None
	* @retval 
	*/
void I2C_TEST()
{
		INT8U RES;
		INT16S fail_cnt = 0;
		if(I2C_recv_check())	//1：接收数据正确
		{
			I2C_recv_print();		//I2C接收数据打印
			printf("\nPASS");
			RES = 0x55;
			while(1);
		}
		else									//0：接收数据错误
		{
			fail_cnt++;
			if(fail_cnt >= 500)
			{
				printf("\nFAIL");
				RES = 0xAA;
				while(1);
			}
		}
}