⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sc16is752.c

📁 sc16is752的底层驱动源程序! 包括所有的!
💻 C
📖 第 1 页 / 共 3 页
字号:
				if (++uartSC16IS752A_wptr==uartSC16IS752A_rbuf_size) uartSC16IS752A_wptr = 0;	// 循环缓冲区写指针加1
				if (uartSC16IS752A_wptr==uartSC16IS752A_rptr) uartSC16IS752A_aval = 0;			// 数据覆盖, 当前帧无效
				uartSC16IS752A_head = 1;										// 开始接收第2字节
			}

			break;											// 退出case
		}
		//03——0Xc7
		case 0x03:											// 数据帧第3字节
		{
			if (ch!=frame_hed3)								// 第3字节不为0xc7则丢弃
			{
				uartSC16IS752A_head = 0;					// 重新开始接收数据
				uartSC16IS752A_wptr = uartSC16IS752A_sptr;	// 接收缓冲区写指针返回
				uartSC16IS752A_cksm = 0;					// 复位校验和
				uartSC16IS752A_aval = 1;					// 当前帧有效
			}

			if (ch==frame_hed1)								// 该字节为数据帧第1字节
			{
				uartSC16IS752A_cksm += ch;					// 计算校验和
				uartSC16IS752A_rbuf[uartSC16IS752A_wptr] = ch;						// 保存数据
				if (++uartSC16IS752A_wptr==uartSC16IS752A_rbuf_size) uartSC16IS752A_wptr = 0;	// 循环缓冲区写指针加1
				if (uartSC16IS752A_wptr==uartSC16IS752A_rptr) uartSC16IS752A_aval = 0;			// 数据覆盖, 当前帧无效
				uartSC16IS752A_head = 1;								// 开始接收第2字节
			}
			break;														// 退出case
		}
		//04——system_id
		case 0x04:														// 数据帧第4字节, 系统编号
		{
			if ((ch!=system_id) && (ch!=0xff)) uartSC16IS752A_aval = 0;	// 系统编号不对, 当前帧数据无效			
			break;														// 退出case
		}
		//05——locl_type第一设备种类
		case 0x05:														// 数据帧第5字节, 第一设备种类
		{
			if ((ch!=locl_type) && (ch!=0xff)) uartSC16IS752A_aval = 0;	// 第一设备种类不对, 当前帧数据无效
			break;														// 退出case
		}
		//06——locl_addr第一设备地址
		case 0x06:														// 数据帧第6字节, 第一设备地址
		{
			if ((ch!=locl_addr) && (ch!=0xff)) uartSC16IS752A_aval = 0;	// 第一设备地址不对, 当前帧数据无效
			else if (uartSC16IS752A_aval==1) IO0CLR = LED_D2;				// 地址验证通过, 开LED_D2
			break;												// 退出case
		}
		//07——uartSC16IS752A_type第二设备种类
		case 0x07:														// 数据帧第7字节, 第二设备种类
		{

			uartSC16IS752A_type = ch;									// 保存第二设备种类
			break;														// 退出case
		}
		//08——uartSC16IS752A_addr第二设备地址
		case 0x08:														// 数据帧第8字节, 第二设备地址
		{
			uartSC16IS752A_addr = ch;									// 保存第二设备地址
			break;														// 退出case
		}
		//09——uartSC16IS752A_cmmd命令码
		case 0x09:								// 数据帧第9字节, 命令码
		{
			uartSC16IS752A_cmmd = ch;			// 保存命令码
			break;								// 退出case
		}
		//10——uartSC16IS752A_cycl发送周期号
		case 0x0a:								// 数据帧第10字节, 发送周期号
		{
			uartSC16IS752A_cycl = ch;			// 保存通讯周期
			break;								// 退出case
		}
		//11——重发次数
		case 0x0b:								// 数据帧第11字节, 重发次数
		{
			break;								// 退出case
		}
		//12——H(uartSC16IS752A_leng)数据长度高8位
		case 0x0c:								// 数据帧第12字节, 数据长度高8位
		{
			uartSC16IS752A_leng = ch << 8;		// 置数据长度高8位
			break;								// 退出case
		}
		//13——L(uartSC16IS752A_leng)数据长度低8位
		case 0x0d:								// 数据帧第13字节, 数据长度低8位
		{
			uartSC16IS752A_leng = uartSC16IS752A_leng + ch;				// 置数据长度低8位
			if (uartSC16IS752A_leng>mdata_leng) uartSC16IS752A_aval = 0;	// 数据超长, 当前帧无效
			break;										// 退出case
		}

		default:								// 接收数据部分
		{

	
			uartSC16IS752A_head--;				// 接收数据部分时uartSC16IS752A_head始终为0x0e
			if (uartSC16IS752A_leng>0) uartSC16IS752A_leng--;	// 1帧未结束, 数据长度减1
			else								// 如果1帧结束
			{
				//test disable the sum check!!
				//if ((uartSC16IS752A_aval==1) && (uartSC16IS752A_cksm==0))	// 如果是有效数据并且累加和正确
				if (uartSC16IS752A_aval==1)									// 如果是有效数据
				{
				 	uartSC16IS752A_flag++;									// 置接收结束标志
					uartSC16IS752A_sptr = uartSC16IS752A_wptr;				// 重置帧起始地址
//test
//testSend();
					//test
					uartSC16IS752A_ack();					// 主机通讯应答
				}

				uartSC16IS752A_head = 0;					// 重新开始接收数据
				uartSC16IS752A_wptr = uartSC16IS752A_sptr;	// 接收缓冲区写指针返回
				uartSC16IS752A_cksm = 0;					// 复位校验和
				uartSC16IS752A_aval = 1;					// 当前帧有效

				//IO0SET = LED_D2;							// 关LED_D2
			}
		  
			break;											// 退出case
		}
	}
}
/****************************************************************************
* 名称:RecvChannelB()
* 功能:
* 入口参数:无
* 1.查询模式下,
****************************************************************************/
void RecvChannelB(void)
{
	uchar ch;
	ReadRegister(RHR,ChannelB,&ch); 	//读取数据	
}

