736 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			736 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include "jw3425iic.h"
 | ||
| #include "gpio_cfg.h"
 | ||
| #include "base/delay.h"
 | ||
| #include "interface/basechecker.h"
 | ||
| #include "base/utility.h"
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| void IIC_SDA_DIR(uint8_t dir)
 | ||
| {
 | ||
| 	GPIO_InitTypeDef GPIO_InitStructure;
 | ||
| 	if(dir == 0)
 | ||
| 	{
 | ||
| 		
 | ||
| 		GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
 | ||
| 			
 | ||
| 	}else{
 | ||
| 		GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
 | ||
| 	}
 | ||
| 	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
 | ||
| 	GPIO_InitStructure.GPIO_Pin= I2IC_SDA_Pin;
 | ||
| 	GPIO_Init(GPIOB,&GPIO_InitStructure);
 | ||
| }
 | ||
| 
 | ||
| void I2C_init(void)
 | ||
| {
 | ||
| 	GPIO_InitTypeDef GPIO_InitStructure;
 | ||
| 	  /* enable GPIOB clock */
 | ||
| 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
 | ||
|    	//GPIO 配置
 | ||
| 	GPIO_InitStructure.GPIO_Pin=I2IC_SCL_Pin | I2IC_SDA_Pin;
 | ||
| 	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
 | ||
| 	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
 | ||
| 	GPIO_Init(GPIOB,&GPIO_InitStructure);
 | ||
| 	IIC_SDA(1);
 | ||
|   IIC_SCL(1); 
 | ||
| }
 | ||
| void I2C_Definit(void)
 | ||
| {
 | ||
| 	 	GPIO_InitTypeDef GPIO_InitStructure;
 | ||
| 	  /* enable GPIOB clock */
 | ||
| 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
 | ||
|    	//GPIO 配置
 | ||
| 	GPIO_InitStructure.GPIO_Pin=I2IC_SCL_Pin | I2IC_SDA_Pin;
 | ||
| 	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
 | ||
| 	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
 | ||
| 	GPIO_Init(GPIOB,&GPIO_InitStructure);
 | ||
| }
 | ||
| //产生IIC起始信号
 | ||
| void IIC_Start(void)
 | ||
| {
 | ||
| 	SDA_OUT();    //sda线输出
 | ||
| 	IIC_SDA(1);	  	  
 | ||
| 	IIC_SCL(1);
 | ||
| 	delay_us(IIC_PLUS_DELAY);
 | ||
|  	IIC_SDA(0);//START:when CLK is high,DATA change form high to low 
 | ||
| 	delay_us(IIC_PLUS_DELAY);
 | ||
| 	IIC_SCL(0);//钳住I2C总线,准备发送或接收数据 
 | ||
| }	
 | ||
| //产生IIC停止信号
 | ||
| void IIC_Stop(void)
 | ||
| {
 | ||
| 	SDA_OUT();//sda线输出
 | ||
| 	IIC_SCL(0);
 | ||
| 	IIC_SDA(0);//STOP:when CLK is high DATA change form low to high
 | ||
|  	delay_us(IIC_PLUS_DELAY);
 | ||
| 	IIC_SCL(1); 
 | ||
| 	delay_us(IIC_PLUS_DELAY);			
 | ||
| 	IIC_SDA(1);//发送I2C总线结束信号				   	
 | ||
| }
 | ||
| 
 | ||
| //等待应答信号到来
 | ||
| //返回值:1,接收应答失败
 | ||
| //        0,接收应答成功
 | ||
| uint8_t IIC_Wait_Ack(void)
 | ||
| {
 | ||
| 	uint32_t ucErrTime=0;
 | ||
| 	SDA_IN();      //SDA设置为输入  
 | ||
| 	IIC_SDA(1);
 | ||
| 	delay_us(1);	   
 | ||
| 	IIC_SCL(1);
 | ||
| 	delay_us(IIC_PLUS_DELAY>>1);	 
 | ||
| 	while(READ_SDA)
 | ||
| 	{
 | ||
| 		ucErrTime++;
 | ||
| 		if(ucErrTime>I2C_OPERATION_OUTTIME)
 | ||
| 		{
 | ||
| 			IIC_Stop();
 | ||
| 			return 1;
 | ||
| 		}
 | ||
| 	}
 | ||
| 	IIC_SCL(0);//时钟输出0 	     
 | ||
| 	return 0;  
 | ||
| }
 | ||
| //产生ACK应答
 | ||
| void IIC_Ack(void)
 | ||
