jjl3 发表于 2024-3-3 10:34

HC32F451 SPI不能正常工作。

把SPI3配置成3线从模式,只进行发送,不能使能SPI3,甚至直接写CR1寄存器都不能使能。

配置如下:

static void SPI_Config(void)
{
    stc_spi_init_t stcSpiInit;
    stc_irq_signin_config_t stcIrqSignConfig;

    /* Configure Port */
    GPIO_SetFunc(SPI_SCK_PORT,SPI_SCK_PIN,SPI_SCK_FUNC);
    GPIO_SetFunc(SPI_MISO_PORT, SPI_MISO_PIN, SPI_MISO_FUNC);

    /* Configuration SPI */
    FCG_Fcg1PeriphClockCmd(SPI_CLK, ENABLE);
    SPI_StructInit(&stcSpiInit);
    stcSpiInit.u32WireMode          = SPI_3_WIRE;
    stcSpiInit.u32TransMode         = SPI_SEND_ONLY;
    stcSpiInit.u32MasterSlave       = SPI_SLAVE;
    stcSpiInit.u32Parity            = SPI_PARITY_INVD;
    stcSpiInit.u32SpiMode         = SPI_MD_3;
    stcSpiInit.u32BaudRatePrescaler = SPI_BR_CLK_DIV8;
    stcSpiInit.u32DataBits          = SPI_DATA_SIZE_32BIT;
    stcSpiInit.u32FirstBit          = SPI_FIRST_MSB;
    stcSpiInit.u32FrameLevel      = SPI_1_FRAME;
    (void)SPI_Init(SPI_UNIT, &stcSpiInit);
}

在IAR中单步调试,发现用库函数SPI_Cmd(SPI_UNIT, ENABLE); 不能使能SPI, CR1总是为0x03
换成直接写寄存器命令
    *(uint32_t *)0x40020004 = 0x00000043;
CR1仍然是0x03.
真的让人奔溃!

wubangmi 发表于 2024-3-4 08:54

给你个思路,你先按第一种方法操作,还不行的话再操作第二种:
第一种:单独重建一个IAR工程
第二种:在第一种还无效的情况下换一个最新的hc32f451.svd文件

jjl3 发表于 2024-3-4 13:36

发现问题了,是因为MODFERF置位了,所以不能使能SPI了。
现在问题是,3线同步模式,只发送,主机发的SCK数远小于32bits, 我需要MISO发出相应的bit, 当sck停止后就清除发送寄存器,写入新数据.这样怎样实现呀

LOVEEVER 发表于 2024-3-27 12:50

jjl3 发表于 2024-3-4 13:36
发现问题了,是因为MODFERF置位了,所以不能使能SPI了。
现在问题是,3线同步模式,只发送,主机发的SCK数 ...

很好的问题解决方法

xdvca 发表于 2024-7-31 22:36

检查使能 SPI 的方法是否正确。如果 SPI_Cmd(SPI_UNIT, ENABLE); 无法使能 SPI 模块,尝试用直接写寄存器的方式。
页: [1]
查看完整版本: HC32F451 SPI不能正常工作。