|
小ARM菜菜
日照高科园
今天下午半下午时间用来调试程序,上午时间把电路环景搭建起来,到现在完成电力载波的初步半双工通信!主要注意的是第一次收到的数据要丢弃,等待寄存器更新,并且要利用软件控制字节流,而不可以用硬件,因为你根本不知道他有多少字节,也就谈不上控制了,也就是说他仅仅模拟了一个收发器,你要在软件层面构建FIFO,另一点注意的是寄存器的配置和写保护!我就是吃了这个亏啊!
主要程序片段!》》》》》》》》》》》》》》》》》》
extern void SendOneByte(unsigned char c);
uchar data i;
uchar data state; // 载波通讯状态
uchar data SSC_adr_bak;
SSC_adr_bak=SSC_ADR; //PRTECT
SSC_ADR=0x00; //选择载波状态寄存器
state= SSC_DAT;
if ( ( state&0x01 ) == 1 ) //载波发送状态
{ // 载波发送
if ( PLC_send_pointer !=PLC_total_len )
{
SSC_BUF=PLC_T_buf_bak[PLC_send_pointer]; //发送下一个字节
PLC_send_pointer++;
}
else
{ //发送完成
PLC_sending=0; // 清正在发送标志
PLC_data=0;
PLC_TLED=1; // 发送指示灯灭
}
}
else
/******接收区**************************/
{
// printf_usart("接收");
// SSC_ADR=0x00; //选择载波状态寄存器
//SendOneByte(SSC_DAT) ;
// 载波接收
PLC_Rxd_timer=20; // 最大字节接收延时时间为1S
if ( ( state&0x04 ) == 0x04 ) //如果接收的是祯头标志
{
//帧头
if ( PLC_Rxd_state == 0 ) //如果处于等待接收状态
{
//接收第一个字节,并准备接收后面的字节
PLC_recv_buf[0]=SSC_BUF;
PLC_Rxd_pointer=0; //lxw2006-3-2 17:07
PLC_Rxd_state=1;
PLC_RLED=0; //接收指示灯亮
PLC_Rxd_tlen=3;
}
else // translate to rec
{
PLC_Rxd_state=0;
SSC_ADR=0X0;
SSC_DAT=0X0;
}
}
//数据流
else
{
if ( PLC_Rxd_state == 1 ) // 如果已经接收了祯头,继续接收后续字节
{
PLC_recv_buf[PLC_Rxd_pointer]=SSC_BUF;
PLC_Rxd_pointer++;
if ( PLC_Rxd_pointer==PLC_Rxd_tlen )
{
PLC_Rxd_OK=1;
PLC_RLED=1; //接收完毕灯灭
PLC_Rxd_state=0;
SSC_ADR=0;
SSC_DAT=0;
}
}
else
{
PLC_Rxd_state=0;
SSC_ADR=0X0;
SSC_DAT=0X0;
}
}
}
SSC_ADR=SSC_adr_bak;
SSC_ADR=0XFF; //
SSC_DAT=0XFF; // 禁止写保护
SSC_ADR=0x01; // 选择3105载波通讯控制寄存器1
SSC_DAT=64; // ZZZ 2007-10-15 前导1bit为64个
SSC_ADR=0x03; // 选择3201载波通讯控制寄存器3
SSC_DAT=0xe0; // 开启载波通讯功能,打开中断,选择接收状态置为3105模式
SSC_ADR=0x04; // 设置捕获门限
SSC_DAT=LIMIT_3105;
SSC_ADR=0XFF;
SSC_DAT=0XAA; // 使能写保护
// 控制看门狗喂狗时间长度
CKCON=0X3F;
// 8位/16位运算模式选择位设置
ALU_MOD=0; // 设置成8位运算模式
//载波通讯配置
//************ 3201的载波寄存器设置 **********//
set_PLC_3105 ( ); //上电为3105模式
SSC_ADR=0xFF;
SSC_DAT=0xFF;
SSC_ADR=0x02;
SSC_DAT=0x1F;
SSC_ADR=0xFF;
SSC_DAT=0x00;
//************ 3201的载波寄存器设置 **********//
EIE=0X01; // ( A9H 使能INT2中断(EX2=1)
IT2=1; // ( C8H ) 为边沿触发方式(IT2=1)
//串口通讯配置
TMOD1 = 0x10 ; // 设 T/C1 为1分频模式,ZZZ
TMOD = 0x21 ; // 设 T/C1 为定时方式2 设置为8位自装载计数器 T/C0 为定时方式 14
SCON=0x50; // 工作方式1
PCON=0X80; // 波特率加倍
TH1=BPS2400;
TL1=BPS2400; // 加倍设定波特率 9.6MHz ( 按1分频2400计算)
TR1=1; // 启动定时器1
// 定时器0中断配置
TH0=0x63;
TL0=0xcc; // 定时 50 ms 一个定时中断
TR0 = 1; // 启动 T0 定时器
// 中断级别设置
IP=0x02; // 定时器 T0 中断为高级中断
EIP=1; // 外部中断2 为高级中断
// 中断允许设置
IE=0x82; // 允许ET0=1定时器 T0 中断; 开放中断
|
|