|
小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 中斷; 開放中斷
|
|