搜索

[技术问答] HC32F460 SPI

[复制链接]
3829|7
手机看帖
扫描二维码
随时随地手机跟帖
tayouxunmeng|  楼主 | 2021-7-9 14:11 | 显示全部楼层 |阅读模式
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[u8RxIndex++] = 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,只接收不发送是不行的
2977960e810664622f.png

使用特权

评论回复
tayouxunmeng|  楼主 | 2021-7-9 18:08 | 显示全部楼层
martinhu 发表于 2021-7-9 17:02
是不是报欠载错误了,做从机接收的时候,每次在主机信号来之前,需要先写好发送的数据,不然就会报欠载错误 ...

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

使用特权

评论回复

评论

martinhu 2021-7-12 09:01 回复TA
谁说SPI做从机只能发送数据了????你之前用过SPI么? 不管悬空不悬空,每发送一个字节之前,在主机时钟到来之前,都要先写数据到发送寄存器啊. 
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 火星国务卿 得到打赏 ¥383.00
  • 2 呐咯密密 得到打赏 ¥365.00
  • 3 kk的回忆 得到打赏 ¥360.01
  • 4 Gavin3389 得到打赏 ¥301.00
  • 5 jinglixixi 得到打赏 ¥220.00
  • 6 小叶三千 得到打赏 ¥200.00
  • 7 神圣雅诗人 得到打赏 ¥200.00
  • 8 qjp1988113 得到打赏 ¥106.00
  • 9 linghz 得到打赏 ¥100.00
  • 10 xyz549040622 得到打赏 ¥100.00
在线客服 快速回复 返回顶部 返回列表