| {
 | ||
| 	IIC_SCL(0);
 | ||
| 	SDA_OUT();
 | ||
| 	IIC_SDA(0);
 | ||
| 	delay_us(IIC_PLUS_DELAY);
 | ||
| 	IIC_SCL(1);
 | ||
| 	delay_us(IIC_PLUS_DELAY);
 | ||
| 	IIC_SCL(0);
 | ||
| }
 | ||
| //不产生ACK应答		    
 | ||
| void IIC_NAck(void)
 | ||
| {
 | ||
| 	IIC_SCL(0);
 | ||
| 	SDA_OUT();
 | ||
| 	IIC_SDA(1);
 | ||
| 	delay_us(IIC_PLUS_DELAY);
 | ||
| 	IIC_SCL(1);
 | ||
| 	delay_us(IIC_PLUS_DELAY);
 | ||
| 	IIC_SCL(0);
 | ||
| }
 | ||
| //IIC发送一个字节
 | ||
| //返回从机有无应答
 | ||
| //0,有应答
 | ||
| //1,无应答			  
 | ||
| uint8_t IIC_Send_Byte(uint8_t txd)
 | ||
| {                        
 | ||
|     uint8_t t;   
 | ||
| 		SDA_OUT(); 	    
 | ||
|     for(t=0;t<8;t++)
 | ||
|     {              
 | ||
| 			IIC_SCL(0);//拉低时钟开始数据传输
 | ||
| 			delay_us(IIC_PLUS_DELAY>>1);  
 | ||
|       IIC_SDA((txd&0x80)>>7);
 | ||
|       txd<<=1; 	  
 | ||
| 			delay_us(IIC_PLUS_DELAY>>1);   
 | ||
| 			IIC_SCL(1);
 | ||
| 			delay_us(IIC_PLUS_DELAY); 
 | ||
|     }	 
 | ||
| 		IIC_SCL(0);	
 | ||
| 		delay_us(IIC_PLUS_DELAY >>1);
 | ||
| 
 | ||
| 		return IIC_Wait_Ack();
 | ||
| } 
 | ||
| 
 | ||
| //读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
 | ||
| uint8_t IIC_Read_Byte(unsigned char ack)
 | ||
