打印
[技术问答]

HC32F451 SPI不能正常工作。

[复制链接]
1669|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jjl3|  楼主 | 2024-3-3 10:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
把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数 ...

很好的问题解决方法

使用特权

评论回复
5
xdvca| | 2024-7-31 22:36 | 只看该作者
检查使能 SPI 的方法是否正确。如果 SPI_Cmd(SPI_UNIT, ENABLE); 无法使能 SPI 模块,尝试用直接写寄存器的方式。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

265

帖子

2

粉丝