[求助]关于ch432t的中断

你好,想请问一下,我现在432能接收数据,发送数据是在需要发送的时候把发送的中断打开的,但是发现程序中发送中断打开,产生一个奇怪的中断后,就不发生发送中断了,这个是什么原因呢?程序如下: 这个是开启或者关闭发送中断函数 static void Spi_Uart_SendInt_EN(uint8_t PortNum,uint8_t is_enable) { uint8_t ier_status=0; uint8_t uart_num=PortNum%2; //SPI_Open(SPI_UART_PORT,SPI_UART_CLKRATE); if(is_enable) { ier_status = ReadCH432Data(CH432_IER_PORT(uart_num)); ier_status |= BIT_IER_IETHRE; WriteCH432Data(CH432_IER_PORT(uart_num),ier_status); } else { ier_status = ReadCH432Data(CH432_IER_PORT(uart_num)); ier_status &= ~BIT_IER_IETHRE; WriteCH432Data(CH432_IER_PORT(uart_num),ier_status); } //SPI_Close(SPI_UART_PORT); } 这个是发送函数: uint32_t Spi_Uart_Write(uint8_t PortNum,uint8_t* pBuffer,uint32_t Len,uint8_t IsSync) { uint32_t r=0; uint8_t uart_num=PortNum%2; if(PortNum>=MAX_COM_NUM) return 0;//无效端口,不能写入. if(Spi_Uart_IsOpened(PortNum)==0x00) {//串口末打开,不能写入. return 0; } r=QUEUE_Write(&Spi_Ucb[PortNum].QWrite,pBuffer,Len); if(r) { //NVIC_DisableIRQ(GPIO_IRQn); Spi_Uart_SendInt_EN(PortNum,1); //NVIC_EnableIRQ(GPIO_IRQn); } if(IsSync) {/*如果要求写入同步(即串口数据完全发送完成后,才返回该函数)*/ while(!QUEUE_IsEmpty(&Spi_Ucb[PortNum].QWrite)) OSTimeDly(1); } return r; } 这个是中断函数,我的中断很简单,只要发生中断,我就发一个信号量,另外一个函数处理中断: void Spi_CH432Interrupt(uint8_t PortNum) /* 中断方式处理 */ { Spi_uart_int_Msg msg_tmp; //有其中任何一个产生中断,那么就发送信号量 msg_tmp.PortNum = PortNum; QUEUE_Write(&Spi_Int_Msg_Queue,&msg_tmp,sizeof(Spi_uart_int_Msg)); OSSemPost(Spi_uart_Sem); } 然后是处理函数,就是读取中断的数值,对应哪个中断就处理那个。。。。。

我现在的问题是:我只是用串口1,串口0关闭的,一打开发送中断,发生一个中断后,我读取的两个IIR的数值分别为0x3f和0x01。这个会是什么原因呢?

还有一个问题就是,我发送是不段循环的,间隔5秒,但是它什么都没有发生出来,然后我读取了IERde寄存器,发现数值变为0x60,也就是说他休眠了,这个是什么原因啊?


你现在首先要确定的一点是MCU和CH432的通信接口能正常通信,这个测试很简单,你就是往CH432的寄存器里写数据,然后读出来,看看这个值跟你写的是否一样,如果不同,那么接口程序上有问题,这种情况很容易出现寄存器配置不正确,造成CH432工作异常。 如果接口测试没有问题,你直接把发送中断打开,打开方式比如直接开串口1的发送中断,往串口1的IER寄存器写入0x03,然后一直发数据,如果这时候正常,你看看你的开启发送中断的函数是不是有可能被接收中断给打断,造成这种情况。 另外问一下,你现在是用CH432来和485通讯吗?


呃,我是连接232,那我试试不开接收中断看看,因为我测试的时候只是发送的,如果照你说的,要一开始就开发送中断,那不是一直有中断过来,我只想在发送数据的时候开,没有发送的时候就关闭,另外我接收数据是正常的,432的寄存器有读取过数据,初始值是正确的,我修改后再读出来也是正确的,不是连接问题


发送中断一开始就打开,不会影响你现在的工作状态,发送空中断产生是FIFO中从有数据到无数据的一个状态过程产生的中断,不会一直产生发送空中断。你现在这样做,感觉操作有点繁琐了。


你现在线路状态中断有没有打开,你现在直接初始化的时候就把发送空中断打开,后面就不用开或关发送中断了,试试看还有没有问题。


线路中断有打开,也查询过线路状态寄存器, 有个疑问:资料里面不是写着是FIFO为空就产生吗?


发送空中断应该是THR从有数据到无数据产生的一个中断,不是只要空就产生中断,你的线路状态寄存器读出来值是多少。


只有登录才能回复,可以选择微信账号登录