| {
 | ||
| 	unsigned char i,receive=0;
 | ||
| 	SDA_IN();//SDA设置为输入
 | ||
|     for(i=0;i<8;i++ )
 | ||
| 	{
 | ||
|         IIC_SCL(0); 
 | ||
|         delay_us(IIC_PLUS_DELAY);
 | ||
| 				IIC_SCL(1);
 | ||
| 			  delay_us(IIC_PLUS_DELAY>>1);
 | ||
|         receive<<=1;
 | ||
|         if(READ_SDA)receive++;   
 | ||
| 				delay_us(IIC_PLUS_DELAY >> 1); 
 | ||
|     }					 
 | ||
|     if (!ack)
 | ||
|         IIC_NAck();//发送nACK
 | ||
|     else
 | ||
|         IIC_Ack(); //发送ACK   
 | ||
|     return receive;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| /* @param bi_dir: option using in transceive */
 | ||
| int32_t I2C_master_write(uint16_t address, uint8_t *src, uint32_t size, uint32_t *nwriten, uint8_t bi_dir)
 | ||
| {
 | ||
|     uint32_t timeout = 0;
 | ||
| 		uint8_t ack = 0;
 | ||
|     *nwriten = 0;
 | ||
| 	__disable_irq();
 | ||
| 		IIC_Start();
 | ||
| 	//发送地址
 | ||
| 		ack = IIC_Send_Byte(( address<<1));
 | ||
| 		if(ack)
 | ||
| 		{
 | ||
| 			goto iic_send_stop;
 | ||
| 		}
 | ||
| 		while (*nwriten < size) {
 | ||
| 			ack = IIC_Send_Byte(src[*nwriten]);
 | ||
| 			if(ack)
 | ||
| 			{
 | ||
| 				break;
 | ||
| 			}
 | ||
| 			(*nwriten)++;
 | ||
| 	}
 | ||
| 			
 | ||
| iic_send_stop:
 | ||
| 		if(bi_dir ==0)//bi_dir == 1时不发送停止信号
 | ||
| 		{
 | ||
| 			IIC_Stop();
 | ||
| 		}
 | ||
| 		__enable_irq();
 | ||
| 		return ack;
 | ||
| }
 | ||
| 
 | ||
| /* @param bi_dir: option using in transceive */
 | ||
| int32_t I2C_master_read(uint16_t address, uint8_t *dst, uint32_t size, uint32_t *nread, uint8_t bi_dir)
 | ||
| {
 | ||
|     uint32_t i;
 | ||
|     *nread = 0;
 | ||
| 		uint8_t ack = 0;
 | ||
|     if (size == 0)
 | ||
|         return 0;
 | ||
| 		__disable_irq();
 | ||
| 		IIC_Start();//重新发送起始信号
 | ||
| 		ack = IIC_Send_Byte(( address << 1) | 0x01);//发送读命令地址
 | ||
| 		if(ack)
 | ||
| 			goto send_stop_err;
 | ||
| 		while(*nread < size)
 | ||
| 		{
 | ||
| 			if((*nread) == (size-1))//倒数1个字节,设置不应答
 | ||
| 			{
 | ||
| 				dst[*nread] = IIC_Read_Byte(0);
 | ||
| 			}else{
 | ||
| 				dst[*nread] = IIC_Read_Byte(1);
 | ||
| 			}			
 | ||
| 			(*nread)++;
 | ||
| 		}
 | ||
| send_stop_err:
 | ||
|     // If receive NACK or no data to write, send STOP
 | ||
|     if (bi_dir == 0)
 | ||
|         IIC_Stop();
 | ||
| 	__enable_irq();
 | ||
|     return ack;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| /* @param bi_dir: option using in transceive */
 | ||
| int32_t I2C_master_write_read(uint16_t address, uint8_t*cmd, uint8_t cmd_size,uint8_t *dst, uint32_t read_size, uint32_t *nread)
 | ||
| {
 | ||
| 		uint32_t ul_writen;
 | ||
|     *nread = 0;
 | ||
| 
 | ||
|     if (read_size  == 0)
 | ||
|         return 0;
 | ||
| 		I2C_master_write(address,cmd,cmd_size,&ul_writen,1);
 | ||
| 		if(ul_writen != cmd_size)
 | ||
| 		{
 | ||
| 			 IIC_Stop();
 | ||
| 			return 1;
 | ||
| 		}
 | ||
|     I2C_master_read(address, dst,  read_size, nread, 1);
 | ||
| 		IIC_Stop();
 | ||
| 		if(read_size != *nread)
 | ||
| 		{
 | ||
| 			return 1;
 | ||
| 		}
 | ||
| 		return 0;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| int32_t I2C_master_writeCode(uint16_t address, uint8_t *cmd_src, uint32_t cmd_len,const uint8_t* puc_cod,uint32_t code_len )
 | ||
| {
 | ||
| 		uint8_t uc_code;
 | ||
| 		uint8_t ack = 0;
 | ||
| 	__disable_irq();
 | ||
| 		IIC_Start();
 | ||
| 	//发送地址
 | ||
| 		ack = IIC_Send_Byte(( address<<1));
 | ||
| 		if(ack)
 | ||
| 		{
 | ||
| 			IIC_Stop();
 | ||
| 				__enable_irq();
 | ||
| 			return ack;
 | ||
| 		}
 | ||
| 		//发送命令
 | ||
| 		while (cmd_len > 0) {
 | ||
| 			ack = IIC_Send_Byte(*cmd_src);
 | ||
| 			if(ack)
 | ||
| 			{
 | ||
| 				IIC_Stop();
 | ||
| 					__enable_irq();
 | ||
| 				return ack;
 | ||
| 			}
 | ||
| 			cmd_src++;
 | ||
| 			cmd_len--;
 | ||
| 	}
 | ||
| 		//发送代码数据
 | ||
| 		while (code_len > 0) {
 | ||
| 			uc_code = *puc_cod;
 | ||
| 			ack = IIC_Send_Byte(uc_code);
 | ||
| 			if(ack)
 | ||
| 			{
 | ||
| 				IIC_Stop();
 | ||
| 				__enable_irq();
 | ||
| 				return ack;
 | ||
| 			}
 | ||
| 			puc_cod++;
 | ||
| 			code_len--;
 | ||
| 	}
 | ||
| 		IIC_Stop();
 | ||
| 		__enable_irq();
 | ||
| 		return ack;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| int32_t I2C_master_CodeEquel(uint16_t address, uint8_t *cmd_src, uint32_t cmd_len,const uint8_t* puc_cod,uint32_t code_len )
 | ||
| {
 | ||
| 	uint8_t uc_code;
 | ||
| 	uint8_t uc_rdata;
 | ||
| 	uint8_t ack = 0;
 | ||
| 	__disable_irq();
 | ||
| 	IIC_Start();
 | ||
| //发送地址
 | ||
| 	ack = IIC_Send_Byte(( address<<1));
 | ||
| 	if(ack)
 | ||
| 	{
 | ||
| 		IIC_Stop();
 | ||
| 		__enable_irq();
 | ||
| 		return ack;
 | ||
| 	}
 | ||
| 	//发送命令
 | ||
| 	while (cmd_len > 0) {
 | ||
| 		ack = IIC_Send_Byte(*cmd_src);
 | ||
| 		if(ack)
 | ||
| 		{
 | ||
| 			IIC_Stop();
 | ||
| 			__enable_irq();
 | ||
| 			return ack;
 | ||
| 		}
 | ||
| 		cmd_src++;
 | ||
| 		cmd_len--;
 | ||
| 	}
 | ||
| 	IIC_Start();//重新发送起始信号
 | ||
| 	ack = IIC_Send_Byte(( address << 1) | 0x01);//发送读命令地址	
 | ||
| 	if(ack)
 | ||
| 	{
 | ||
| 		IIC_Stop();
 | ||
| 		__enable_irq();
 | ||
| 		return ack;
 | ||
| 	}
 | ||
| 	while(code_len > 0)
 | ||
| 	{
 | ||
| 		uc_code = *puc_cod;
 | ||
| 		puc_cod++;
 | ||
| 		if(code_len == 1)//倒数1个字节,设置不应答
 | ||
| 		{
 | ||
| 			uc_rdata = IIC_Read_Byte(0);
 | ||
| 		}else{
 | ||
| 			uc_rdata = IIC_Read_Byte(1);
 | ||
| 		}			
 | ||
| 		if(uc_code != uc_rdata)
 | ||
| 		{
 | ||
| 			ack = 1;
 | ||
| 			break;
 | ||
| 		}
 | ||
| 		code_len--;
 | ||
| 	}
 | ||
| 	IIC_Stop();
 | ||
| 	__enable_irq();
 | ||
| 	return ack;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| /******************IIC trim **********************/
 | ||
| #define SLAVE_IIC_ADDR_   0x18
 | ||
| /*
 | ||
| @brief   Vref电压校准
 | ||
| @param0  0不更新,1更新
 | ||
| @param1  校准值
 | ||
| */
 | ||
| void MC_VrefTrim(void)
 | ||
| {
 | ||
| 	uint8_t auc_cmd[]={0x10,0xEF,0x00};
 | ||
| 	uint8_t auc_run_cmd[]={0x18,0xE7};
 | ||
| 	uint32_t ul_sendlen = 0;
 | ||
| 	uint8_t uc_ack = 0;
 | ||
| 	auc_cmd[2] = checker_runcfg.params[1] & 0x0F;
 | ||
| 	uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_cmd,sizeof(auc_cmd),&ul_sendlen,0);
 | ||
| 	if(uc_ack != 0 || checker_runcfg.params[0] == 0)
 | ||
| 	{
 | ||
| 		Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex);
 | ||
| 		return ;
 | ||
| 	}
 | ||
| 	uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_run_cmd,sizeof(auc_run_cmd),&ul_sendlen,0);
 | ||
| 	Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex);
 | ||
| }
 | ||
| /*
 | ||
| @brief   Iref电压校准
 | ||
| @param0  Iref1 0不更新,1更新
 | ||
| @param1  Iref2 0不更新,1更新
 | ||
| @param2  Iref1 校准值
 | ||
| @param3  Iref2 校准值
 | ||
| */
 | ||
| void MC_IrefTrim(void)
 | ||
| {
 | ||
| 	uint8_t auc_cmd[]={0x12,0xED,0x00};
 | ||
| 	uint8_t auc_run1_cmd[]={0x19,0xE6};
 | ||
| 	uint8_t auc_run2_cmd[]={0x1A,0xE5};
 | ||
| 	uint32_t ul_sendlen = 0;
 | ||
| 	uint8_t uc_ack = 0;
 | ||
| 	auc_cmd[2] = (checker_runcfg.params[2] & 0x0F) | ((checker_runcfg.params[3] & 0x0F)<<4);
 | ||
| 	uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_cmd,sizeof(auc_cmd),&ul_sendlen,0);
 | ||
| 	if(uc_ack != 0)
 | ||
| 	{
 | ||
| 		Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex);
 | ||
| 		return ;
 | ||
| 	}
 | ||