/*******************************************************************************
* 名    称: WriteRegister
* 功    能: 
* 入口参数: 无
* 出口参数: 无
*******************************************************************************/
void WriteRegister(uchar Reg,uchar channel,uchar Value)
{
	uchar temp[1];

	temp[0]=Value;
	Reg=Reg<<3;
	Reg=Reg+channel;
	ISendStr(ADD_SC16IS752,Reg,temp,1);
}

/*******************************************************************************
* 名    称: ReadRegister
* 功    能: 
* 入口参数: 无
* 出口参数: 无
*******************************************************************************/
void ReadRegister(uchar Reg,uchar channel,uchar *RegValue)
{
	Reg=Reg<<3;
	Reg=Reg+channel;

	IRcvStr(ADD_SC16IS752,Reg,RegValue,1);
}

/*******************************************************************************
* Not used
* 名    称: ReadData
* 功    能: 
* 入口参数: 无
* 出口参数: 无
*******************************************************************************/
void ReadData(uchar Reg,uchar channel,uchar *Value,uchar num)
{
	Reg=Reg<<3;
	Reg=Reg+channel;

	IRcvStr(ADD_SC16IS752,Reg,Value,num);
}

/*******************************************************************************
* Not used
* 名    称: WriteData
* 功    能: 
* 入口参数: 无
* 出口参数: 无
*******************************************************************************/
void WriteData(unsigned char Reg,unsigned char channel,unsigned char *Value,unsigned char num)
{
	Reg=Reg<<3;
	Reg=Reg+channel;

	ISendStr(ADD_SC16IS752,Reg,Value,num);
}

/*******************************************************************
* 名    称: 发送1字节数据函数               
函数原型: bit  ISendByte(uchar sla,uchar c);  
功能:     从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.
          如果返回1表示操作成功,否则操作有误。
注意:    使用前必须已结束总线。
********************************************************************/
uchar ISendByte(uchar sla,uchar c)
{
   i2c_start();               //启动总线
   i2c_send(sla);             //发送器件地址
   i2c_send(c);             //发送器件地址
   i2c_stop();
   i2c_delay_1ms(2);		// 延时12mS   
   return(1);
}
/*******************************************************************
* 名    称:发送多字节数据函数               
函数原型: bit  ISendStr(uchar sla,uchar suba,uchar *s,uchar no);  
功能:     从器件地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
          如果返回1表示操作成功,否则操作有误。
注意:    使用前必须已结束总线。
********************************************************************/
uchar ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
{
	uchar i;
	
	i2c_start();               //启动总线
	i2c_send(sla);             //发送器件地址
	i2c_send(suba);            //发送器件子地址
	
	for(i=0;i<no;i++)
    {   
    	i2c_send(*s);           //发送数据
     	s++;
   	} 
    i2c_stop();
   	i2c_delay_1ms(12);			// 延时12mS
   	return(1);
}

