打印
[技术问答]

HC32L110串口收发不出去

[复制链接]
2242|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiaoqing253260|  楼主 | 2021-12-16 10:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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[uart0_buf_add]=M0P_UART0->ISR_f.RI;
                        uart0_buf_add++;
                        return;
                }
       
                if((M0P_UART0->ISR_f.RI==0xF8)&&(uart0_buf_add==1))        //F8确认包头
                {
                        uart0_receive_buf[uart0_buf_add]=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[uart0_buf_add]=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;
                }
        }
}       

使用特权

评论回复
沙发
wubangmi| | 2021-12-16 10:59 | 只看该作者
M0P_UART0->ISR_f.RI
你先看下这个寄存器代表的是什么意思,从你代码逻辑来看,你理解错了上面这个寄存器的作用

使用特权

评论回复
评论
xiaoqing253260 2021-12-18 08:14 回复TA
好的,谢谢哈 
板凳
martinhu| | 2021-12-17 10:09 | 只看该作者
楼主是不是不太了解寄存器操作,M0P_UART0->ISR_f.RI是ISR寄存器的一个bit,就是1或者0,
这是一个接收完成中断标志,接收完成后,硬件置一,软件清零……
读数据到buff数据,不是从这里读的……

使用特权

评论回复
地板
yangjiaxu| | 2021-12-17 15:54 | 只看该作者
仿真跟一下看看

使用特权

评论回复
5
ddxx| | 2021-12-18 10:07 | 只看该作者
发个代码你参考一下。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();
        }
    }
}


使用特权

评论回复
6
xiaoqing253260|  楼主 | 2021-12-18 17:04 | 只看该作者
本帖最后由 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       
        }
}

这样就能正常接收,主要就是标志位用错,应该用寄存器

使用特权

评论回复
7
martinhu| | 2021-12-20 09:49 | 只看该作者
xiaoqing253260 发表于 2021-12-18 17:04
void USART0_IRQHandler (void)
{
        uint8_t temp ;

  if(Uart_GetStatus(UARTCH0, UartRxFull) != TRUE)        //RC 接收完成为真,UART0数据接收,有数据来了
这句什么意思,Rx标志不是TRUE才是接收完成?????
楼主参考一下样例和手册,不要自己凭空写

使用特权

评论回复
评论
martinhu 2021-12-21 09:18 回复TA
@xiaoqing253260 :没接收完成怎么进的中断????楼主是不是不理解中断请求什么意思 
xiaoqing253260 2021-12-20 11:35 回复TA
没接收完成 
8
mutable| | 2021-12-27 17:18 | 只看该作者
问题在哪

使用特权

评论回复
9
drer| | 2022-1-11 16:09 | 只看该作者
既不能收也不能发送吗

使用特权

评论回复
10
gwsan| | 2022-1-11 16:14 | 只看该作者
硬件仿真确定问题点在哪里

使用特权

评论回复
11
kxsi| | 2022-1-11 16:26 | 只看该作者
能正常发送数据吗

使用特权

评论回复
12
aoyi| | 2022-1-11 16:31 | 只看该作者
说明可以进入接收中断啊

使用特权

评论回复
13
nawu| | 2022-1-11 16:39 | 只看该作者
这个标志位一直没有变化吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

0

粉丝