| 	if(checker_runcfg.params[0] != 0)
 | ||
| 	{
 | ||
| 		uc_ack |= I2C_master_write(SLAVE_IIC_ADDR_,auc_run1_cmd,sizeof(auc_run1_cmd),&ul_sendlen,0);
 | ||
| 	}
 | ||
| 	if(checker_runcfg.params[1] != 0)
 | ||
| 	{
 | ||
| 		uc_ack |= I2C_master_write(SLAVE_IIC_ADDR_,auc_run2_cmd,sizeof(auc_run2_cmd),&ul_sendlen,0);
 | ||
| 	}
 | ||
| 	Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex);
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| /*
 | ||
| @brief   Iref1电压校准
 | ||
| @param0  0不更新,1更新
 | ||
| @param1  校准值
 | ||
| */
 | ||
| void MC_RC4MTrim(void)
 | ||
| {
 | ||
| 	uint8_t auc_cmd[]={0x14,0xEB,0x00};
 | ||
| 	uint8_t auc_run_cmd[]={0x1B,0xE4};
 | ||
| 	uint32_t ul_sendlen = 0;
 | ||
| 	uint8_t uc_ack = 0;
 | ||
| 	auc_cmd[2] = checker_runcfg.params[1] & 0x3F;
 | ||
| 	uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_cmd,sizeof(auc_cmd),&ul_sendlen,0);
 | ||
