📄 receivetest.c~
字号:
if(UpdateFlag!=0)
{
UpdateFlag=0;
TWDR = IICSendBuff[IICSendCount];
if(7==IICSendCount) //判断发送是否完成
{
UpdateFlag = 0; //发送完成后标志置0
}
else
{
IICSendCount++;
}
}
else
{
TWDR = 0;
}
TWCR |= 0xC0;
break;
//已经发送了数据应答ACK
case 0x80: // 接收到主机发下来的数据,将数据保存到接收缓冲区中。如果一个数据包接收完毕,并且校验正确,则通过串行口发送出去
IICReceiveBuff[IICReceiveCount] = TWDR; // 接收数据
if(IICReceiveCount==8)
{
if(IICChecksum==0)
{
IICReceiveCount=0;
IIC_Receive_Handle(); // 将IIC接收到的数据放到485发送缓冲区
}
}
else
{
IICChecksum += IICReceiveBuff[IICReceiveCount];
IICReceiveCount++;
}
TWCR|=0XC0;
break;
//case 0x88: // 接收到数据,并返回NAK了。下一步是切换到未寻址从机模式,可以识别自己的SLA
//case 0xA0: // 已发送数据,并接收到非ACK
// case 0xC0: // 总线结束,或总线重新启动
default: // 其它状态
TWCR |= 0xC0;
break;
}
}
//----------------------------------------------------------------------------------------------
//
// UART初始化
void RS485_UARTInit(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x01;
// Port C initialization
// Func6=In Func5=In Func4=In Func3=out Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=0 State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0xE4;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 3.906 kHz
TCCR0=0xFC;
TCNT0=0x05;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 9600
UCSRA=0x00;
UCSRB=0xd8;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x19;
//ReceiveFrameStatus = NOFRAME;
//AlarmStatus = 0x00;
//ResetSendBuff();
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// 2 Wire Bus initialization
// Generate Acknowledge Pulse: On
// 2 Wire Bus Slave Address: 60h
// General Call Recognition: Off
// Bit Rate: 100.000 kHz
TWBR=0x0C;
TWAR=0xC0;
TWCR=0x45;
// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/2048k
// WDTCR=0x1F;
// WDTCR=0x0F;
//
// Global enable interrupts
#asm("sei")
DRE=0; // 485总线初始化时处于接收状态
ReSendCount=0; // 重发计数器置0
Tx_Count=0; // 待发送数据的转换计算器置0
Tx_Send_End=0; // 发送结束标志置0
RS485_Send_Flag=0; // 发送标志位置0
ReSendFlag=0; // 重发标志位置0
Send_Answer_Flag=0; // 发送点对点回复包标志
Send_Broad_Flag=0; // 发送点对类,广播回复包标志
Answer_Data_Count=0; // 保存接收到的回复包数据计数器
RS485_Answer=0; // 回复包标志位置0,表示没有收到回复包
Send_Status=0; // 初始化发送数据状态
Add_Time_Flag=1; // 延时检测到总线不空闲加3ms延时
IICReceiveCount=0; // IIC接收计数器清0
UpdateFlag=0; // IIC数据更新标志
Start_Delay=0; // 启动检测回复包标志清0,表示不启动
SetCurrentRS485RxStatus(RS485_Receive_IDLE); // 将485接收状态改为空闲状态
}
//----------------------------------------------------------------------------------------------
//
//
void Send(INT8U Send_Buff[],INT8U Length,INT8U Address)
{
if(RS485_Send_Flag==1) // 进入发送程序
{
RS485_Send_Flag=0;
if(RS485_Bus_Status==RS485_Bus_IDLE) // 发送数据前判断总线状态是否为空闲,只有在空闲状态下才能发送数据
{
Send_Data_Flag=1;
RS485_Answer=0;
//没有发送回复包标志,表示发送待发数据(包括重发数据),调用发送子程序
Send_Size=Length; // 获取发送数据的长度
P_RS485_Send_Buff=Send_Buff; // 将指针P_RS485_Send_Buff指向发送缓冲区RS485_Send_Buff首地址
*P_RS485_Send_Buff=Address;
RS485_Send_Subprogram();
}
}
else if( Send_Data_Flag==1)
{
if(Start_Delay==1)
{
Start_Delay=0; // 启动检测回复包延时中断后,将启动标志清0
Check_Time=Check_Count;
Delay_Status=Check_Delay; // 进入检测回复包延时中断
//
// // 启动定时溢出中断,等待数据发送完,并接收到回复包
// TCNT0=0x3D; // 定时50ms
// TCCR0=0x05; // 1024分频
}
else
{
// Place your code here
}
}
}
//----------------------------------------------------------------------------------------------
//
//检测接收缓冲区,判断是否接收到数据,接收到返回1,没接收到返回0
INT8U Check_Status(void)
{
if(RS485_Receive_End==1)
{
RS485_Receive_End=0;
//RS485_Receive_Save_Data(); // 对接收到的数据进行处理
if(Check_Receive_Data_Flag==1)
{
Check_Receive_Data_Flag=0;
return 1;
}
}
else
{
return 0;
}
}
//----------------------------------------------------------------------------------------------
//
void Read_Receive_Data(INT8U Receive_Buff[])
{
// 进行保存数据
INT8U Save_Count=0; // 保存接收到的数据计数器
INT8U i;
for(i=0;i<Byte_Len;i++)
{
Receive_Buff[Save_Count]=RS485_Receive_Buff[i];
Save_Count++;
}
IIC_Send_Handle(); // 调用IIC处理函数
}
//----------------------------------------------------------------------------------------------
//
// 主程序
void main(void)
{
INT8U Check_Flag;
//初始化UART
RS485_UARTInit();
RS485_Send_Flag=1;
while(1)
{
delay_ms(1000);
led1=!led1;
// 发送数据函数
Send(RS485_Send_Buff,40,0x08);
// 检测是否接收到有效数据
Check_Flag=Check_Status();
// 接收到读取数据
// 所谓的读取数据是否包括保存数据到二级缓冲区,调用IIC发送,启动发送回复包
if(Check_Flag==1)
{
Read_Receive_Data(RS485_Receive_Save);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -