工具/软件:Code Composer Studio
大家好、
我使用 USCI_A1 SPI 模块与从器件通信。 读取例程时出现问题。 我知道、要接收一个字节、主器件必须发送一个虚拟字节以使模块实际激活时钟。 发送例程成功、示波器监测到的信号表明从器件返回了一个字节。 但是从 UCA1RXBUF 中读取的数据总是0x00。 我不知道我的程序有什么问题。 因此、请帮助我查看以下代码、我希望您能告诉我哪里出错了。
//变量声明 静态结构{ bool bPortInUse; bool bNewDataReceived; unsigned int indexRx; unsigned int indexTx; unsigned int uiBytesToSend; uint8_t *pcRxBuffer; uint8_t * pcTxBuffer; }spiSM; //此函数用于从从站发送/接收数据 //rxBuf、txBuf:分别接收/发送数据的指针 // size:要接收/传输 的字节数 bool SPI_transaction (uint8_t* rxBuf、uint8_t* txBuf、uint16_uintt) spiSM.bNewDataReceived = false; spiSM.indexRx = 0; spiSM.indexTx = 0; spiSM.uiBytesToSend =大小; spiSM.pcRxBuffer = rxBuf; // pcRxBuffer 指向接收缓冲区 spiSM.pcTxBuffer = txBuf; // pcTxBuffer 指向发送缓冲区 SPI_EN; //SPI 被禁用(UCA1CTLW0 &=~UCSWRST) UCA1IE |= UCTXIE | UCRXIE; //中断被使能,但是中断标志仍然= 0,因为 GIE 没有被置位 执行{ //重置接收标志 spiSM.bNewDataReceived = false; //开始传输 TXBUF_Temp = spiSM.pcTxBuffer[spiSM.indexTx]; //在发送/接收中断标志发生前保持睡眠状态 _bis_SR_register (LPM3_bits|GIE); //移至下一个 TX 和 RX 索引 spiSM.indexTx++; spiSM.indexRx++; spiSM.uiBytesToSend--; } while (spiSM.uibtesToSend); //重复,直到接收所有所需的字节 SPI_DIIS; //SPI 被禁用(UCA1CTLW0 |= UCSWRST) 返回 true; } #pragma vector=USCI_A1_vector __interrupt void SPI_ISR (void){ if (UCRXIFG){ spiSM.pcRxBuffer[spiSM.indexRx]= UCA1RXBUF; spiSM.bNewDataReceived = true; UCA1IFG &=~UCRXIFG;//不确定是否编写此命令至关重要,但这与写入时一样重要 _BIC_SR_REGISTER_ON_EXIT (LPM4_BITS); } if (UCTXIFG){ UCA1TXBUF = TXBUF_Temp; UCA1IFG &=~UCTXIFG; _BIC_SR_REGISTER_ON_EXIT (LPM3_BIS|GIE); //最近刚添加 } }
这是在示波器上监控的信号。 在本例中、我想读取从器件的 FIFO 状态寄存器。 读取例程如下图所示、绿色为 MOSI、红色为 CLK、蓝色为 MISO。 它表明、在主器件发送命令代码后、从器件返回了一个数据#0 (在第二个8位时钟上)、但 UCA1RXBUF 返回0。
非常感谢您的支持、期待您的支持。

