tayouxunmeng 发表于 2021-7-9 14:11

HC32F460 SPI

HC32F460 SPI用作从设备接收数据,为什么只能进一次中断,请大佬们帮我看下程序

static void Spi_Config(void)
{
    stc_spi_init_t stcSpiInit;
    stc_irq_regi_conf_t stcIrqRegiConf;
    /* configuration structure initialization */
    MEM_ZERO_STRUCT(stcSpiInit);
    MEM_ZERO_STRUCT(stcIrqRegiConf);

    /* Configuration peripheral clock */
    PWC_Fcg1PeriphClockCmd(SPI_UNIT_CLOCK, Enable);

    /* Configuration SPI pin */
    PORT_SetFunc(SPI_SCK_PORT, SPI_SCK_PIN, SPI_SCK_FUNC, Disable);
    PORT_SetFunc(SPI_NSS_PORT, SPI_NSS_PIN, SPI_NSS_FUNC, Disable);
    PORT_SetFunc(SPI_MOSI_PORT, SPI_MOSI_PIN, SPI_MOSI_FUNC, Disable);
//    PORT_SetFunc(SPI_MISO_PORT, SPI_MISO_PIN, SPI_MISO_FUNC, Disable);

    /* Configuration SPI structure */
    stcSpiInit.enClkDiv = SpiClkDiv2;
    stcSpiInit.enFrameNumber = SpiFrameNumber1;
    stcSpiInit.enDataLength = SpiDataLengthBit8;
    stcSpiInit.enFirstBitPosition = SpiFirstBitPositionMSB;
    stcSpiInit.enSckPolarity = SpiSckIdleLevelLow;
    stcSpiInit.enSckPhase = SpiSckOddSampleEvenChange;
    stcSpiInit.enReadBufferObject = SpiReadReceiverBuffer;
    stcSpiInit.enWorkMode = SpiWorkMode4Line;
    stcSpiInit.enTransMode = SpiTransFullDuplex;
    stcSpiInit.enCommAutoSuspendEn = Disable;
    stcSpiInit.enModeFaultErrorDetectEn = Disable;
    stcSpiInit.enParitySelfDetectEn = Disable;
    stcSpiInit.enParityEn = Disable;
    stcSpiInit.enParity = SpiParityEven;

//#ifdef SPI_MASTER_MODE
//    stcSpiInit.enMasterSlaveMode = SpiModeMaster;
//    stcSpiInit.stcDelayConfig.enSsSetupDelayOption = SpiSsSetupDelayCustomValue;
//    stcSpiInit.stcDelayConfig.enSsSetupDelayTime = SpiSsSetupDelaySck1;
//    stcSpiInit.stcDelayConfig.enSsHoldDelayOption = SpiSsHoldDelayCustomValue;
//    stcSpiInit.stcDelayConfig.enSsHoldDelayTime = SpiSsHoldDelaySck1;
//    stcSpiInit.stcDelayConfig.enSsIntervalTimeOption = SpiSsIntervalCustomValue;
//    stcSpiInit.stcDelayConfig.enSsIntervalTime = SpiSsIntervalSck6PlusPck2;
//    stcSpiInit.stcSsConfig.enSsValidBit = SpiSsValidChannel0;
//    stcSpiInit.stcSsConfig.enSs0Polarity = SpiSsLowValid;
//#endif

#ifdef SPI_SLAVE_MODE
    stcSpiInit.enMasterSlaveMode = SpiModeSlave;
    stcSpiInit.stcSsConfig.enSsValidBit = SpiSsValidChannel0;
    stcSpiInit.stcSsConfig.enSs0Polarity = SpiSsLowValid;
#endif
    SPI_Init(SPI_UNIT, &stcSpiInit);
   
   /* SPI1 rx interrupt */
    stcIrqRegiConf.enIntSrc = SPI_RX_INT_SOURCE;
    stcIrqRegiConf.enIRQn = Int006_IRQn;
    stcIrqRegiConf.pfnCallback = &SpiRx_IrqCallback;
    /* Registration IRQ */
//    enIrqResign(Int006_IRQn);
    enIrqRegistration(&stcIrqRegiConf);
    NVIC_ClearPendingIRQ(stcIrqRegiConf.enIRQn);
    NVIC_SetPriority(stcIrqRegiConf.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
    NVIC_EnableIRQ(stcIrqRegiConf.enIRQn);
}

static void SpiRx_IrqCallback(void)
{
    if (u8RxIndex < u16BufferLen)
    {
      u8RxBuffer = SPI_ReceiveData8(SPI_UNIT);
    }
    else
    {
      SPI_IrqCmd(SPI_UNIT, SpiIrqReceive, Disable);
    }
   
}

int32_t main(void)
{
    /* BSP initialization */
    BSP_CLK_Init();
    BSP_GPIO_Init();
    Spi_Config();
    /* Get tx buffer length */
    Spi_DmaConfig();

    while (1)
    {      

      
      SPI_IrqCmd(SPI_UNIT, SpiIrqReceive, Enable);
      SPI_Cmd(SPI_UNIT, Enable);
         while (u8RxIndex < u16BufferLen)
      {
      }
      SPI_IrqCmd(SPI_UNIT, SpiIrqReceive, Disable);
      SPI_Cmd(SPI_UNIT, Disable);
    }
}

martinhu 发表于 2021-7-9 17:02

是不是报欠载错误了,做从机接收的时候,每次在主机信号来之前,需要先写好发送的数据,不然就会报欠载错误。SPI不是UART,只接收不发送是不行的


tayouxunmeng 发表于 2021-7-9 18:08

martinhu 发表于 2021-7-9 17:02
是不是报欠载错误了,做从机接收的时候,每次在主机信号来之前,需要先写好发送的数据,不然就会报欠载错误 ...

我在网上查的,SPI作从机好像可以只接收数据,MISO引脚悬空处理,怎么让它只接收数据呢?

zhengshuai888 发表于 2021-7-9 20:23

没有清中断标志位?

tayouxunmeng 发表于 2021-7-10 11:30

另外,请问HC32F460的SPI模块可以不使用MISO引脚,只做从设备,单向接收数据吗?

martinhu 发表于 2021-7-12 09:02

tayouxunmeng 发表于 2021-7-10 11:30
另外,请问HC32F460的SPI模块可以不使用MISO引脚,只做从设备,单向接收数据吗? ...

建议楼主先打好基础,再看看SPI的标准协议!!!

tayouxunmeng 发表于 2021-7-12 09:10

tayouxunmeng 发表于 2021-7-9 18:08
我在网上查的,SPI作从机好像可以只接收数据,MISO引脚悬空处理,怎么让它只接收数据呢? ...

不好意思啊,我之前很少用spi,我现在想用clk、cs、MOSI这3根线实现spi单向接收,但一直没成功
页: [1]
查看完整版本: HC32F460 SPI