直接配置SPI master的寄存器,发送数据正常,但接收不到数据,也无法产生RX中断.
未解决
YTM32B1M系列
-
由于一些原因,我需要手动配置寄存器来收发发送spi报文(本机做master):
一下是我写参照Spi_SyncTransmit写的发送并接收的函数:// 给data寄存器填入数据,即等于发送. uint32_t Spi_SendTxData(uint32_t spiIndex, uint32_t data) { SPI_Type* SpiBases[SPI_INSTANCE_COUNT] = SPI_BASE_ADDRS; volatile SPI_Type* BasePtr = SpiBases[spiIndex]; BasePtr->CTRL = 0x5; BasePtr->TXCFG = 0x2000017; BasePtr->CLK = 0xa; BasePtr->TXFIFO = 0x2000002; BasePtr->RXFIFO = 0x2000002; BasePtr->CTRL |= SPI_CTRL_EN_MASK; Spi_Lld_SetIntMode(BasePtr, SPI_RX_DATA_FLAG, TRUE); // 使能rx中断 BasePtr->DATA = data; // 延时 for(int i = 0; i < 1000; i++) {;} return BasePtr->DATA; // 接收数据: 此处一直是0 } // 中断处理 : 此中断进不来. void SPI0_IRQHandler(void) { SPI_Type* SpiBases[SPI_INSTANCE_COUNT] = SPI_BASE_ADDRS; volatile SPI_Type* BasePtr = SpiBases[0]; if (((BasePtr->STS >> SPI_RX_DATA_FLAG) & 1U) == 1) { g_readDa = BasePtr->DATA; } }逻辑分析仪上,可见SO是有数据的,见下图:

// 步进电机的spi管理接口. uint32_t Spi_SendCmdToStepMotor(uint32_t cmd) { // uint32_t data = cmd; // Spi_WriteIB(SpiConf_SpiChannel_SpiChannel_1, (const Spi_DataBufferType *)&data); // Spi_SyncTransmit(SpiConf_SpiChannel_SpiChannel_1); // uint32_t readData = 0; // Spi_ReadIB(SpiConf_SpiChannel_SpiChannel_1, (Spi_DataBufferType *)&readData); // return readData; return Spi_SendTxData(0, cmd); }用Spi_SyncTransmit接口(上面注释中的代码)是正常收发的, 用Spi_SendTxData收不到.
求助,Spi_SendTxData中该如何做才能收到MISO上传输的数据? -
这是一个薛定谔式的问题:
使用VSCODE+Coretex-Debug插件调试代码,会遇到如下情况:

断点进来的这一刻刻,在左边的watch界面可以看到DATA寄存器中有值;
但是执行113行后,retData是0;经过多次对比排查发现可能是如下原因:
DATA寄存器是FIFO的出口,读一次清一个. COUNT也会减少一次.
当断点执行到此处时,寄存器中的数据被左边的watch窗口读走了,等113行执行的时候,数据已经消失.如果在113行后面打断点,确保进断点的时候,retData = BasePtr->DATA; 这一行已经执行过,就可以看到retData中是有数据的.

快速上手云途开发生态
发帖前请查看
帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...