本帖最后由 xiaoqing253260 于 2021-12-20 15:02 编辑
/**********************************************************************************************
**DMB通讯
***********************************************************************************************/
void USART0_IRQHandler(void)
{
uint8_t temp ;
uint8_t ClearFlag = ClearFlag;//这样赋值清除语法警告
if(Uart_GetStatus(UARTCH0, UartRxFull) != TRUE) //RC 接收完成为真,UART0数据接收,有数据来了
{
if((M0P_UART0->SBUF==0xF7)&&(u8_DMB_RxCNT==0))//F7地址开始自增
{
u8_DMB_RxBUF[u8_DMB_RxCNT]=M0P_UART0->SBUF; //读出接收数据
u8_DMB_RxCNT++; //依次存储
Uart_ClrStatus(UARTCH0,UartRxFull);
return;
}
if((M0P_UART0->SBUF==0xF8)&&(u8_DMB_RxCNT==1)) //F8确认包头
{
u8_DMB_RxBUF[u8_DMB_RxCNT]=M0P_UART0->SBUF;
u8_DMB_RxCNT++;
uart_flag.uart0_receive_start=1; //开始处理,置位串口1接收开始标志位
Uart_ClrStatus(UARTCH0,UartRxFull);
return;
}
else if(u8_DMB_RxCNT==1) //包头不正确之后不做处理
{
uart_flag.uart0_receive_start=0;
u8_DMB_RxCNT = 0 ;
Uart_ClrStatus(UARTCH0,UartRxFull);
return;
}
if((M0P_UART0->SBUF==0x03)&&(u8_DMB_RxCNT==2)&&(uart_flag.uart0_receive_start==1))
{
u8_DMB_RxBUF[u8_DMB_RxCNT]=M0P_UART0->SBUF;
u8_DMB_RxCNT++;
uart_flag.uart0_DMB_askadd=1; //置位地址请求标志位
Uart_ClrStatus(UARTCH0,UartRxFull);
return;
}
if((M0P_UART0->SBUF==0xA3)&&(u8_DMB_RxCNT==3)&&(uart_flag.uart0_DMB_askadd==1))
{
Uart_DisableIrq(UARTCH0, UartRxIrq);//关闭串口0接收中断,等待串口0发送完成
Uart_DisableIrq(UARTCH0, UartTxIrq);
delay1ms(6);
temp =(u8)(0xA5 + muc_add);
Uart_SendData(UARTCH0,0xF7);
Uart_SendData(UARTCH0,0xF8);
Uart_SendData(UARTCH0,0x03);
Uart_SendData(UARTCH0,0xA2);
Uart_SendData(UARTCH0,muc_add);
Uart_SendData(UARTCH0,temp);
Uart_SendData(UARTCH0,0xFD);
uart_flag.uart0_DMB_askadd=0;//回地址完成,复位地址请求标志位
u8_DMB_RxCNT = 0;//复位缓存地址
uart_flag.uart0_receive_start = 0;//复位串口0接收开始标志位
Uart_EnableIrq(UARTCH0, UartRxIrq);//enable the receive interrupt
Uart_EnableIrq(UARTCH0, UartTxIrq);
delay1ms(2);
return;
}
if((M0P_UART0->SBUF==0X06)&&(u8_DMB_RxCNT==2)&&(uart_flag.uart0_receive_start==1))
{
u8_DMB_RxBUF[u8_DMB_RxCNT]=M0P_UART0->ISR_f.RI;
uart_flag.uart0_DMB_transpond = 1;
Uart_ClrStatus(UARTCH0,UartRxFull);
return;
}
if(uart_flag.uart0_DMB_transpond==1)
{
u8_DMB_RxCNT++;
u8_DMB_RxBUF[u8_DMB_RxCNT]=M0P_UART0->ISR_f.RI;
if(u8_DMB_RxCNT==9)
{
Uart_DisableIrq(UARTCH0, UartRxIrq);//disable the receive interrupt
Uart_DisableIrq(UARTCH1, UartRxIrq);//disable the receive interrupt
delay1ms(3);
Uart_SendData(UARTCH0,u8_485_RxBUF[0]);//收到的DMB回码通过串口1经485芯片发出
delay1ms(2);
u8_DMB_RxCNT = 0;//复位数组标志位
uart_flag.uart0_receive_start = 0;//复位开始接受标志位
uart_flag.uart0_DMB_transpond = 0;//复位转码标志位
ClearFlag =M0P_UART0->ISR_f.RI;
ClearFlag =M0P_UART0->ISR_f.TI;
Uart_EnableIrq(UARTCH0, UartRxIrq);//disable the receive interrupt
Uart_EnableIrq(UARTCH1, UartRxIrq);//disable the receive interrupt
}
}
}
if(Uart_GetStatus(UARTCH0,UartTxEmpty)) //TC:发送完成为真,发送完成一个字节
{
Uart_ClrStatus(UARTCH0,UartTxEmpty); //清掉发送中断标志位。置0
}
}
这样就能正常接收,主要就是标志位用错,应该用寄存器
|