| 	if(uc_ack != 0 || checker_runcfg.params[0] == 0)
 | ||
| 	{
 | ||
| 		Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex);
 | ||
| 		return ;
 | ||
| 	}
 | ||
| 	uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_run_cmd,sizeof(auc_run_cmd),&ul_sendlen,0);
 | ||
| 	Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex);
 | ||
| }
 | ||
| 
 | ||
| /*
 | ||
| @brief   RC128K校准
 | ||
| @param0  0不更新,1更新
 | ||
| @param1  校准值
 | ||
| */
 | ||
| void MC_RC128KTrim(void)
 | ||
| {
 | ||
| 	uint8_t auc_cmd[]={0x15,0xEA,0x00};
 | ||
| 	uint8_t auc_run_cmd[]={0x1C,0xE3};
 | ||
| 	uint32_t ul_sendlen = 0;
 | ||
| 	uint8_t uc_ack = 0;
 | ||
| 	auc_cmd[2] = checker_runcfg.params[1] & 0x1F;
 | ||
| 	uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_cmd,sizeof(auc_cmd),&ul_sendlen,0);
 | ||
| 	if(uc_ack != 0 || checker_runcfg.params[0] == 0)
 | ||
| 	{
 | ||
| 		Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex);
 | ||
| 		return ;
 | ||
| 	}
 | ||
| 	uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_run_cmd,sizeof(auc_run_cmd),&ul_sendlen,0);
 | ||
| 	Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex);
 | ||
| }
 | ||
| 
 | ||
| /*
 | ||
| @brief   设置MTP电压
 | ||
| @param0  低压
 | ||
| @param1  高压
 | ||
| */
 | ||
| void MC_SetMTPVol(void)
 | ||
| {
 | ||
| 	uint8_t auc_cmd[]={0x22,0xDD,0x00};
 | ||
| 	uint32_t ul_sendlen = 0;
 | ||
| 	uint8_t uc_ack = 0;
 | ||
| 	auc_cmd[2] = (checker_runcfg.params[0] & 0x03) | ((checker_runcfg.params[1] & 0x0F)<<2);
 | ||
| 	uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_cmd,sizeof(auc_cmd),&ul_sendlen,0);
 | ||
| 	Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex);
 | ||
| }
 | ||
| 
 | ||
| /*
 | ||
| @brief   设置MTP电压
 | ||
| @param0  MTP地址
 | ||
| @param1  擦除模式
 | ||
| */
 | ||
| void MC_EraseMTP(void)
 | ||
| {
 | ||
| 	uint8_t auc_erase_cmd[]={0x00,0x00};
 | ||
| 	uint8_t auc_setAddr_cmd[]={0x23,0xDC,0x00,0x00};
 | ||
| 	uint32_t ul_sendlen = 0;
 | ||
| 	uint8_t uc_ack = 0;
 | ||
| 	auc_setAddr_cmd[2] = (checker_runcfg.params[0]>>8) & 0xFF;
 | ||
| 	auc_setAddr_cmd[3] = checker_runcfg.params[0] & 0xFF;
 | ||
| 	uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_setAddr_cmd,sizeof(auc_setAddr_cmd),&ul_sendlen,0);
 | ||
| 	if(uc_ack != 0)
 | ||
| 	{
 | ||
| 			Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex);
 | ||
