HC32L110串口收发不出去
HC32L110串口收发不出去,也找不出哪错了void USART0_IRQHandler (void)
{
uint8_t temp ;
uint8_t ClearFlag = ClearFlag;//这样赋值清除语法警告
if(Uart_GetStatus(UARTCH0, UartRxFull) == TRUE)//读数据寄存器非空, 接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
if((M0P_UART0->ISR_f.RI==0xF7)&&(uart0_buf_add==0)) //F7地址开始自增
{
uart0_receive_buf=M0P_UART0->ISR_f.RI;
uart0_buf_add++;
return;
}
if((M0P_UART0->ISR_f.RI==0xF8)&&(uart0_buf_add==1)) //F8确认包头
{
uart0_receive_buf=M0P_UART0->ISR_f.RI;
uart0_buf_add++;
uart_flag.uart0_receive_start=1; //开始处理,置位串口1接收开始标志位
return;
}
else if(uart0_buf_add==1) //包头不正确之后不做处理
{
uart_flag.uart0_receive_start=0;
uart0_buf_add = 0 ;
return;
}
if((M0P_UART0->ISR_f.RI==0x03)&&(uart0_buf_add==2)&&(uart_flag.uart0_receive_start==1))
{
uart0_receive_buf=M0P_UART0->ISR_f.RI;
uart_flag.uart0_DMB_askadd=1; //置位地址请求标志位
uart0_buf_add++;
return;
}
if((M0P_UART0->ISR_f.RI==0xA3)&&(uart0_buf_add==3)&&(uart_flag.uart0_DMB_askadd==1))
{
Uart_DisableIrq(UARTCH0, UartRxIrq);//关闭串口1接收中断,等待串口1发送完成
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;//回地址完成,复位地址请求标志位
uart0_buf_add = 0;//复位缓存地址
uart_flag.uart0_receive_start = 0;//复位串口1接收开始标志位
Uart_EnableIrq(UARTCH0, UartRxIrq);//enable the receive interrupt
Uart_EnableIrq(UARTCH0, UartTxIrq);
delay1ms(2);
return;
}
}
} M0P_UART0->ISR_f.RI
你先看下这个寄存器代表的是什么意思,从你代码逻辑来看,你理解错了上面这个寄存器的作用 楼主是不是不太了解寄存器操作,M0P_UART0->ISR_f.RI是ISR寄存器的一个bit,就是1或者0,
这是一个接收完成中断标志,接收完成后,硬件置一,软件清零……
读数据到buff数据,不是从这里读的…… 仿真跟一下看看 发个代码你参考一下。void Uart_IRQHandler(uint8_t u8Param)
{
stc_uart_instance_data_t *pstcData = NULL;
pstcData = UartGetInternDataPtr(u8Param);
if (NULL == pstcData)
{
return;
}
if(1 == pstcData->pstcInstance->ISR_f.FE)
{
Uart_ClrStatus(u8Param,UartRFRAMEError);
if(NULL != pstcData->stcUartInternIrqCb.pfnRxErrIrqCb)
{
pstcData->stcUartInternIrqCb.pfnRxErrIrqCb();
}
return;//若奇偶校验出错则不进行后续数据处玿
}
if(1 == pstcData->pstcInstance->ISR_f.RI)
{
Uart_ClrStatus(u8Param,UartRxFull);
if(NULL != pstcData->stcUartInternIrqCb.pfnRxIrqCb)
{
pstcData->stcUartInternIrqCb.pfnRxIrqCb();
}
}
if(1 == pstcData->pstcInstance->ISR_f.TI)
{
Uart_ClrStatus(u8Param,UartTxEmpty);
if(NULL != pstcData->stcUartInternIrqCb.pfnTxIrqCb)
{
pstcData->stcUartInternIrqCb.pfnTxIrqCb();
}
}
}
本帖最后由 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=M0P_UART0->SBUF; //读出接收数据
u8_DMB_RxCNT++; //依次存储
Uart_ClrStatus(UARTCH0,UartRxFull);
return;
}
if((M0P_UART0->SBUF==0xF8)&&(u8_DMB_RxCNT==1)) //F8确认包头
{
u8_DMB_RxBUF=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=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=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=M0P_UART0->ISR_f.RI;
if(u8_DMB_RxCNT==9)
{
Uart_DisableIrq(UARTCH0, UartRxIrq);//disablethe receive interrupt
Uart_DisableIrq(UARTCH1, UartRxIrq);//disablethe receive interrupt
delay1ms(3);
Uart_SendData(UARTCH0,u8_485_RxBUF);//收到的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);//disablethe receive interrupt
Uart_EnableIrq(UARTCH1, UartRxIrq);//disablethe receive interrupt
}
}
}
if(Uart_GetStatus(UARTCH0,UartTxEmpty)) //TC:发送完成为真,发送完成一个字节
{
Uart_ClrStatus(UARTCH0,UartTxEmpty); //清掉发送中断标志位。置0
}
}
这样就能正常接收,主要就是标志位用错,应该用寄存器
xiaoqing253260 发表于 2021-12-18 17:04
void USART0_IRQHandler (void)
{
uint8_t temp ;
if(Uart_GetStatus(UARTCH0, UartRxFull) != TRUE) //RC 接收完成为真,UART0数据接收,有数据来了
这句什么意思,Rx标志不是TRUE才是接收完成?????
楼主参考一下样例和手册,不要自己凭空写 问题在哪 既不能收也不能发送吗 硬件仿真确定问题点在哪里 能正常发送数据吗 说明可以进入接收中断啊 这个标志位一直没有变化吗
页:
[1]