/*******************************************************************
* Not used
          发送多字节数据函数               
函数原型: bit  ISendStrExt(uchar sla,uchar *s,uchar no);  
功能:     从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
          地址sla,发送内容是s指向的内容,发送no个字节。
          如果返回1表示操作成功,否则操作有误。
注意:    使用前必须已结束总线。
********************************************************************/
uchar ISendStrExt(uchar sla,uchar *s,uchar no)
{
   uchar i;

  i2c_start();               //启动总线
  i2c_send(sla);             //发送器件地址

   for(i=0;i<no;i++)
   {   
     i2c_send(*s);            /*发送数据*/
     s++;
   } 
   i2c_stop();
   return(1);
}

/*******************************************************************
                    向有子地址器件读取多字节数据函数               
函数原型: bit  ISendStr(uchar sla,uchar suba,uchar *s,uchar no);  
功能:     从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
          地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
           如果返回1表示操作成功,否则操作有误。
注意:    使用前必须已结束总线。
********************************************************************/
uchar IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
{
   uchar i;

   i2c_start();              //启动总线
   i2c_send(sla);            //发送器件地址
   i2c_send(suba);           /*发送器件子地址*/

   i2c_start();				 /*重新启动总线*/
   i2c_send(sla+1);

   for(i=0;i<no-1;i++)
   {   
     *s=i2c_recv_ack();       /*发送数据*/
     s++;
   } 
   *s=i2c_recv_nack();
   i2c_stop();                /*结束总线*/ 
   return(1);
}


/*******************************************************************
* Not used
                    向无子地址器件读取多字节数据函数               
函数原型: bit  ISendStrExt(uchar sla,uchar *s,uchar no);  
功能:     从启动总线到发送地址,读数据,结束总线的全过程.
          从器件地址sla,读出的内容放入s指向的存储区,
          读no个字节。如果返回1表示操作成功,否则操作有误。
注意:    使用前必须已结束总线。
********************************************************************/
uchar IRcvStrExt(uchar sla,uchar *s,uchar no)
{
   uchar i;

   i2c_start();              //启动总线
   i2c_send(sla+1);            //发送器件地址

   for(i=0;i<no-1;i++)
   {   
     *s=i2c_recv_ack();       /*发送数据*/
     s++;
   } 
   *s=i2c_recv_nack();
   i2c_stop();                /*结束总线*/ 
   return(1);
}
/*******************************************************************************
* 名    称: uartSC16IS752A_copy
* 功    能: 复制当前帧, 返回当前帧长度
* 入口参数: data_ptr: 目标地址
* 出口参数: 帧长度
*******************************************************************************/
uint uartSC16IS752A_copy (volatile uchar *data_ptr)
{
	uint i, leng;

	for (i=13; i>0; i--)							// 循环复制13字节
	{
		if (uartSC16IS752A_rptr==uartSC16IS752A_sptr) return (0);	// 数据覆盖, 返回0
		*data_ptr = uartSC16IS752A_rbuf[uartSC16IS752A_rptr];		// 复制1字节
		if (++uartSC16IS752A_rptr==uartSC16IS752A_rbuf_size) uartSC16IS752A_rptr = 0;	// 循环缓冲区写指针加1
		data_ptr++;									// 目标指正加1
	}

	i = *(data_ptr-2) << 8;							// 数据长度高8位
	i = i + *(data_ptr-1) + 1;						// 数据长度 + 校验和
	leng = i + 13;									// 数据长度 + 校验和
	for ( ; i>0; i--)								// 循环复制
	{
		if (uartSC16IS752A_rptr==uartSC16IS752A_sptr) return (0);		// 数据覆盖, 返回0

		*data_ptr = uartSC16IS752A_rbuf[uartSC16IS752A_rptr];// 复制1字节
		if (++uartSC16IS752A_rptr==uartSC16IS752A_rbuf_size) uartSC16IS752A_rptr = 0;	// 循环缓冲区写指针加1
		data_ptr++;											// 目标指正加1
	}
	uartSC16IS752A_flag--;									// 接收标志减1

	return (leng);											// 返回数据长度
}
/*******************************************************************************
* 名    称: uartSC16IS752A_ack
* 功    能: 主机通讯应答
* 入口参数: 无
* 出口参数: 无
*******************************************************************************/
void uartSC16IS752A_ack (void)
{
	uint frame_leng;

	while (uartSC16IS752A_flag)										// 复制主机数据

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -