完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
您好,我在 LPSPI Slave 模块方面遇到问题,我想寻求帮助。这是使用 IMX1060 EVKB
我的目标:注册 SPI 传输结束(CS 空闲) 问题: 我期望传输一定长度(4 个字节),并且我发现可以乱序接收这些字节,因此我在缓冲区中看到的第一个字节不是来自传输端的 B0。如果 TX 正在运行和发送,并且我在发送期间启动,这通常会发生。 我想做的是检测 CS 线何时变高(传输完成)并在发生这种情况时重置我的字节数,这样如果我在某个时候未对齐,我可以轻松地与 TX 重新对齐。 我试图通过使用kLPSPI_TransferCompleteInterruptEnable标志来做到这一点。但是,该标志似乎从未设置过。有趣的是, kLPSPI_FrameCompleteFlag 确实设置了,即使我没有启用该中断标志。 我正在使用示例中的轻微修改代码初始化我的中断: LPSPI_SetFifoWatermarks(EXAMPLE_LPSPI_SLAVE_BASEADDR, txWatermark, g_slaveRxWatermark); LPSPI_Enable(EXAMPLE_LPSPI_SLAVE_BASEADDR, false); EXAMPLE_LPSPI_SLAVE_BASEADDR->CFGR1 &= (~LPSPI_CFGR1_NOSTALL_MASK); LPSPI_Enable(EXAMPLE_LPSPI_SLAVE_BASEADDR, true); /*Flush FIFO , clear status , disable all the interrupts.*/ LPSPI_FlushFifo(EXAMPLE_LPSPI_SLAVE_BASEADDR, true, true); LPSPI_ClearStatusFlags(EXAMPLE_LPSPI_SLAVE_BASEADDR, kLPSPI_AllStatusFlag); LPSPI_DisableInterrupts(EXAMPLE_LPSPI_SLAVE_BASEADDR, kLPSPI_AllInterruptEnable); LPSPI_SelectTransferPCS(EXAMPLE_LPSPI_SLAVE_BASEADDR, whichPcs); LPSPI_EnableInterrupts(EXAMPLE_LPSPI_SLAVE_BASEADDR, kLPSPI_RxInterruptEnable | kLPSPI_TransferCompleteInterruptEnable ); 我的 IRQ 处理程序是: void LPSPI_Slave_IRQ_Handler(void) { uint32_t status_flags = LPSPI_GetStatusFlags(EXAMPLE_LPSPI_SLAVE_BASEADDR); if (slaveRxCount < TRANSFER_SIZE && ((status_flags & (uint32_t)kLPSPI_RxDataReadyFlag) != 0U ) ) { LPSPI_ClearStatusFlags( EXAMPLE_LPSPI_SLAVE_BASEADDR, kLPSPI_RxDataReadyFlag ); /* While reading out the RX FIFO as more data may be coming into the RX FIFO. We'll * re-enable the interrupts after reading out the FIFO. */ while (LPSPI_GetRxFifoCount(EXAMPLE_LPSPI_SLAVE_BASEADDR)) { slaveRxData[slaveRxCount] = LPSPI_ReadData(EXAMPLE_LPSPI_SLAVE_BASEADDR); if(slaveRxCount == 0 ){ data_is_for_us = ParseFirstByte(slaveRxData[0] ); } slaveRxCount++; if (slaveRxCount == TRANSFER_SIZE) { //We will assume that our slave data matches our desired Xfer size in the interest of speed if(data_is_for_us){ Parse_SPI_Data(slaveRxData); //now parts the data } slaveRxCount = 0; isSlaveTransferCompleted = true; // LPSPI_DisableInterrupts(EXAMPLE_LPSPI_SLAVE_BASEADDR, kLPSPI_RxInterruptEnable); break; } } } //kLPSPI_TransferCompleteFlag //check if the frame complete flag has thrown. This does fire when uncommented // if ((status_flags & (uint32_t)kLPSPI_FrameCompleteFlag) != 0U) { // //if the frame is complete, we reset our slaveRxCount // slaveRxCount = 0; // TODO get this working properly // LPSPI_ClearStatusFlags( EXAMPLE_LPSPI_SLAVE_BASEADDR, kLPSPI_FrameCompleteFlag ); // } if ((status_flags & (uint32_t)kLPSPI_TransferCompleteFlag) != 0U) { //if the frame is complete, we reset our slaveRxCount slaveRxCount = 0; // TODO get this working properly LPSPI_ClearStatusFlags( EXAMPLE_LPSPI_SLAVE_BASEADDR, kLPSPI_TransferCompleteFlag ); } SDK_ISR_EXIT_BARRIER; }所以我的问题是: 当 CS 线变高/空闲时,我应该期待什么信号?FrameComplete 似乎真的只是检查 8 个 8 位帧是否已经到达,这对我来说并不是很有用。但是,我不知道 TransferComplete 是否对应于 CS 线路空闲,或者其他什么。 |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
1934个成员聚集在这个小组
加入小组我的项目我做主,使用GN+Ninja来完成构建系统(VSCode开发RT106X)
36421 浏览 0 评论
NXP IMX8应用处理器快速入门必备:技巧、使用、设计指南
4909 浏览 1 评论
6109 浏览 1 评论
6819 浏览 0 评论
NXP i.MX6UL开发板(linux系统烧录+规格+硬件+模块移植)使用手册
4249 浏览 0 评论
649浏览 2评论
求助,S32G上Core M启动后如何让Core A在Flash指定位置加载uboot?
644浏览 2评论
ESP32-WROVER-IE + LAN8720以太网,GPIO0电压只有1.6v,无法正常进入spi flash boot模式如何解决?
646浏览 2评论
求分享适用于PN7160 Android的NFC工厂测试应用程序
730浏览 2评论
845浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 21:01 , Processed in 1.026951 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号