主题中讨论的其他器件:HALCOGEN
您好!
在 SCI-A/LIN 上使用多缓冲模式时出现问题。
基本上、我希望每 n 个字节生成一个中断、以避免 CPU 过载过多。
我以为在多缓冲模式下、我可以在多少字节产生中断 RXDY 后进行选择、但它似乎不起作用。
以下是我的代码:
void sciInit (void) { /**-使 SCI1退出复位*/ SCI->GCR0=0U; SCI->GCR0 = 1U; /**-禁用所有中断*/ SCI->CLEARINT = 0xFFFFFFU; SCI->CLEARINTLVL = 0xFFFFFFU; /**-全局控制1 */ SCI->GCR1 =(uint32)((uint32) 1U <<25U)//启用发送*/ |(uint32)((uint32) 1U << 24U)/*启用接收*/ |(UINT32)((UINT32) 1U << 5U)//内部时钟(器件没有时钟引脚)*/ |(uint32)((uint32)(1U-1U)<<4U)/*停止位数*/ |(uint32)((uint32) 0U << 3U)/*偶校验、否则为奇数*/ |(uint32)((uint32) 0U << 2U)/*启用奇偶校验*/ |(uint32)((uint32) 1U << 1U)/*异步计时模式*/ |(uint32)((uint32) 1U << 16U)//启用了针对 test*/的回路模式 |(uint32)((uint32) 1U << 10U);//启用多缓冲模式 /**-设置波特率*/ SCI->BRS = 650U;/*波特率*/ /**-传输长度*/ SCI->format =/*0X0700 |*/(8U - 1U);/*长度(8个大小为8的字符,根据数据表)*/ /**-设置 SCI1引脚功能模式*/ SCI->PIO0=(uint32)((uint32) 1U <<2U)/* TX 引脚*/ |(uint32)((uint32) 1U << 1U);/* Rx 引脚* /**-设置 SCI1引脚默认输出值*/ SCI->PIO3=(uint32)((uint32) 0U <<2U)/* TX 引脚*/ |(uint32)((uint32) 0U << 1U);/* Rx 引脚* /**-设置 SCI1引脚输出方向*/ SCI->PIO1 =(uint32)((uint32) 0U << 2U)/* TX 引脚*/ |(uint32)((uint32) 0U << 1U);/* Rx 引脚* /**-设置 SCI1引脚开漏使能*/ SCI->PIO6 =(uint32)((uint32) 0U << 2U)/* TX 引脚*/ |(uint32)((uint32) 0U << 1U);/* Rx 引脚* /**-设置 SCI1引脚上拉/下拉使能*/ SCI->PIO7=(uint32)((uint32) 0U <<2U)/* TX 引脚*/ |(uint32)((uint32) 0U << 1U);/* Rx 引脚* /**-设置 SCI1引脚上拉/下拉选择*/ SCI->PIO8=(uint32)((uint32) 1U <<2U)/* TX 引脚*/ |(uint32)((uint32) 1U << 1U);/* Rx 引脚* /**-设置中断级别*/ SCI->SETINTLVL =(uint32)((uint32) 0U <<26U)//帧错误 |(uint32)((uint32) 0U << 25U)/*溢出错误*/ |(uint32)((uint32) 0U << 24U)/*奇偶校验错误*/ |(uint32)((uint32) 0U << 9U)//接收*/ |(uint32)((uint32) 0U << 8U)/*发送*/ |(uint32)((uint32) 0U << 1U)/*唤醒*/ |(uint32)((uint32) 0U << 0U);/*中断检测* /**-设置中断使能*/ SCI->SETINT =(uint32)((uint32) 0U <<26U)//帧错误 |(uint32)((uint32) 0U << 25U)/*溢出错误*/ |(uint32)((uint32) 0U << 24U)/*奇偶校验错误*/ |(uint32)((uint32) 1U <<9U)/*接收中断*/ |(uint32)((uint32) 0U << 1U)/*唤醒*/ |(uint32)((uint32) 0U << 0U);/*中断检测* /**-最终启动 SCI1 */ SCI->GCR1 |= 0x80U; }
为了测试外设、我只发送一组虚拟字节并检查是否执行了 ISR (因为我正在回送中工作)。
如果没有多缓冲器、我可以每发送一个字节就有一个中断、并且运行正常、因此中断可以很好地进行配置、但在多缓冲模式下、ISR 永远不会执行(尽管 ISR 是每隔8个字节才执行一次)。
是否可以在不使用 DMA 的情况下在 n 个字节后生成中断? 如果是、如何获取数据? SCIRD 寄存器仅为1字节长度、我不知道数据将在哪里可用。
谢谢、
Marco。