| 			return;
 | ||
| 	}
 | ||
| 	ul_sendlen = 0;
 | ||
| 	auc_erase_cmd[0] = checker_runcfg.params[1];
 | ||
| 	switch(checker_runcfg.params[1])
 | ||
| 	{
 | ||
| 		case 0x25: auc_erase_cmd[1] = 0xDA; break;//全片擦除
 | ||
| 		case 0x26: auc_erase_cmd[1] = 0xD9; break;//块擦除
 | ||
| 		case 0x27: auc_erase_cmd[1] = 0xD8; break;//页擦除
 | ||
| 		case 0x28: auc_erase_cmd[1] = 0xD7; break;//字擦除
 | ||
| 	}
 | ||
| 	uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_erase_cmd,sizeof(auc_erase_cmd),&ul_sendlen,0);
 | ||
| 	Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex);
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| /*
 | ||
| @brief   MTP写入数据
 | ||
| @param0..N  编程数据
 | ||
| */
 | ||
| void MC_IICWriteMTP(void)
 | ||
| {
 | ||
| 	uint8_t auc_cmd[16]={0x29,0xD6};
 | ||
| 	uint32_t ul_sendlen = 0;
 | ||
| 	uint8_t uc_ack = 0;
 | ||
| 	uint16_t us_index = 0;
 | ||
| 	for(us_index = 0; us_index < checker_runcfg.param_count;us_index++)
 | ||
| 	{
 | ||
| 		auc_cmd[us_index+2] = checker_runcfg.params[us_index];
 | ||
| 	}
 | ||
| 	
 | ||
| 	uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_cmd,us_index+2,&ul_sendlen,0);
 | ||
| 	
 | ||
| 	Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex);
 | ||
| }
 | ||
| /*
 | ||
| @brief   MTP读数据
 | ||
| @param0	 读取MTP地址
 | ||
| @param1  读取数据字节长度
 | ||
| */
 | ||
| void MC_IICReadMTP(void)
 | ||
| {
 | ||
| 	
 | ||
| 	uint8_t auc_setAddr_cmd[]={0x23,0xDC,0x00,0x00};
 | ||
| 	uint8_t auc_cmd[]={0x2A,0xD5};
 | ||
| 	uint32_t ul_readlen = 0;
 | ||
| 	uint8_t uc_ack = 0;
 | ||
| 	uint16_t us_buf[32];
 | ||
| 	uint32_t ul_sendlen = 0;
 | ||
| 	auc_setAddr_cmd[2] = (checker_runcfg.params[0]>>8) & 0xFF;
 | ||
| 	auc_setAddr_cmd[3] = checker_runcfg.params[0] & 0xFF;
 | ||
| 	if(checker_runcfg.params[1] > 64)
 | ||
| 	{
 | ||
| 		checker_runcfg.params[1] = 64;
 | ||
| 	}
 | ||
| 	uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_setAddr_cmd,sizeof(auc_setAddr_cmd),&ul_sendlen,0);
 | ||
| 	delay_ms(10);
 | ||
| 	if(uc_ack != 0)
 | ||
| 	{
 | ||
| 		Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex);
 | ||
| 		return ;
 | ||
| 	}
 | ||
| 	uc_ack = I2C_master_write_read(SLAVE_IIC_ADDR_,auc_cmd,sizeof(auc_cmd),(uint8_t*)us_buf,checker_runcfg.params[1],&ul_readlen);
 | ||
| 	Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex);
 | ||
| 	Checker_SetRtv(us_buf,checker_runcfg.rtv_count);
 | ||
| }
 | ||
| 
 | ||
| /*
 | ||
| @brief   MTP状态查询
 | ||
| */
 | ||
| void MC_IICCheckMTPState(void)
 | ||
| {
 | ||
| 	uint8_t auc_cmd[]={0x30,0xBF};
 | ||
| 	uint32_t ul_readlen = 0;
 | ||
| 	uint8_t uc_ack = 0;
 | ||
| 	uint16_t ul_rtv;
 | ||
| 	uc_ack = I2C_master_write_read(SLAVE_IIC_ADDR_,auc_cmd,sizeof(auc_cmd),(uint8_t*)&ul_rtv,1,&ul_readlen);
 | ||
| 	Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex);
 | ||
| 	Checker_SetRtv(&ul_rtv,checker_runcfg.rtv_count);
 | ||
| }
 | ||
| 
 | ||
| /*
 | ||
| @brief   MTP使能或失能
 | ||
| @param0  0失/1使能
 | ||
| */
 | ||
