📄 sc16is752.c
字号:
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 + -