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

[复制链接]
3318|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 | 显示全部楼层
  1. void USART0_IRQHandler(void) {
  2. #if 1
  3.           if(SET == usart_interrupt_flag_get(USART0, USART_INT_FLAG_TBE)||SET == usart_interrupt_flag_get(USART0, USART_INT_FLAG_TC)){
  4.                         usart_flag_clear(USART0, USART_INT_FLAG_TBE);
  5.                         usart_flag_clear(USART0, USART_INT_FLAG_TC);
  6.                         p_usartSendOK = 1;
  7.                 }

  1. void DMA0_Channel3_IRQHandler(void)
  2. {
  3.         //while(RESET == dma_interrupt_flag_get(DMA0, DMA_CH3, DMA_INTF_FTFIF));
  4.         //dma_interrupt_flag_clear(DMA0, DMA_CH3, DMA_INTF_FTFIF);
  5.        
  6.         if(SET == dma_interrupt_flag_get(DMA0, DMA_CH3, DMA_INT_FLAG_FTF)){
  7.                 dma_interrupt_flag_clear(DMA0, DMA_CH3, DMA_INT_FLAG_FTF);
  8.                 //dma_channel_disable(DMA0, DMA_CH3);//使能DMA0_CH3
  9.                 usart_flag_clear(USART0, USART_FLAG_TC);
  10.                                 usart_interrupt_enable(USART0, USART_INT_TC);       
  11.                 usart_flag_clear(USART0, USART_FLAG_TBE);
  12.                                 usart_interrupt_enable(USART0, USART_INT_TBE);       
  13.                 p_dmaSendOK = 0x01;       
  14.                                 }

  15. }

  1. int main(void)
  2. {
  3.     initGPIO();
  4.     initUART();
  5.           DMA_init();

  6.     while(1)
  7.     {
  8.         delay_ms(1000); // 延时100毫秒

  9.                                         TxCount=0;
  10.                                              //USART0 scan sla
  11.                                 Tx_Buf[TxCount++] = 0x0A;
  12.                                 Tx_Buf[TxCount++] = 0x01;
  13.                                 Tx_Buf[TxCount++] = 0x00;
  14.                                 Tx_Buf[TxCount++] = 0x21;
  15.                                 Tx_Buf[TxCount++] = 0x00;
  16.                                 Tx_Buf[TxCount++] = 0x12;
  17.                                 uint16_t tmpData = getModbusCRC16(Tx_Buf, TxCount);
  18.                                 Tx_Buf[TxCount++] = (uint8_t)(tmpData);                  /* crc 高字节 */
  19.                                 Tx_Buf[TxCount++] = (uint8_t)(tmpData>>8);                    /* crc 低字节 */

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

  33.                                 #if 1
  34.                                
  35.         while(!p_usartSendOK);
  36.                                 p_usartSendOK=0;       
  37.         usart_interrupt_disable(USART0, USART_INT_TC);       
  38.                                 #endif                               
  39.                                 gpio_bit_reset(GPIOA, GPIO_PIN_7);
  40.                                 delay_ms(1);
  41.                                 p_InputRegister = 0x0E;
  42.                                 #endif                       
  43.                         }


 楼主| Aist2018 发表于 2024-5-22 12:31 | 显示全部楼层
在DMA发完中断里打开TC,TBE中断,等串口发完。一直不进串口中断,TBE,TC都不进,看寄存器TBE,TBIE都1了,也没进TBE中断,TC不为1,收端看数据是发完了。
 楼主| Aist2018 发表于 2024-5-22 12:35 | 显示全部楼层
本帖最后由 Aist2018 于 2024-5-22 12:39 编辑

可能原因是什么呢?又硬件的问题吗?不判断串口TC, 在485变成接收状态后发现发送少1个字节,最后字节FF,加延时能发完。可是我想用判断串口TC,然后改变485为接收状态。目前是我在DMA发完中断里打开窗口TC中断,没进TC中断,TBE中断也没有。
jcky001 发表于 2024-5-22 16:40 | 显示全部楼层
检查是否已正确使能了与UART(或USART)相关的中断。
probedog 发表于 2024-5-22 16:44 | 显示全部楼层
建议查数据手册、参考手册
powerantone 发表于 2024-5-22 16:59 | 显示全部楼层
软件配置是否正确
cr315 发表于 2024-5-22 19:00 | 显示全部楼层
可能是中断优先级问题
lishuoff 发表于 2024-5-22 20:11 | 显示全部楼层
从你贴出的代码中没有看见使能USART0中断
两只袜子 发表于 2024-5-22 21:23 | 显示全部楼层
检查中断服务程序(ISR)是否正确编写,并且能够被正确调用。有时候,ISR中的代码可能存在错误或遗漏,导致中断没有按预期执行。
stormwind123 发表于 2024-5-22 22:00 | 显示全部楼层
中断触发条件问题?
laocuo1142 发表于 2024-5-22 22:22 | 显示全部楼层
检查RS485通讯接口电路是否连接正确,包括发送和接收线路、终端电阻等。
flycamelaaa 发表于 2024-5-22 23:00 | 显示全部楼层
使用示波器检查发送和接收线路上的信号波形是否正常。
cooldog123pp 发表于 2024-5-23 21:44 | 显示全部楼层
12楼的说法感觉靠谱,检查中断服务程序(ISR)是否正确编写,并且能够被正确调用。有时候,ISR中的代码可能存在错误或遗漏,导致中断没有按预期执行。
rzjvv 发表于 2024-5-31 23:22 | 显示全部楼层
本帖最后由 rzjvv 于 2024-6-1 01:45 编辑

:如果在进入中断服务程序之前,未正确清除串口发送完成中断标志位,可能导致中断无法正确触发。
rzjvv 发表于 2024-5-31 23:22 | 显示全部楼层
本帖最后由 rzjvv 于 2024-6-1 01:46 编辑
flycamelaaa 发表于 2024-5-22 23:00
使用示波器检查发送和接收线路上的信号波形是否正常。

使用示波器检查发送和接收线路上的信号波形是否正常是一种非常有效的方法
rzjvv 发表于 2024-5-31 23:22 | 显示全部楼层
本帖最后由 rzjvv 于 2024-6-1 01:44 编辑
cr315 发表于 2024-5-22 19:00
可能是中断优先级问题

中断优先级的设置非常重要
rzjvv 发表于 2024-5-31 23:22 | 显示全部楼层
本帖最后由 rzjvv 于 2024-6-1 01:44 编辑
Aist2018 发表于 2024-5-22 12:35
可能原因是什么呢?又硬件的问题吗?不判断串口TC, 在485变成接收状态后发现发送少1个字节,最后字节FF,加 ...

首先要排除硬件连接或电气问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

90

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部