| void MC_IICEnMTP(void)
 | ||
| {
 | ||
| 	uint8_t auc_cmd[]={0x20,0x20,0};
 | ||
| 	uint32_t ul_sendlen = 0;
 | ||
| 	uint8_t uc_ack = 0;
 | ||
| 	if(checker_runcfg.params[0] == 0)
 | ||
| 	{
 | ||
| 		auc_cmd[2] = 0x33;
 | ||
| 	}else{
 | ||
| 		auc_cmd[2] = 0xCC;
 | ||
| 	}
 | ||
| 	uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_cmd,sizeof(auc_cmd),&ul_sendlen,0);
 | ||
| 	Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex);
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| /*
 | ||
| @brief MTP下载程序
 | ||
| @param 更新地址
 | ||
| @param 烧录长度
 | ||
| */
 | ||
| void MC_IICUpdateMTP(void)
 | ||
| {
 | ||
| 	uint8_t uc_ack;
 | ||
| 	uint8_t auc_enMTP_cmd[]={0x20,0x20,0xCC};
 | ||
| 	uint8_t auc_setAddr_cmd[]={0x23,0xDC,0x00,0x00};
 | ||
| 	uint8_t auc_setMTPOperReg_cmd[]={0x20,0xDF,0x00};
 | ||
| 	uint8_t auc_earse_cmd[]={0x25,0xDA};
 | ||
| 	uint8_t auc_setMTPVol[]={0x22,0xDD,0x18};//1.5V 5V
 | ||
| 	uint8_t auc_program_cmd[]={0x29,0xD6};
 | ||
| 	uint8_t auc_readCode_cmd[]={0x2A,0xD5};
 | ||
| 	uint32_t ul_sendlen;
 | ||
| 	uint16_t us_programLen = checker_runcfg.params[1];
 | ||
| 	uint8_t* puc_Master_addr = (uint8_t*)(MC_CODE_ADDR + checker_runcfg.params[0]);
 | ||
| 	uint16_t ul_rtv = 0;
 | ||
| 	uint32_t ul_crc32 = 0;
 | ||
| 	
 | ||
| 	ul_crc32 = Crc32Calu((uint32_t*)MC_CODE_ADDR,16*1024);
 | ||
| 	if(ul_crc32 != boardinfo_un.boardinfo.mc_ICodeCrc32)
 | ||
| 	{
 | ||
| 		uc_ack = 1;
 | ||
| 		Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex);
 | ||
| 		ul_rtv = 1;
 | ||
| 		Checker_SetRtv(&ul_rtv,checker_runcfg.rtv_count);
 | ||
| 		return;
 | ||
| 	}
 | ||
| 	
 | ||
| 	if(checker_runcfg.params[0] == 0x1000)
 | ||
| 	{
 | ||
| 		auc_setMTPOperReg_cmd[2] = 0x04;
 | ||
| 		auc_earse_cmd[0]= 0x27;
 | ||
| 		auc_earse_cmd[1]= 0xD8;
 | ||
| 		
 | ||
| 	}else{
 | ||
| 		auc_setMTPOperReg_cmd[2] = 0x00;
 | ||
| 	}
 | ||
| 	auc_setAddr_cmd[2] = (checker_runcfg.params[0]>>8) & 0xFF;
 | ||
| 	auc_setAddr_cmd[3] = checker_runcfg.params[0] & 0xFF;
 | ||
| 	uc_ack = 0;
 | ||
| 	uc_ack += I2C_master_write(SLAVE_IIC_ADDR_,auc_enMTP_cmd,sizeof(auc_enMTP_cmd),&ul_sendlen,0);
 | ||
| 	delay_ms(5);
 | ||
| 	uc_ack += I2C_master_write(SLAVE_IIC_ADDR_,auc_enMTP_cmd,sizeof(auc_enMTP_cmd),&ul_sendlen,0);
 | ||
| 	delay_ms(5);
 | ||
| 	uc_ack += I2C_master_write(SLAVE_IIC_ADDR_,auc_enMTP_cmd,sizeof(auc_enMTP_cmd),&ul_sendlen,0);
 | ||
| 	delay_ms(5);
 | ||
| 	//设置MTP操作范围
 | ||
| 	if(uc_ack > 2)
 | ||
| 	{
 | ||
| 		uc_ack = 1;
 | ||
| 		Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex);
 | ||
| 		ul_rtv = 2;
 | ||
| 		Checker_SetRtv(&ul_rtv,checker_runcfg.rtv_count);
 | ||
| 		return;
 | ||
| 	}
 | ||
