📄 zhubo.c.bak
字号:
uchar wcount;
union buf_union comm;
wcount = 0;
comm.buf1 = addr;
iic_write_re:
if( wcount > 4 )
{
iic_stop();
_nop();
wcount = 0;
err_eeprom = 1;
return 0;
}
_nop();
iic_star();
iic_send((comm.buf2[1]<<1) | 0xa0);
ubuf = iic_ack();
if(ubuf)
{
wcount++;
_nop();
goto iic_write_re;
}
iic_send(comm.buf2[0]);
ubuf = iic_ack();
if(ubuf)
{
wcount++;
_nop();
goto iic_write_re;
}
iic_send(buf);
ubuf = iic_ack();
if(ubuf)
{
wcount++;
_nop();
goto iic_write_re;
}
iic_stop();
return 1;
}
/**********************************************************
** 功能说明: 延时函数
** 输入参数:
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 汤勇 创建时间:2004-11-16
***********************************************************/
void iic_delay()
{
uchar a;
for(a = 0; a < IIC_DELAY ; a++ )
{
asm("NOP");
}
}
/**********************************************************
** 功能说明: 操作eeprom时发起始命令
** 输入参数:
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 汤勇 创建时间:2004-11-16
***********************************************************/
void iic_star()
{
TRISC0 = 0;
TRISC1 = 0;
scl(1);
sda(1);
// _nop();
sda(0);
scl(0);
_nop();
}
/**********************************************************
** 功能说明: 操作eeprom完成时发结束命令
** 输入参数:
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 汤勇 创建时间:2004-11-16
***********************************************************/
void iic_stop()
{
TRISC0 = 0;
TRISC1 = 0;
sda(0);
scl(1);
_nop();
sda(1);
_nop();
scl(1);
_nop();
}
/**********************************************************
** 功能说明: 发数据给eeprom
** 输入参数: buf 类型:uchar :需要发送的数据
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 汤勇 创建时间:2004-11-16
***********************************************************/
void iic_send(uchar buf)
{
uchar i;
TRISC0 = 0;
TRISC1 = 0;
for(i = 0 ; i < 8 ;i++)
{
if( buf & 0x80 )
{
sda(1);
}
else
{
sda(0);
}
_nop();
scl(1);
//_nop();
scl(0);
//_nop();
buf = buf << 1;
}
}
/**********************************************************
** 功能说明: 从eeprom获取数据
** 输入参数:
** 输出参数: buf 类型:uchar :获取的数据
** 返 回 值: 无
** 引用函数:
** 创 建 人: 汤勇 创建时间:2004-11-16
***********************************************************/
uchar iic_get()
{
uchar i,buf;
buf = 0x00;
TRISC0 = 0;
TRISC1 = 1;
for(i = 0 ; i < 8 ;i++)
{
scl(1);
_nop();
buf = buf <<1;
if(PORTC & 0x02)
{
buf = buf|0x01;
}
scl(0);
_nop();
}
return buf;
}
/**********************************************************
** 功能说明: eeprom回应命令体
** 输入参数: buf 类型:uchar :0响应/1无响应
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 汤勇 创建时间:2004-11-16
***********************************************************/
uchar iic_ack()
{
uchar buf;
TRISC1 = 1;
TRISC0 = 0;
sda(1);
_nop();
scl(1);
if(PORTC & 0x02)
buf = 1;
else
buf = 0;
scl(0);
_nop();
TRISC1 = 0;
_nop();
return buf;
}
/**********************************************************
** 功能说明: 收到数据发出响应
** 输入参数:
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 汤勇 创建时间:2004-11-16
***********************************************************/
void ack_iic(uchar buf)
{
if(buf == 0)
{
sda(0);
}
else
{
sda(1);
}
_nop();
scl(1);
_nop();
scl(0);
_nop();
}
/**********************************************************
** 功能说明: 485串口数据处理
** 输入参数: 无
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 陈璐 创建时间:2006/01/04
*********************************************************/
void serial_data()
{
auto uchar start,length,buf,buf1;
// uchar mokuaiadd;
uchar bufver;//接收到的版本号
if(receive_over == 1)//如果接收完毕(包头,包尾都收到)
{
length = receive_cnt - 2;
//if(Prmter1.TYPE != receive_buf[1]) //判断协议类型
// if(TYPE != receive_buf[1]) //判断协议类型
// {
// send_reply_flag(0x10,0x00);//协议类型错误
// goto go_return;
// }
if((Prmter1.ADDR != receive_buf[4]) && (receive_buf[4] != 0xff))//模块地址错(0xff为广播群发)0X00为没有设置地址
{
goto go_return; //模块地址不符合,没返回
}
dog();
bufver=receive_buf[2] & 0x0f;//取缓冲数组的第二个字节的低4位字节,高4位是信息来源
//if(Prmter1.PROTL_ETN != bufver)//协议版本号判断
if(bufver!= PROTL)//协议版本号判断
{
send_reply_flag(0x02,0x00);//0X02表示版本错误
goto go_return;
}
if(receive_buf[7] > 69) //命令体长度不能大于69
{
send_reply_flag(0x05,0x00);
goto go_return;
}
if(receive_buf[6]!= 0xff) //命令头应答标志错
{
send_reply_flag(0x06,0x00);
goto go_return;
}
length = receive_buf[7] + 7; //长度=命令体长度+……(不包括起始、结束、ASCII校验这4个字节)
start = 1;
CheckCRC(receive_buf,length,start,pChecksum);
buf1 = length + 1;
if((pChecksum[0] != receive_buf[buf1]) || (pChecksum[1] != receive_buf[buf1+1]))//CRC检验判断
{
send_reply_flag(0x03,0x00);
goto go_return;
}
if(receive_buf[5] == 0x40)//查询基本参数
{
buf = Query_Basic_Parameter();//模块基本信息参数查询
send_reply_flag(0x00,buf);//发送成功标志
goto go_return;
}
if(receive_buf[5] == 0x60)//设置基本信息项
{
buf = Set_Basic_Parameter();//模块基本信息参数设置
if(erro&0x02)//设置出错
{
receive_buf[6] = 0x07;
erro = erro & 0xfd;
}
else
{
receive_buf[6] = 0x00;
}
send_reply_flag(receive_buf[6],buf);
goto go_return;
}
if(receive_buf[5] == 0xc1)//设置参数
{
buf = Set_Parameter();//设置参数
if(erro&0x02)//设置出错
{
receive_buf[6] = 0x07;
erro = erro & 0xfd;
}
else
{
receive_buf[6] = 0x00;
}
send_reply_flag(receive_buf[6],buf);
goto go_return;
}
else if(receive_buf[5] == 0xc2)//查询参数
{
buf = Query_Parameter();
if(erro&0x01)//查询出错
{
receive_buf[6] = 0x08;
erro = erro & 0xfe;
}
else
{
receive_buf[6] = 0x00;
}
send_reply_flag(receive_buf[6],buf);
goto go_return;
}
else if(receive_buf[5] == 0x50)//查询模块参数地址
{
buf = Query_Address();
send_reply_flag(0x00,buf);
goto go_return;
}
else
{
send_reply_flag(0x09,0x00); //命令编号错
goto go_return;
}
}
else if(receive_over == 0 && receive_time_on == 1)
{
if(receive_time_count >= 200)
{
headend_flag=0x00;
tran_flag=0x00;
receive_time_on = 0;
receive_time_count = 0;
receive_free();
receive_cnt = 0x00;
CREN = 1;
RCIE = 1;
return;
}
else
{
receive_time_count++;
return;
}
}
// T1CON=0x31;
return;
go_return:
headend_flag=0x00;
tran_flag=0x00;
receive_free();
receive_over = 0;
receive_cnt = 0;
CREN = 1;
RCIE = 1;
// T1CON=0x31;
return;
}
/**********************************************************
** 功能说明: 基本数据查询函数
** 输入参数: 无
** 输出参数:
** 返 回 值: 参数个数
** 引用函数:
** 创 建 人: 陈璐 创建时间:2005/12/12
*********************************************************/
uchar Query_Basic_Parameter()
{
uchar buf;
uchar i ;
uint j ;
j = 0x0700;
buf=receive_buf[8];//BUF为上位机下传的第几包数据;命令体的第1个字节为我应传给上位机第几包数据
receive_buf[8]=2;//PIC需上传总包数为2包;所以命令体的第1个字节变成了总包数.
if(buf==1)
{
receive_buf[9]=1;//表示PIC发送第1包数据
for(i=0; i<32; i++)
{
receive_buf[i+10] = basic_table[i];
}
return 34;
}
else if(buf==2)//
{
receive_buf[9]=2;//表示PIC发送第2包数据
for(i=0; i<37; i++)
{
receive_buf[i+10] = rrom(j + i);
}
return 39;
}
else
{
return 0;
}
}
/**********************************************************
** 功能说明: 基本信息参数设置函数
** 输入参数: 无
** 输出参数:
** 返 回 值: 参数个数
** 引用函数:
** 创 建 人: 陈璐 创建时间:2006/01/11
*********************************************************/
uchar Set_Basic_Parameter()
{
auto union buf_union comm;
uint i;
uchar length;
uchar buf;
uchar *P = 0;
length = receive_buf[7];
P = receive_buf+8;
erro = 0;
while(length)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -