打印

GD32F103 SPI0问题

[复制链接]
6191|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
rainsyeah|  楼主 | 2021-4-26 13:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
将STM32代码直接下载进去 运行没有问题
用GD的固件 重新 把驱动弄了一遍  SPI 怎么都不**在读数据这里

        spi_parameter_struct spi_init_struct;

        rcu_periph_clock_enable(RCU_GPIOA);        // 开 GPIOA 时钟
        rcu_periph_clock_enable(RCU_AF);
        rcu_periph_clock_enable(RCU_SPI0);// 开启 SPI 时钟       
       
        /* 配置 SPI引脚SCK、MISO 和 MOSI为复用推挽模式 */
        gpio_pin_remap_config(GPIO_SPI0_REMAP,ENABLE);
        gpio_init(GPIOA,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_5 | GPIO_PIN_7);
        gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
       
        spi_i2s_deinit(SPI0);
       
    spi_struct_para_init(&spi_init_struct);

    /* SPI0 parameter config */
    spi_init_struct.trans_mode           = SPI_TRANSMODE_FULLDUPLEX;
    spi_init_struct.device_mode          = SPI_MASTER;
    spi_init_struct.frame_size           = SPI_FRAMESIZE_16BIT;
    spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE;
    spi_init_struct.nss                  = SPI_NSS_SOFT;
    spi_init_struct.prescale             = SPI_PSC_8;
    spi_init_struct.endian               = SPI_ENDIAN_MSB;
    spi_init(SPI0, &spi_init_struct);


        spi_nss_internal_high(SPI0);

        spi_enable(SPI0); /* 使能SPI  */



卡在下面的读数据
        /* 等待发送缓冲区空 */
        while(spi_i2s_flag_get(SPI0, SPI_FLAG_TBE) == RESET);

        /* 发送一个字节 */
        spi_i2s_data_transmit(SPI0, byte);

        /* 等待数据接收完毕 */
        while(spi_i2s_flag_get(SPI0, SPI_FLAG_RBNE) == RESET);

        /* 读取接收到的数据 */
        return (uint16_t)spi_i2s_data_receive(SPI0);


代码直接复制的官方例子, 示波器打SCK  没有输出

使用特权

评论回复
沙发
rainsyeah|  楼主 | 2021-4-26 13:34 | 只看该作者
本帖最后由 rainsyeah 于 2021-4-26 13:36 编辑

有没有遇到这问题的  费解  

使用特权

评论回复
板凳
sonicll| | 2021-4-26 13:42 | 只看该作者
gpio_pin_remap_config(GPIO_SPI0_REMAP,ENABLE);
把这句删掉,不需要开remap

使用特权

评论回复
地板
rainsyeah|  楼主 | 2021-4-26 13:54 | 只看该作者
sonicll 发表于 2021-4-26 13:42
gpio_pin_remap_config(GPIO_SPI0_REMAP,ENABLE);
把这句删掉,不需要开remap

删掉了 一样了 也是 卡在 while(spi_i2s_flag_get(SPI0, SPI_FLAG_RBNE) == RESET);

使用特权

评论回复
5
风来吴山| | 2021-4-26 14:19 | 只看该作者
我用的SPI1
GPIO:
rcu_periph_clock_enable(RCU_GPIOB);

rcu_periph_clock_enable(RCU_AF);
gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13);          // SCLK
gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_15);          // MOSI
gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_14);    // MISO
gpio_init(GPIOB, GPIO_MODE_OUT_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_12);         // SF CS

SPI:
spi_parameter_struct spi_init_struct;
rcu_periph_clock_enable(RCU_SPI1);
spi_i2s_deinit(SPI1);
spi_struct_para_init(&spi_init_struct);
spi_init_struct.trans_mode           = SPI_TRANSMODE_FULLDUPLEX;
spi_init_struct.device_mode          = SPI_MASTER;
spi_init_struct.frame_size           = SPI_FRAMESIZE_8BIT;
spi_init_struct.clock_polarity_phase = SPI_CK_PL_HIGH_PH_2EDGE;
spi_init_struct.nss                  = SPI_NSS_SOFT;

spi_init_struct.prescale             = SPI_PSC_8;
spi_init_struct.endian               = SPI_ENDIAN_MSB;
spi_init(SPI1, &spi_init_struct);
spi_enable(SPI1);
最后读写函数
uint32_t dac60096_spi_write(uint8_t *__data, uint8_t len)
{
    uint32_t temp = 0;
    uint8_t  rx_array[3] = {0};
    gpio_bit_reset(GPIOB, GPIO_PIN_12);
    for (size_t i = 0; i < len; i++)
    {
        while(RESET == spi_i2s_flag_get(SPI1, SPI_FLAG_TBE));
        spi_i2s_data_transmit(SPI1, __data[i]);
        while(RESET == spi_i2s_flag_get(SPI1, SPI_FLAG_RBNE));
        rx_array = spi_i2s_data_receive(SPI1);
    }
    gpio_bit_set(GPIOB, GPIO_PIN_12);
    temp = rx_array[0] << 16 | rx_array[1] << 8 | rx_array[2];
    return temp;
}










使用特权

评论回复
6
红圆飞雪| | 2021-9-6 21:56 | 只看该作者
rainsyeah 发表于 2021-4-26 13:54
删掉了 一样了 也是 卡在 while(spi_i2s_flag_get(SPI0, SPI_FLAG_RBNE) == RESET);

你的问题,最后解决了么?

使用特权

评论回复
7
呐咯密密| | 2021-9-9 12:25 | 只看该作者
有两个问题啊,MISO,MOSI,CLK应该都设置为复用模式,然后你的NSS引脚是软件模式,那你初始化没有,另外你用软件NSS,spi_nss_internal_high(SPI0);这行代码就可以取消了,还有,软件NSS,你在发送数据之前根本没操作NSS啊,都没使能,怎么会有时钟信号呢

使用特权

评论回复
8
guijial511| | 2021-9-13 20:43 | 只看该作者
说明给改对啊

使用特权

评论回复
9
明明很讨厌| | 2021-10-16 15:47 | 只看该作者
答案在视频里。
B站:https://www.bilibili.com/video/BV1oR4y1E7vz?from=search&seid=2087342363625393811&spm_id_from=333.337.0.0

使用特权

评论回复
10
lidi911| | 2021-10-18 08:14 | 只看该作者
GD和ST的库操作有区别的

使用特权

评论回复
11
carbonxie| | 2022-5-6 11:24 | 只看该作者
明明很讨厌 发表于 2021-10-16 15:47
答案在视频里。
B站:https://www.bilibili.com/video/BV1oR4y1E7vz?from=search&seid=2087342363625393811 ...

void init_spiConfig(void)
{
        spi_parameter_struct spi_init_struct;

        {
            // SPI0 GPIO config: SCK/PB3, MISO/PB4, MOSI/PB5
            gpio_af_set(GPIOB, GPIO_AF_0, GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5);
            gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5);
            gpio_output_options_set(GPIOB,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5);
        }
       
        {
                rcu_periph_clock_enable(RCU_SPI0);
            // SPI0 parameter config
            spi_init_struct.trans_mode           = SPI_TRANSMODE_FULLDUPLEX;
            spi_init_struct.device_mode          = SPI_MASTER;
            spi_init_struct.frame_size           = SPI_FRAMESIZE_16BIT;
            spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_2EDGE;
            spi_init_struct.nss                  = SPI_NSS_SOFT;
            spi_init_struct.prescale             = SPI_PSC_64;
            spi_init_struct.endian               = SPI_ENDIAN_MSB;
            spi_init(SPI0, &spi_init_struct);
               
            spi_enable(SPI0);
        }
}
GD32F330C8,用SPI0,为什么明明设定定是16位的数据,可是只发送了8位?

使用特权

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

本版积分规则

3

主题

13

帖子

2

粉丝