我的应用程序需要在从属模式下通过 LPSPI 端口从外部 A/D 转换器接收数据。A/D 转换器将 LPSPI2 的 PCS0 驱动为低电平,并使用 SCK 和 SIN 将数据计时到 RT1176。不会使用 RT1176 SOUT。所有 GPIO 引脚都已使用,因此我无法为 SOUT 分配引脚。我希望我可以在输入 SIN 并通过 CFGR1[PINCFG] 输出的情况下使用半双工,但为了避免争用,我不希望 SIN 在输出方向上。
有人可以确认我可以通过设置 TCR 中的 TXMSK 位强制 SIN 始终为半双工模式的输入吗?
我已经多次阅读 RT1170 参考手册中的第 70 章 LPSPI 部分。我花了一段时间才意识到,在使用半双工模式时,TXMSK=1 使 SIN 保持在输入方向。如果我有这个错误,请告诉我。
如果有描述 LPSPI 半双工如何工作的应用说明,也请告诉我。
// LPSPI SIN 引脚,该引脚必须始终为输入。切勿在其数据 LPSPI 连接上传输
// 到 ADC。
slaveConfig.pinCfg = kLPSPI_SdiInSdiOut; // 我们不会输出任何东西
slaveConfig.dataOutConfig = kLpspiDataOutTristate; // 三态数据输出
// 初始化 LPSPI 从接口。
// 请注意,slaveConfig.whichPcs 中的 PCS#(外设片选)
// 仅用于配置极性。PCS# 选择
// 必须在下面单独完成。
LPSPI_SlaveInit (ADC_DATA_LPSPI_SLAVE_BASEADDR, &slaveConfig);
//清除缓冲区以在 ISR 中通过 LPSPI 接收 ADC 数据。
for (unsigned i = 0; i < SLAVE_RX_DATA_MAX; i++) {
_slaveRxData = 0;
}
// 设置 Receiver FIFO water mark 以便 LPSPI 仅在有完整数据包时中断。
// 有关详细信息,请参阅 LPSPI2_IRQHandler() 顶部的注释。
#define ADC_DATA_RECEIVE_WATERMARK (16-1) // 当有 16 个字节时中断。即大于15.
LPSPI_SetFifoWatermarks(ADC_DATA_LPSPI_SLAVE_BASEADDR, 0, ADC_DATA_RECEIVE_WATERMARK);
// 当 xmit FIFO 为空时禁用 LPSPI“停止传输”以防止传输 FIFO 欠载错误。
// 注意这可能是 N/A,因为在从属模式下运行,但是 NXP 的从属演示代码
// 接收是这样做的,所以现在复制它。
LPSPI_Enable(ADC_DATA_LPSPI_SLAVE_BASEADDR, false);
ADC_DATA_LPSPI_SLAVE_BASEADDR->CFGR1 &= (~LPSPI_CFGR1_NOSTALL_MASK);
LPSPI_Enable(ADC_DATA_LPSPI_SLAVE_BASEADDR,真);
//刷新 FIFO,清除状态,禁用所有 LPSPIx 中断。
LPSPI_FlushFifo(ADC_DATA_LPSPI_SLAVE_BASEADDR,真,真);
LPSPI_ClearStatusFlags(ADC_DATA_LPSPI_SLAVE_BASEADDR,kLPSPI_AllStatusFlag);
LPSPI_DisableInterrupts(ADC_DATA_LPSPI_SLAVE_BASEADDR,kLPSPI_AllInterruptEnable);
// 选择数据准备就绪时 ADC 将驱动为低电平(及其 ODR 输出)的 PCS#。
LPSPI_SelectTransferPCS(ADC_DATA_LPSPI_SLAVE_BASEADDR, ADC_DATA_LPSPI_SLAVE_PCS);
// 设置为半双工,因此可以将通常作为 SDO 输出的 GPIO
// 用于其他目的。仅从 ADC 接收。需要禁用传输方向。
ADC_DATA_LPSPI_SLAVE_BASEADDR->TCR |= LPSPI_TCR_TXMSK_MASK;
// 为 LPSPI 外设启用 NVIC(嵌套向量中断控制器)。
启用IRQ(ADC_DATA_LPSPI_SLAVE_IRQN);
// TCR 也共享 FIFO,因此在启用中断之前等待 TCR 写入。
而 (LPSPI_GetTxFifoCount(ADC_DATA_LPSPI_SLAVE_BASEADDR) != 0) {
;
}
//启用帧完成和接收中断。
LPSPI_EnableInterrupts(ADC_DATA_LPSPI_SLAVE_BASEADDR, (kLPSPI_FrameCompleteInterruptEnable | kLPSPI_RxInterruptEnable));