| 	
 | ||
| 
 | ||
| 	uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_setMTPOperReg_cmd,sizeof(auc_setMTPOperReg_cmd),&ul_sendlen,0);
 | ||
| 	//设置MTP操作范围
 | ||
| 	if(uc_ack != 0)
 | ||
| 	{
 | ||
| 		Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex);
 | ||
| 		ul_rtv = 3;
 | ||
| 		Checker_SetRtv(&ul_rtv,checker_runcfg.rtv_count);
 | ||
| 		return;
 | ||
| 	}
 | ||
| 	delay_ms(1);
 | ||
| 	//设置MTP电压
 | ||
| 	uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_setMTPVol,sizeof(auc_setMTPVol),&ul_sendlen,0);
 | ||
| 	if(uc_ack != 0)
 | ||
| 	{
 | ||
| 		Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex);
 | ||
| 		ul_rtv = 4;
 | ||
| 		Checker_SetRtv(&ul_rtv,checker_runcfg.rtv_count);
 | ||
| 		return;
 | ||
| 	}
 | ||
| 	delay_ms(1);
 | ||
| 	//设置地址
 | ||
| 	uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_setAddr_cmd,sizeof(auc_setAddr_cmd),&ul_sendlen,0);
 | ||
| 	if(uc_ack != 0)
 | ||
| 	{
 | ||
| 		Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex);
 | ||
| 		ul_rtv = 5;
 | ||
| 		Checker_SetRtv(&ul_rtv,checker_runcfg.rtv_count);
 | ||
| 		return;
 | ||
| 	}
 | ||
| 	delay_ms(1);
 | ||
| 	//擦除
 | ||
| 	uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_earse_cmd,sizeof(auc_earse_cmd),&ul_sendlen,0);
 | ||
| 	if(uc_ack != 0)
 | ||
| 	{
 | ||
| 		Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex);
 | ||
| 		ul_rtv = 6;
 | ||
| 		Checker_SetRtv(&ul_rtv,checker_runcfg.rtv_count);
 | ||
| 		return;
 | ||
| 	}
 | ||
| 	delay_os_ms(200);
 | ||
| 		//设置地址
 | ||
| 	uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_setAddr_cmd,sizeof(auc_setAddr_cmd),&ul_sendlen,0);
 | ||
| 	if(uc_ack != 0)
 | ||
| 	{
 | ||
| 		Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex);
 | ||
| 		ul_rtv = 7;
 | ||
| 		Checker_SetRtv(&ul_rtv,checker_runcfg.rtv_count);
 | ||
| 		return;
 | ||
| 	}
 | ||
| 	delay_ms(1);
 | ||
| 	uc_ack = I2C_master_writeCode(SLAVE_IIC_ADDR_,auc_program_cmd,sizeof(auc_program_cmd),puc_Master_addr,us_programLen);
 | ||
| 	if(uc_ack != 0)
 | ||
| 	{
 | ||
| 		Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex);
 | ||
| 		ul_rtv = 8;
 | ||
| 		Checker_SetRtv(&ul_rtv,checker_runcfg.rtv_count);
 | ||
| 		return;
 | ||
| 	}
 | ||
| 	delay_ms(20);
 | ||
| 		//设置地址
 | ||
| 	uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_setAddr_cmd,sizeof(auc_setAddr_cmd),&ul_sendlen,0);
 | ||
| 	if(uc_ack != 0)
 | ||
| 	{
 | ||
| 		Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex);
 | ||
| 		ul_rtv = 9;
 | ||
| 		Checker_SetRtv(&ul_rtv,checker_runcfg.rtv_count);
 | ||
| 		return;
 | ||
| 	}
 | ||
| 	delay_ms(5);
 | ||
| 	uc_ack = I2C_master_CodeEquel(SLAVE_IIC_ADDR_,auc_readCode_cmd,sizeof(auc_readCode_cmd),puc_Master_addr,us_programLen);
 | ||
| 	if(uc_ack != 0)
 | ||
| 	{
 | ||
| 		Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex);
 | ||
| 		ul_rtv = 10;
 | ||
| 		Checker_SetRtv(&ul_rtv,checker_runcfg.rtv_count);
 | ||
| 		return;
 | ||
| 	}
 | ||
| 	Checker_MaskResult(0,checker_runcfg.task_info.runindex);
 | ||
| 	ul_rtv = 0;
 | ||
| 	Checker_SetRtv(&ul_rtv,checker_runcfg.rtv_count);
 | ||
| 	return;
 | ||
| }
 | 
