打印

485通讯,状态寄存器TBE,TC都为1,但是没进中断

[复制链接]
2493|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Aist2018|  楼主 | 2024-5-22 11:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
485通讯,状态寄存器TBE,TC都为1,但是没进中断。请问有人遇到过这情况吗?可能原因是什么呢?

使用特权

评论回复
沙发
Aist2018|  楼主 | 2024-5-22 12:10 | 只看该作者
刚又看了一下,TC不为1了,但是看收端数据发完,CTRL0的TCIE为1,

使用特权

评论回复
板凳
Aist2018|  楼主 | 2024-5-22 12:18 | 只看该作者
看接收数据发完,但是发端不进中断,TC没有置为1,TBE为1,TBIE为1,但是也没进中断,奇怪是TBE中断也没有,明明相关寄存器位已经为1了。这情况是因为其他中断干扰吗?

使用特权

评论回复
地板
Aist2018|  楼主 | 2024-5-22 12:29 | 只看该作者
void USART0_IRQHandler(void) { 
#if 1
          if(SET == usart_interrupt_flag_get(USART0, USART_INT_FLAG_TBE)||SET == usart_interrupt_flag_get(USART0, USART_INT_FLAG_TC)){
                        usart_flag_clear(USART0, USART_INT_FLAG_TBE);
                        usart_flag_clear(USART0, USART_INT_FLAG_TC);
                        p_usartSendOK = 1;
                }

void DMA0_Channel3_IRQHandler(void)
{
        //while(RESET == dma_interrupt_flag_get(DMA0, DMA_CH3, DMA_INTF_FTFIF));
        //dma_interrupt_flag_clear(DMA0, DMA_CH3, DMA_INTF_FTFIF);
       
        if(SET == dma_interrupt_flag_get(DMA0, DMA_CH3, DMA_INT_FLAG_FTF)){
                dma_interrupt_flag_clear(DMA0, DMA_CH3, DMA_INT_FLAG_FTF);
                //dma_channel_disable(DMA0, DMA_CH3);//使能DMA0_CH3
                usart_flag_clear(USART0, USART_FLAG_TC);
                                usart_interrupt_enable(USART0, USART_INT_TC);       
                usart_flag_clear(USART0, USART_FLAG_TBE);
                                usart_interrupt_enable(USART0, USART_INT_TBE);       
                p_dmaSendOK = 0x01;       
                                }

}

int main(void)
{
    initGPIO();
    initUART();
          DMA_init();

    while(1)
    {
        delay_ms(1000); // 延时100毫秒

                                        TxCount=0;
                                             //USART0 scan sla
                                Tx_Buf[TxCount++] = 0x0A;
                                Tx_Buf[TxCount++] = 0x01;
                                Tx_Buf[TxCount++] = 0x00;
                                Tx_Buf[TxCount++] = 0x21;
                                Tx_Buf[TxCount++] = 0x00;
                                Tx_Buf[TxCount++] = 0x12;
                                uint16_t tmpData = getModbusCRC16(Tx_Buf, TxCount);
                                Tx_Buf[TxCount++] = (uint8_t)(tmpData);                  /* crc 高字节 */
                                Tx_Buf[TxCount++] = (uint8_t)(tmpData>>8);                    /* crc 低字节 */

                                #if 1
                                tx_size = TxCount;
                                gpio_bit_set(GPIOA, GPIO_PIN_7);
                                delay_ms (1);
                                dma_channel_disable(DMA0, DMA_CH3);//使能DMA0_CH3
        dma_flag_clear(DMA0, DMA_CH3, DMA_FLAG_FTF);//清除DMA通道传输完成标志
        dma_memory_address_config(DMA0, DMA_CH3,  (uint32_t)Tx_Buf);//配置存储器基地址
                                dma_transfer_number_config(DMA0, DMA_CH3,  tx_size);
                                dma_channel_enable(DMA0, DMA_CH3);
                                usart_dma_transmit_config(USART0, USART_TRANSMIT_DMA_ENABLE);    //发送
                                /* wait until USART0 TX DMA0 channel transfer complete */
                                while(!p_dmaSendOK);
                                p_dmaSendOK=0;

                                #if 1
                               
        while(!p_usartSendOK);
                                p_usartSendOK=0;       
        usart_interrupt_disable(USART0, USART_INT_TC);       
                                #endif                               
                                gpio_bit_reset(GPIOA, GPIO_PIN_7);
                                delay_ms(1);
                                p_InputRegister = 0x0E;
                                #endif                       
                        }


使用特权

评论回复
5
Aist2018|  楼主 | 2024-5-22 12:31 | 只看该作者
在DMA发完中断里打开TC,TBE中断,等串口发完。一直不进串口中断,TBE,TC都不进,看寄存器TBE,TBIE都1了,也没进TBE中断,TC不为1,收端看数据是发完了。

使用特权

评论回复
6
Aist2018|  楼主 | 2024-5-22 12:35 | 只看该作者
本帖最后由 Aist2018 于 2024-5-22 12:39 编辑

可能原因是什么呢?又硬件的问题吗?不判断串口TC, 在485变成接收状态后发现发送少1个字节,最后字节FF,加延时能发完。可是我想用判断串口TC,然后改变485为接收状态。目前是我在DMA发完中断里打开窗口TC中断,没进TC中断,TBE中断也没有。

使用特权

评论回复
7
jcky001| | 2024-5-22 16:40 | 只看该作者
检查是否已正确使能了与UART(或USART)相关的中断。

使用特权

评论回复
8
probedog| | 2024-5-22 16:44 | 只看该作者
建议查数据手册、参考手册

使用特权

评论回复
9
powerantone| | 2024-5-22 16:59 | 只看该作者
软件配置是否正确

使用特权

评论回复
10
cr315| | 2024-5-22 19:00 | 只看该作者
可能是中断优先级问题

使用特权

评论回复
11
lishuoff| | 2024-5-22 20:11 | 只看该作者
从你贴出的代码中没有看见使能USART0中断

使用特权

评论回复
12
两只袜子| | 2024-5-22 21:23 | 只看该作者
检查中断服务程序(ISR)是否正确编写,并且能够被正确调用。有时候,ISR中的代码可能存在错误或遗漏,导致中断没有按预期执行。

使用特权

评论回复
13
stormwind123| | 2024-5-22 22:00 | 只看该作者
中断触发条件问题?

使用特权

评论回复
14
laocuo1142| | 2024-5-22 22:22 | 只看该作者
检查RS485通讯接口电路是否连接正确,包括发送和接收线路、终端电阻等。

使用特权

评论回复
15
flycamelaaa| | 2024-5-22 23:00 | 只看该作者
使用示波器检查发送和接收线路上的信号波形是否正常。

使用特权

评论回复
16
cooldog123pp| | 2024-5-23 21:44 | 只看该作者
12楼的说法感觉靠谱,检查中断服务程序(ISR)是否正确编写,并且能够被正确调用。有时候,ISR中的代码可能存在错误或遗漏,导致中断没有按预期执行。

使用特权

评论回复
17
rzjvv| | 2024-5-31 23:22 | 只看该作者
本帖最后由 rzjvv 于 2024-6-1 01:45 编辑

:如果在进入中断服务程序之前,未正确清除串口发送完成中断标志位,可能导致中断无法正确触发。

使用特权

评论回复
18
rzjvv| | 2024-5-31 23:22 | 只看该作者
本帖最后由 rzjvv 于 2024-6-1 01:46 编辑
flycamelaaa 发表于 2024-5-22 23:00
使用示波器检查发送和接收线路上的信号波形是否正常。

使用示波器检查发送和接收线路上的信号波形是否正常是一种非常有效的方法

使用特权

评论回复
19
rzjvv| | 2024-5-31 23:22 | 只看该作者
本帖最后由 rzjvv 于 2024-6-1 01:44 编辑
cr315 发表于 2024-5-22 19:00
可能是中断优先级问题

中断优先级的设置非常重要

使用特权

评论回复
20
rzjvv| | 2024-5-31 23:22 | 只看该作者
本帖最后由 rzjvv 于 2024-6-1 01:44 编辑
Aist2018 发表于 2024-5-22 12:35
可能原因是什么呢?又硬件的问题吗?不判断串口TC, 在485变成接收状态后发现发送少1个字节,最后字节FF,加 ...

首先要排除硬件连接或电气问题。

使用特权

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

本版积分规则

15

主题

78

帖子

0

粉丝