今日尝试开启SCI通信的中断功能,测试SCI通信FIFO:实现一次性接收8字节数据到g_recv_buff,接收完就打印输出
文章提供测试代码讲解、完整工程下载、测试效果图
目录
SCIA通信引脚:
SCI初始化:
PIE链接中断服务函数:
SCI接收发送中断服务函数:
主函数调用:
遇到的问题:
测试结果截图:
编辑
测试工程下载:
SCIA通信引脚:
TXD : GPIO 29
RXD: GPIO 28
这里我将GPIO的初始化也改为了寄存器方式:
SCI初始化:
SCI的初始化相较于之前有较大改动,主要是寄存器初始化的语句结构:
//初始化SCI 通信 void Init_SCIA(uint32_t baund,uint32_t lspclk) {SciaRegs.SCICTL1.bit.SWRESET = 1; // 0:复位重置SCI通信 1:复位之后的启用 (复位不影响之前对其 波特率寄存器 之类的设定)SciaRegs.SCIFFTX.bit.TXFFINTCLR = 1; // 0:对TXFIFINT标志位无效 1:清除位于第7位的TXFFINT标志SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1; // 1:清除接收FIFO中断 , 0: 对RXFIFINT标志位没有作用SciaRegs.SCIFFRX.bit.RXFFOVRCLR = 1; // 0:对RXFFOVF标志位无效 1:清除RXFFOVF标志位SciaRegs.SCIFFTX.bit.TXFIFORESET = 1; // 0:将FIFO指针写0以重置为零,并保持重置状态 1:重新启用发送FIFO操作SciaRegs.SCIFFRX.bit.RXFIFORESET = 1; // 0:将FIFO指针写0以重置为零,并保持重置状态 1:重新启用接收FIFO操作SciaRegs.SCIFFTX.bit.SCIRST = 1; // 写0操作将引起软件复位,并复位TXFFINT和RXFFINT,从而清除TX/RX FIFO的内容。SCI将保持复位状态,直到写入1。SciaRegs.SCICCR.bit.SCICHAR = 7 ; // 字符长度:8SciaRegs.SCICCR.bit.LOOPBKENA = 0; // 禁用环路回测模式(自己的TX 连接 自己的RX)//波特率设定unsigned char scihbaud = 0;unsigned char scilbaud = 0;Uint32 scibaud = 0;scibaud = lspclk / (8 * baund) - 1;scihbaud = scibaud >> 8;scilbaud = scibaud & 0xFF;SciaRegs.SCIHBAUD.all=scihbaud;SciaRegs.SCILBAUD.all=scilbaud;SciaRegs.SCIFFTX.bit.TXFFIL = 8; // 发送FIFO中断级别位SciaRegs.SCIFFRX.bit.RXFFIL = 8; // 接收FIFO中断级别位 可以设定的值范围是从0到31 这里表示接收8个形成一次中断SciaRegs.SCIFFTX.bit.SCIFFENA = 1; // 1:启用SCI FIFO增强功能 0:禁用SciaRegs.SCIFFRX.bit.RXFFIENA = 1; // 1:启用 RX FIFO接收中断 0:禁用SciaRegs.SCIFFTX.bit.TXFIFORESET = 1; // 0:将FIFO指针写0以重置为零,并保持重置状态 1:重新启用发送FIFO操作SciaRegs.SCIFFRX.bit.RXFIFORESET = 1; // 0:将FIFO指针写0以重置为零,并保持重置状态 1:重新启用接收FIFO操作SciaRegs.SCICTL1.bit.TXENA = 1; // 1:启用传输器 0:禁用传输器SciaRegs.SCICTL1.bit.RXENA = 1; // 接收使能: 0:防止接收到的字符传输到SCIRXEMU和SCIRXBUF接收器缓冲区 1:将接收到的字符发送到SCIRXEMU和SCIRXBUFSciaRegs.SCICTL1.bit.RXERRINTENA = 1; // 使能接收错误中断SciaRegs.SCICTL2.bit.TXINTENA = 1; // 1:启用TXRDY中断 0:禁用TXRDY中断 (传输完成的中断)SciaRegs.SCICTL2.bit.RXBKINTENA = 1; // 1:启用接收器缓冲区/中断 0:禁用 控制由RXRDY标志或BRKDT标志(SCIRXST.6和.5位)引起的中断请求SciaRegs.SCIFFCT.all=0x00; // FIFO传送延时为0SciaRegs.SCICTL1.bit.SWRESET = 1; // 0:复位重置SCI通信 1:复位之后的启用 (复位不影响之前对其 波特率寄存器 之类的设定)EALLOW;GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0; // Enable pull-up for GPIO28 (SCIRXDA)GpioCtrlRegs.GPAPUD.bit.GPIO29 = 0; // Enable pull-up for GPIO29 (SCITXDA)GpioCtrlRegs.GPAQSEL2.bit.GPIO28 = 3; // Asynch input GPIO28 (SCIRXDA)GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1; // Configure GPIO28 for SCIRXDA operationGpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1; // Configure GPIO29 for SCITXDA operationEDIS;EALLOW;PieVectTable.SCIA_TX_INT = &Scia_TxFIFOISR; //链接中断服务函数PieVectTable.SCIA_RX_INT = &Scia_RxFIFOISR; //链接中断服务函数PieCtrlRegs.PIEIER9.bit.INTx1 = 1; //9.1PieCtrlRegs.PIEIER9.bit.INTx2 = 1; //9.2IER |= M_INT9;EDIS; }
PIE链接中断服务函数:
这段也写在了SCI的初始化中,注意这段代码在系统中断初始化语句之后才会生效
SCI接收发送中断服务函数:
发送中断目前没写任何功能,但接收中断是读取8字节数据到g_recv_buff,并累计到8字节就发送标志位,让主函数打印
__interrupt void Scia_TxFIFOISR(void) {//static Uint16 i;// ScibRegs.SCIFFTX.bit.TXFFINTCLR=1;//清楚发送FIFO中断标志位。在此处如果清零会导致发送FIFO中断一直产生,因此要关闭才行PieCtrlRegs.PIEACK.all = PIEACK_GROUP9; }// SCI a 接收FIFO 中断服务函数 __interrupt void Scia_RxFIFOISR(void) {static Uint16 i = 0;//SCIa_Printf("1! \r\n");//FIFO遵循的是先入先出的原则 读取时第一个被读取的字符也是之前第一个被存入的字符,读取的字符顺序和存入时的完全一样g_recv_buff[i] =SciaRegs.SCIRXBUF.all;i++;if(i==8){i=0;g_received_flag = 1; //接收标志记 1}SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1; // Clear Overflow flagSciaRegs.SCIFFRX.bit.RXFFINTCLR=1; // Clear Interrupt flagPieCtrlRegs.PIEACK.all = PIEACK_GROUP9; }
主函数调用:
主函数接收到来自于FIFO接收中断发来的标志信号,就会回送g_recv_buff的数据发送出去
遇到的问题:
当时发现中断能够正常发生,但进不了中断服务函数:
这是因为我对SCI的PIE配置写在了中断初始化上面,导致了SCI通信PIE的初始化有问题,现在改成下面就没问题了:
测试结果截图:
测试工程下载:
https://download.csdn.net/download/qq_64257614/90482639