📄 can1.c
字号:
//-------------------------------------
//------can1 tx 发送--下发给模块 ------------------------------------------------------------
//-------------------------------------
void can1_tx_init(void)
{
IO_BYTE b;
DLCR1(1) = 0;
IDRX1(1) = 0X00FC0100;//单元号 是0X7F??
b=(CSR1&0XC000)>>8;
// if(b&0x40)return; //总线有数
TREQR1_TREQ1 = 1; // transmition request
// if ((TCR1_TC1!=0)&&(TREQR1_TREQ1==0))
// {
// TCR1_TC1=0;
// }
}
//------------------------------------
void can1_tx_time(void) //对时
{
;
DLCR1(1) = 8; // data length
IDRX1(1) = 0x00FC0108;//单元号是0x7f 命令码是0x20
DTR1_WORD(1,0) = sys_year | 0x7d0; //0x07D2;//年
DTR1_WORD(1,1) = time_s.w[1];//0x0174;//秒高字节
DTR1_WORD(1,2) = time_s.w[0];//0x47e8;//秒低字节
DTR1_WORD(1,3) = msecond;//0x0000;//毫秒
TREQR1_TREQ1 = 1; // transmition request
// while (TCR1_TC1==0)
// {
// if(TREQR1_TREQ1==0)
// {PDR6_P64 = ~PDR6_P64;
// break;
// }
// if(can_yktime>=5){can_yktime=0;break;}//发送yk,最长计时
// }
// TCR1_TC1=0;
}
//-------------------------------------------
void can1_tx_yk(void)
{
IO_BYTE b;
b=yk_fm_para(yk_dx*4);//单元号
//
// if((b&0x3f)<13) return; 桃红坡需封此句
//
can_mask&=0xdf;
yk_count+=1;//yk发送记数
can_yktime=0;
if(cyk_mask & 0x80)//有选控命令
{
if(cyk_mask & 0x10)//有返校
{
if(cyk_mask & 0x08)//执行
{
DLCR1(1)=2;
IDRX1(1)=b&0x3f;
IDRX1(1) =(IDRX1(1)<<18)|0x00008002;//命令码是05
if(yk_xz==0x33)//分
DTR1_WORD(1,0)=0X0100 + (yk_fm_para(yk_dx*4+1)<<9);
else
if(yk_xz==0xcc)//合
DTR1_WORD(1,0)=0X0200 + (yk_fm_para(yk_dx*4+1)<<9);
}
else
{
if(cyk_mask & 0x01)//撤控
{
DLCR1(1)=2;
IDRX1(1)=b&0x3f;
IDRX1(1) = (IDRX1(1)<<18)|0x00000003;//命令码是06
if(yk_xz==0x33)//分
DTR1_WORD(1,0)=0X0100 + (yk_fm_para(yk_dx*4+1)<<9);
else
if(yk_xz==0xcc)//合
DTR1_WORD(1,0)=0X0200 + (yk_fm_para(yk_dx*4+1)<<9);
}
else return;//返回
}
}
else//选控
{
DLCR1(1)=2;
IDRX1(1)=b&0x3f;
IDRX1(1) = (IDRX1(1)<<18)|0x00000002;//命令码是04
if(yk_xz==0x33)//分
DTR1_WORD(1,0)=0X0100 + (yk_fm_para(yk_dx*4+1)<<9);
else
if(yk_xz==0xcc)//合
DTR1_WORD(1,0)=0X0200 + (yk_fm_para(yk_dx*4+1)<<9);
}
TREQR1_TREQ1 = 1; // transmition request
// while (TCR1_TC1==0)
// {
// if(TREQR1_TREQ1==0)
// {PDR6_P64 = ~PDR6_P64;
// break;
// }
// if(can_yktime>=5){can_yktime=0;break;}//发送yk,最长计时
// };
// TCR1_TC1=0;
}
}
//------------------------------------------------------------
void can1_cl(void)
{//报文 先长度, 后标识符 先发送,后接收
IO_BYTE t1,t2;
IO_WORD test_year;
//can1_txcl
if((sys_minute%2==0)&&(sys_second%37==0)){ can1_tx_time();return;}
if(can_mask&0x20) can1_tx_yk();
//^o^
if(cdt_dzh&0x01)
{//dz_cl(dzh_len+1,&dzh_2l_1(6),&dzh_1l(0));
can1_tx_sdz();//传定值
}
if(cdt_dzh&0x02) can1_tx_wdz();//写定值
if(cdt_dzh&0x04) can1_tx_rdz();//读定值
//
test_year= sys_year | 0x7d0;
//
if((test_year%4==0 && test_year%100 !=0 ) || test_year%400 == 0)
{
time_s.dw=SecondInMonth[0][sys_month-1]+
(sys_day-1) * 86400 + SecondInHour[sys_hour] + sys_minute * 60 + sys_second;
}
else
{
time_s.dw=SecondInMonth[1][sys_month-1]+
(sys_day-1) * 86400 + SecondInHour[sys_hour] + sys_minute * 60 + sys_second;
}
//can1_rxcl
if(can1_buf_rxaddr == can1_buf_rxpaddr)
{
if(CSR1_HALT==1)
{
__DI();
InitCan1_ml();
__EI();
}
return;
}
can1_len=can1_rx_buf(can1_buf_rxpaddr+0);//长度
fun_code=(can1_rx_buf(can1_buf_rxpaddr+1) & 0x7f)<<1;//
t1=can1_rx_buf(can1_buf_rxpaddr+2);
if(t1 & 0x80)
fun_code|=0x01;
else
fun_code&=0xfe;//完成命令码的取存
t2=can1_rx_buf(can1_buf_rxpaddr+3);
if(t2 & 0x02)
frame_flag=1;//后续侦标志
else
frame_flag=0;
ml_unit=(can1_rx_buf(can1_buf_rxpaddr+3)>>2) & 0x3f;
if(t1 & 0x01)
ml_unit|=0x40;
else
ml_unit&=0x3f;//完成单元号的取存
frame_no=(can1_rx_buf(can1_buf_rxpaddr+4)>>3) & 0x1f;
if(t2 & 0x01)
frame_no|=0x20;
else
frame_no&=0x1f;//完成侦号的取存
switch(fun_code)
{
case 0x22 : can1_soe();break;//soe
case 0x24 : can1_ykxk();break;//选控返校
case 0x25 : can1_ykzx();break;//执行返校
case 0x26 : can1_ykck();break;//撤控返校
case 0x3a : can1_bhyc();break;//变化yc
case 0x3c : can1_yx();break;//yx
case 0x3d : can1_yc();break;//yc
case 0x3e : can1_dd();break;//电能
case 0x20 : can1_tx_time();break;//发对时
case 0x27 : can1_sdz();
if(frame_flag==0)
{dz_cl(dzh_len,&dzh_1l(0),&dzh_2l_1(6));
cdt_dzh|=0x88;
}
break;//定值 ^o^
case 0x28 : cdt_dzh|=0x90;break;
case 0x29 : can1_rdz();
if(frame_flag==0)
{dz_cl(dzh_len,&dzh_1l(0),&dzh_2l_1(6));
cdt_dzh|=0xa0;
}
break;
}
can1_buf_rxpaddr+=13;
if(can1_buf_rxpaddr>=1300)
can1_buf_rxpaddr=0;
///------tx-----------
}
////////////////// 定值
//-------------------------------------------
//
void can1_tx_sdz(void)//主板应用 传定值发送
{
IO_LWORD w1;
// IO_BYTE frame_num,frame_count;
// IO_BYTE dz_n_bak;
if((cantx_tout>100)||(TCR1_TC1==1))
{
TCR1_TC1=0;
if(frame_num==0)
{
dz_cl(dzh_len+1,&dzh_2l_1(6),&dzh_1l(0));
frame_num=(dzh_len+7)/8;//yc_num未定义
frame_count=0;
dz_n_bak=dzh_len+1;
w1=frame_count;
IDRX1(1)=dz_id;//单元号
if(dz_n_bak>8)
{
dz_n_bak-=8;
DLCR1(1)=8;
//IDRX1(1)=dzh_1l(0);//单元号
//有后续
IDRX1(1)=(IDRX1(1)<<18) | 0X00028003 | (w1<<27);
//单元号 或 命令码 或 帧号
}
else
{//无后续
DLCR1(1)=dz_n_bak;
IDRX1(1)=(IDRX1(1)<<18) | 0X00008003 | (w1<<27);
//单元号 或 命令码 或 帧号
}
DTR1_WORD(1,0)=dzh_1lx(frame_count*4+0);
DTR1_WORD(1,1)=dzh_1lx(frame_count*4+1);
DTR1_WORD(1,2)=dzh_1lx(frame_count*4+2);
DTR1_WORD(1,3)=dzh_1lx(frame_count*4+3);
TREQR1_TREQ1=1;
cantx_tout=0;
WDTC_WTE=0;
while ( TREQR1_TREQ1 /* ^o^ 新加入的 <<< wait until trx is completed */
&& ! CSR1_HALT /* ^o^ or busoff */
&& (cantx_tout < TIMEOUT) ); /* ^o^ or timeout */
// if (cantx_tout == TIMEOUT) /* ^o^ if timeout... */
// TCANR1_TCAN1 = 1 ;
__wait_nop();
__wait_nop();
frame_num--;
frame_count++;
}
else
{
w1=frame_count;
IDRX1(1)=dz_id;//单元号
if(dz_n_bak>8)
{
dz_n_bak-=8;
DLCR1(1)=8;
//IDRX1(1)=dzh_1l(0);//单元号
//有后续
IDRX1(1)=(IDRX1(1)<<18) | 0X00028003 | (w1<<27);
//单元号 或 命令码 或 帧号
}
else
{//无后续
DLCR1(1)=dz_n_bak;
IDRX1(1)=(IDRX1(1)<<18) | 0X00008003 | (w1<<27);
//单元号 或 命令码 或 帧号
}
DTR1_WORD(1,0)=dzh_1lx(frame_count*4+0);
DTR1_WORD(1,1)=dzh_1lx(frame_count*4+1);
DTR1_WORD(1,2)=dzh_1lx(frame_count*4+2);
DTR1_WORD(1,3)=dzh_1lx(frame_count*4+3);
TREQR1_TREQ1=1;
cantx_tout=0;
WDTC_WTE=0;
while ( TREQR1_TREQ1 /* ^o^ 新加入的 <<< wait until trx is completed */
&& ! CSR1_HALT /* ^o^ or busoff */
&& (cantx_tout < TIMEOUT) ); /* ^o^ or timeout */
// if (cantx_tout == TIMEOUT) /* ^o^ if timeout... */
// TCANR1_TCAN1 = 1 ;
__wait_nop();
__wait_nop();
frame_num--;
frame_count++;
if(frame_num==0) cdt_dzh&=0xfe;
}
}
}
//注意:ID地址,定值组号,定值长度,定值的两个区
//定值类型,CRC校验
//
//-------------------------------------------------------
void dz_cl(IO_BYTE len,IO_BYTE *s,IO_BYTE *d )//定值的处理,低高字节的倒数
{/* len 是定值的长度; *s 是定值源区; *d 是定值目标区 */
IO_BYTE i;
IO_BYTE v=1,w;
w=2*(2*v-1);
for(i=0;i<len;i++)
{
*(d+w-1-i)=*(s+i);
if((i+1)%2==0)
{
v=v+1;
w=2*(2*v-1);
}
}
}
// dz_cl(dz_len,&dz_1l(0),&dz_2l(0)); 例子
void can1_tx_wdz(void)//写定值
{
//IO_BYTE b1;
cdt_dzh&=0xfd;
IDRX1(1)=dz_id & 0x3f;// 单元号
DLCR1(1) = 2; // data length
IDRX1(1) = (IDRX1(1)<<18) | 0x00000004;//命令码是0x04
DTR1_WORD(1,0) = 0x0000; //
TREQR1_TREQ1 = 1;
}
//--------------------------------------------------------
void can1_tx_rdz(void)//读定值
{
cdt_dzh&=0xfb;
IDRX1(1)=dz_id & 0x3f;// 单元号
DLCR1(1) = 2; // data length
IDRX1(1) = (IDRX1(1)<<18) | 0x00008004;//命令码是0x04
DTR1_WORD(1,0) = 0x0000; //
TREQR1_TREQ1 = 1;
}
//-----------------------------------------------------------
void can1_rdz(void)//读定值 回送
{
IO_BYTE i;
IO_WORD a;//偏移量为字型
a=frame_no*8;
if(frame_no==0) dzh_len=0;
dzh_len+=can1_len;
for(i=0;i<can1_len;i++)//判断长度 是否改为:i+=2???
{
dzh_1l(a+i)=can1_rx_buf(can1_buf_rxpaddr+5+i);
}
}
//------------------------------------------
//-----------------------------------------------------------
void can1_sdz(void)//读定值 回送
{
IO_BYTE i;
IO_WORD a;//偏移量为字型
a=frame_no*8;
if(frame_no==0) dzh_len=0;
dzh_len+=can1_len;
for(i=0;i<can1_len;i++)//判断长度 是否改为:i+=2???
{
dzh_1l(a+i)=can1_rx_buf(can1_buf_rxpaddr+5+i);
}
}
//---------------------------------------------
__interrupt void can1_rx (void)
{
IO_BYTE a;
a=ROVRR1_ROVR0;
ROVRR1_ROVR0=0;
if(a==0)
{
Data1=IDRX1(0);//29ID 标识符
Len1 = DLCR1(0)&0x0f;//帧长度
can1_rx_buf(can1_buf_rxaddr+0)= Len1 ;
can1_rx_buf(can1_buf_rxaddr+1)=Data1&0xff;
can1_rx_buf(can1_buf_rxaddr+2)=(Data1>>8)&0xff;
can1_rx_buf(can1_buf_rxaddr+3)=(Data1>>16)&0xff;
can1_rx_buf(can1_buf_rxaddr+4)=(Data1>>24)&0xff;
for (pos1=0; pos1<(Len1);pos1++)
{
can1_rx_buf(can1_buf_rxaddr+5+pos1) =DTR1_BYTE(0,pos1);
}
can1_buf_rxaddr+=13;
if(can1_buf_rxaddr>=1300)
{
can1_buf_rxaddr=0;
}
}
RCR1_RC0=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -