?? receivetest__.c
字號:
RS485_Answer=1;
}
else
{
RS485_Answer_Set();
RS485_Answer_Subprogram(); // 調用發(fā)送點對點回復包子程序
led2=!led2;
Check_Receive_Data_Flag=1;
}
}
else if( (Address_Flag==RS485_Address_Broad)||( Address_Flag==( RS485_Address_Self & 0xF0)))
{
// 廣播類型數(shù)據(jù)包回復標志
RS485_Answer_Set();
// 發(fā)送回復包標志清0
RS485_Answer_Broad_Subprogram(); // 調用發(fā)送點對廣播回復包子程序
//RS485_Answer_Subprogram();
led2=!led2;
Check_Receive_Data_Flag=1;
}
}
}
}
//----------------------------------------------------------------------------------------------
//
//串行接收處理函數(shù)
void RS485_Receive_Process(INT8U RecData)
{
Receive_Status=GetCurrentRS485RxStatus();
switch(Receive_Status)
{
case RS485_Receive_IDLE:
if(RecData==Data_Head) // 在空閑狀態(tài)下接收到數(shù)據(jù),判斷是否數(shù)據(jù)包起始字節(jié)
{
SetCurrentRS485RxStatus(RS485_Receive_RECEIVE); // RS485總線狀態(tài)改為接收狀態(tài)
Receive_Count=0; // 接收計數(shù)器清0
// Receive_CheckHead=0; // 準備進行對接收到的數(shù)據(jù)頭進行和校驗,簡單累加和
// Receive_CheckData=0; // 準備進行對接收到的數(shù)據(jù)進行和校驗,簡單累加和
RS485_Bus_Status = RS485_Bus_BUSY; // 接收到0x7E時總線狀態(tài)為忙,不能發(fā)送數(shù)據(jù)
}
break;
case RS485_Receive_RECEIVE:
if(RecData==Data_Change)
{
SetCurrentRS485RxStatus(RS485_Receive_CHANGE); // RS485總線狀態(tài)改為轉移狀態(tài)
break;
}
if(RecData==Data_Head)
{
if(Receive_Count>0) // 當接收到0x7E且接收計數(shù)器大于0,接收結束
{
RS485_Data_Handle(); // 調用數(shù)據(jù)處理程序
SetCurrentRS485RxStatus(RS485_Receive_IDLE); // 將485接收狀態(tài)改為空閑狀態(tài)
RS485_Bus_Status=RS485_Bus_IDLE;
//RS485_Receive_Save_Data();
RS485_Receive_End=1;
// RS485_Receive_Save_Data();
Receive_Count=0; // 接收完畢,將接收數(shù)據(jù)計數(shù)器清0
}
// else
// {
// SetCurrentRS485RxStatus(RS485_Receive_IDLE); // 將485接收狀態(tài)改為空閑狀態(tài)
// RS485_Bus_Status=RS485_Bus_IDLE; // 接收完畢(無論正確與否,無論數(shù)據(jù)還是回復包)485總線狀態(tài)設置為空閑狀態(tài),
// }
break;
}
RS485_Receive_Buff[Receive_Count]= RecData;
// if(Receive_Count<7)
// {
// Receive_CheckHead += RS485_Receive_Buff[Receive_Count]; // 更新累加數(shù)據(jù)頭和校驗信息
// }
//
// else if(Receive_Count>7)
// {
// Receive_CheckData += RS485_Receive_Buff[Receive_Count]; // 更新累加數(shù)據(jù)和校驗信息
// }
Receive_Count++; // 接收計數(shù)器加1
break;
case RS485_Receive_CHANGE:
RS485_Receive_Buff[Receive_Count]= RecData^0x20;
// if(Receive_Count<7)
// {
// Receive_CheckHead += RS485_Receive_Buff[Receive_Count]; // 更新累加數(shù)據(jù)頭和校驗信息
// }
// else if(Receive_Count>7)
// {
// Receive_CheckData += RS485_Receive_Buff[Receive_Count]; // 更新累加數(shù)據(jù)和校驗信息
// }
SetCurrentRS485RxStatus(RS485_Receive_RECEIVE); // 轉換之后將485改為接收狀態(tài),接收下一字節(jié)數(shù)據(jù)
Receive_Count++; // 接收計數(shù)器加1
break;
default:
break;
}
}
//----------------------------------------------------------------------------------------------
//
//接收中斷程序
interrupt [USART_RXC] void usart_rx_isr(void)
{
// INT8U Receive_Data;
led=!led;
Receive_Data=UDR;
RS485_Receive_Process(Receive_Data);
}
//----------------------------------------------------------------------------------------------
//
// 定時器0中斷程序
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
switch(Delay_Status)
{
case Start_Send:
{
Delay_Status=Other_Delay; // 中斷延時結束,返回其他狀態(tài)
RS485_Start_Send();
}
break;
case Repeat_Send_Delay: // 重發(fā)延時10ms,1ms中斷一次
if(Repeat_Send_Time>0) // 延時尚未結束
{
if(RS485_Bus_Status == RS485_Bus_BUSY) // 檢測到總線為不空閑,
{
if(Add_Time_Flag==1) // 首次不空閑時將加3ms延時
{
Repeat_Send_Time=Repeat_Send_Time+3;
Add_Time_Flag=0;
}
break;
}
else // 總線狀態(tài)為空閑時,將延時計數(shù)器減1
{
Repeat_Send_Time=Repeat_Send_Time-1;
Add_Time_Flag=1;
}
break;
}
else // 延時結束,
{
if(RS485_Bus_Status == RS485_Bus_BUSY) // 延時結束,發(fā)送前檢測到總線不為空閑,重新執(zhí)行延時程序
{
Repeat_Delay_Program(); // 調用重發(fā)延時函數(shù),繼續(xù)執(zhí)行重發(fā)延時
break;
}
else // 總線為空閑,即開始發(fā)送數(shù)據(jù)
{
ReSendCount++; // 重發(fā)計數(shù)器加1
Delay_Status=Start_Send;
}
}
break;
case Long_Wait_Delay: // 重發(fā)之間的超時等待延時350ms,50ms中斷一次
if(Long_Wait_Time>0)
{
Long_Wait_Time=Long_Wait_Time-1;
break;
}
else
{
Delay_Status=Repeat_Send_Delay;
}
break;
case Send_Broad_Delay: // 對廣播包競爭回復延時,1ms中斷一次
if(Com_Revert_Time>0) // 延時未結束
{
if(RS485_Bus_Status == RS485_Bus_BUSY) // 檢測到總線為不空閑,
{
if(Add_Time_Flag==1) // 首次不空閑時將加3ms延時
{
Com_Revert_Time=Com_Revert_Time+3;
Add_Time_Flag=0;
}
break;
}
else // 檢測到總線為空閑
{
Add_Time_Flag=1;
if(RS485_Answer==0) // 還沒有收到回復包,計數(shù)器將減1
{
Com_Revert_Time=Com_Revert_Time-1;
break;
}
else // 已經(jīng)收到回復包,放棄對廣播包的回復
{
Delay_Status=Other_Delay; // 中斷延時結束,返回其他狀態(tài)
break;
}
}
}
else // 表示競爭回復延時結束
{
if(RS485_Bus_Status == RS485_Bus_BUSY) // 延時結束,發(fā)送前檢測到總線不為空閑,重新執(zhí)行延時程序
{
Com_Revert_Time=Delay_Time_Count[ RS485_Answer_Send_Buff[0]]; // 競爭回復延時間計數(shù)長度
}
else // 總線為空閑,即開始發(fā)送數(shù)據(jù)
{
Delay_Status=Start_Send; // 中斷延時結束,返回其他狀態(tài)
led3=0;
}
}
break;
case Check_Delay: // 檢測是否接收到回復包延時200ms,50ms中斷一次
if(Check_Time>0) // 200ms延時未結束,繼續(xù)延時
{
Check_Time=Check_Time-1;
break;
}
else // 200ms延時結束
{
Send_Data_Flag=0;
Delay_Status=Other_Delay; // 中斷延時結束,返回其他狀態(tài)
if(RS485_Answer==0) // 定時中斷50ms后如果沒有回復包標志,將重發(fā)數(shù)據(jù)
{
if(ReSendCount<2) // 重發(fā)數(shù)據(jù)小于2次時;
{
RS485_Send_Flag=1; // 啟動發(fā)送標志位
ReSendFlag=1; // 啟動重發(fā)標志
break;
}
else // 重發(fā)超過兩次;
{
ReSendCount=0; // 重發(fā)次數(shù)計數(shù)器清0
}
}
else
{
// RS485_Answer=0; // 接收到回復包,將重發(fā)計數(shù)器清0
ReSendCount=0; // 重發(fā)次數(shù)計數(shù)器清0
}
}
break;
default :
// TCCR0=0x00; // 關閉定時中斷
break;
}
}
//----------------------------------------------------------------------------------------------
//
// 2 Wire bus interrupt service routine
interrupt [TWI] void twi_isr(void)
{
// Place your code here
INT8U IICStatus;
IICStatus = TWSR;
IICStatus &= 0xF8;
switch(IICStatus)
{
//從機接收
case 0x60: // 接收到自身SLA+W,返回ACK,并清除INT位
case 0x68: //自己作為主機的時候仲裁失敗,并收到自身的SLA+W,返回ACK了。這種情況不會出現(xiàn)
IICSendCount=0;
IICChecksum=0;
TWCR |= 0xC0;
break;
//從機發(fā)送
case 0xA8:
case 0xB0:
case 0xB8:
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -