This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好!
我使用 F28377D 演示 controlSUITE 代码2837xDSci_FFDLB。
有一个问题打扰了我、它是关于发送 FIFO 中断实现的。
在我阅读 SCI 技术文档时、TXFFIL 位的描述是
TXFFIL4-0发送 FIFO 中断级别位。 当 FIFO 状态位(TXFFST4-0)和 FIFO 深度位(TXFFIL4-0)匹配(小于或等于)时、发送 FIFO 将产生中断。
在我看来、如果 FFST 小于或等于 FFIL、它将执行 TX 中断来执行某些操作(在示例代码中发送数据)。
如果我设置 TXFFIL = 0x2、并且我没有任何需要发送的数据。
在这种情况下、TXFFST 无疑将为零、但它将触发 TX 中断。(TXFFST = 0小于 TXFFIL = 2)
这意味着即使我没有任何要发送的数据、它也将连续执行中断。
是否有任何方法可以避免这种情况?
谢谢!
此帖子已于2017年2月2日编辑
(二 原稿稿稿稿*****
Shuen、
我看到你的困惑。 该校验为"TXFFIL<=TXFFST"。 它不执行以下操作" TXFFST<=TXFFIL"。 若要将其转换为字、当 TXFFST 大于或等于 TXFFIL 时会触发中断。
此致、
Cody
(二 结束原始帖子********
上述信息不正确、更正后的信息可在 2017年1月26日 下午5:38的 Cody Watkins 的以下文章中找到。
此致、
Cody
感谢您的回复
如您所述、在这种情况下、当 TXFFST >= TXFFIL 时、应将其触发。
我在 sciaTxFifoIsr 中命令发送数据代码、并在其中添加一个计数器、以便检查是否触发了 TX 中断。
TXFFIL 被 2置位、在这种情况下、TXFFST 将为零(无数据发送)、并且它不能执行 TX 中断。 (TXFFIL>= TXFFST)
但是、我的计数器目前仍在计数。
下面随附了我的代码。
void main (void) { uint16 I; // //步骤1。 初始化系统控制: // PLL、看门狗、启用外设时钟 //此示例函数位于 F2837xD_sysctrl.c 文件中。 // InitSysCtrl(); // 步骤2。 初始化 GPIO: //此示例函数位于 F2837xD_GPIO.c 文件中, //说明了如何将 GPIO 设置为其默认状态。 // InitGpio(); // 对于本示例,只初始化 SCI-A 端口的引脚。 // GPIO_SetupPinMux ()-设置 GPxMUX1/2和 GPyMUX1/2寄存器位 // GPIO_SetupPinOptions ()-设置 GPIO 的方向和配置 //这些函数可在 F2837xD_GPIO_c 文件中找到。 // GPIO_SetupPinMux (28、GPIO_MUX_CPU1、1); GPIO_SetupPinOptions (28、GPIO_input、 GPIO_PushPull); GPIO_SetupPinMux (29、GPIO_MUX_CPU1、1); GPIO_SetupPinOptions (29、 GPIO_OUTPUT、GPIO_异 步); // //步骤3。 清除所有中断并初始化 PIE 矢量表: //禁用 CPU 中断 // DINT; // //将 PIE 控制寄存器初始化为默认状态。 //默认状态是禁用所有 PIE 中断并 清除标志//。 //此函数位于 F2837xD_PIECTRL.c 文件中。 // InitPieCtrl(); // 禁用 CPU 中断并清除所有 CPU 中断标志: // IER = 0x0000; IFR = 0x0000; // 使用指向 shell 中断 //服务例程(ISR)的指针初始化 PIE 矢量表。 //这将填充整个表,即使在 本示例中未使用中断//也是如此。 这对于调试很有用。 //可以在 F2837xD_DefaultIsr.c 中找到 shell ISR 例程 //此函数可在 F2837xD_PieVect.c 中找到 // InitPieVectTable (); // //本示例中使用的中断被重新映射到 该文件中的// ISR 函数。 // EALLOW;//需要这来写入 EALLOW 受保护寄存 器 PieVectTable.SCIA_RX_INT =&sciaRxFifoIsr; PieVectTable.SCIA_TX_INT =&sciaTxFifoIsr; EDIS;//这是禁用写入 EALLOW 受保护的寄存 器所必需的;GPALLOW = GPADRxFifoR1.GPIO4/ GPIOL.GPIORT.4/ GPIO4/ GPIORT.GPIO4/ GPIO4/ GPIO4/ GPIO1.GPIO4/ GPIO4/ GPIO1.GPIO4/ GPIO1.GPIO1.GPIORT.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1. 初始化设备外设: // scia_fifo_init ();//初始化 SCI-A // 步骤5。 用户特定代码、启用中断: // // Init 发送数据。 每次传输后、此数据 //将更新为下一次传输 // //////* for (i = 0;i<2;i++) { sdataA[i]= i; } RDATA_pointA = sdataA[0]; */ // 启用此示例所需的中断 // PieCtrlRegs.PIECTRL.bit.ENPIE = 1;//启用 PIE 块 PieCtrlRegs.PIEIER9.bit.PIE = 1;// INTIE9 = 1;PIE = 0x2 = 1;PIE 组= INIER9;PIE = 1 //启用 CPU INT ; // /步骤6。 空闲循环。 只需坐下来循环(可选): // for (;;); } 中断 void sciaTxFifoIsr (void) { count++; /* for (i=0;i< 2;i++) { SciaRegs.SCITXBUF.all=sdataA[i];//发送数据 } */ * for (i=0;i< 2;i++) //递增发送下一个周期的数据 { sdataA[i]=(sdataA[i]+1)和0x00FF; } * SciaRegs.SCIFFTX.bit.TXFFINTCLR=1;//清除 SCI 中断标志 PieCtrlRegs.PIEACK.All|=0x100; //发出 PIE ACK } 中断空 sciaRxFifoIsr (void) { //* for (i=0;i<2;i++) { rdataA[i]=SciaRegs.SCIRXBUF.all;//读取数据 } ( i=0;i<2;i++)的*///* //检查接收到的数据 { if (rdataA[i]!=(RDATA_pointA+I)& 0x00FF) { error(); } } RDATA_pointA =(RDATA_pointA+1)和0x00FF; * SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;//清除溢出标志 SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;//清除中断标志 PieCtrlRegs.PIEACK.All|=0x100; //发出 PIE ack } void scia_fifo_init () { SciaRegs.SCICCR.all = 0x0007; // 1停止位,无环回 //无奇偶校验,8个字符位, //异步模式,空闲线协议 SciaRegs.SCICTL1.all = 0x0003; //启用 TX、RX、内部 SCICLK、 //禁用 RX ERR、SLEEP、TXWAKE //SciaRegs.SCICT2.bit.TXINTENA=1; //SciaRegs.SCICT2.bit.RXBINTENA=1; SciaRegs.SCIHBAUD.ALL = 0x00; SciaRegs.SCILBAUD.ALL = 0x6b; / SciaRegs.SCICLA.0X.US.CLK = 0x00.CLUS.CLUS=0x00.SCICK=0X.CLUS.CLUS.CLUS.CLUS.CLUS.CLUS.CLUS.CLUS.US.CLUS.CLUS.CLUS.CLUS.CLUS.CLUS.US.0.CLA = 0x00.SCRIS.CLUS.CLUS.CLUS.CLUS.CLUS.CLUS.0.CLUS.US.CLUS.CLUS //从复位 SciaRegs.SCIFFTX.bit.TXFIFORESET 中放弃 SCI = 1; SciaRegs.SCIFFRX.bit.RXFIFORESET = 1; }
当 TXFFST 大于或等于 TXFFIL 时、是否触发 TX 中断毫无意义。
在这种情况下不应计数器。
Shuen、
很抱歉、我错误地向您描述了 TXFFIL 寄存器。 我向您介绍的是 RXFFIL 寄存器的工作方式。
澄清:
TXFFIL:在以下条件 TXFFIL<= TXFFST 期间产生中断。 当 SCI 正在运行而没有消息要发送时、您会收到此中断。 此时、CPU 需要向 SCI 模块提供更多消息。
RXFFIL:在以下条件 RXFFIL >= RXFFST 时产生中断。 当 SCI RX FIFO 空间不足时、您会收到此中断。 此时、CPU 需要读取 从 SCI 模块接收到的消息。
在您不发送数据的长时间内、您可以禁用中断。 或者、如果您的 SCI 不是很活跃、则更有意义的是不使用 FIFO 增强功能。
此致、
Cody