硬汉嵌入式论坛

 找回密码
 立即注册
查看: 130|回复: 5
收起左侧

[技术讨论] GD32F303的spi问题

[复制链接]

2

主题

1

回帖

7

积分

新手上路

积分
7
发表于 4 天前 | 显示全部楼层 |阅读模式
为什么spi0可以发送到spi1,而spi1发送不到spi0,
spi0为主机模式,spi1为从机模式


#include "gd32f30x.h"
#include "systick.h"


#define NUM    (10)
unsigned char spi0_send_array[NUM] = {0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA};
unsigned char spi1_send_array[NUM] = {0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA};

unsigned char spi0_receive_array[NUM] = {0,0,0,0,0,0,0,0,0,0};
unsigned char spi1_receive_array[NUM] = {0,0,0,0,0,0,0,0,0,0};

unsigned char send_cnt=0, receive_cnt=0,INT_I=0;


//void spi0_init();
//void spi1_init();


void spi0_init_MASTER()
{
        rcu_periph_clock_enable(RCU_GPIOA);
        rcu_periph_clock_enable(RCU_SPI0);
        rcu_periph_clock_enable(RCU_AF);
        
        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_parameter_struct spi0_parameter_struct;
        spi_i2s_deinit(SPI0);
        
        spi0_parameter_struct.device_mode = SPI_MASTER;//SPI_MASTER;//SPI_SLAVE
        spi0_parameter_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX;
        spi0_parameter_struct.frame_size = SPI_FRAMESIZE_8BIT;
        spi0_parameter_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE;
        spi0_parameter_struct.endian = SPI_ENDIAN_MSB;
        spi0_parameter_struct.nss = SPI_NSS_SOFT;
        spi0_parameter_struct.prescale = SPI_PSC_16;
        spi_init(SPI0, &spi0_parameter_struct);
        
        spi_enable(SPI0);
}

void spi1_init_SLAVE()
{
        rcu_periph_clock_enable(RCU_GPIOB);
        rcu_periph_clock_enable(RCU_SPI1);
        rcu_periph_clock_enable(RCU_AF);
        
        gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13 | GPIO_PIN_15);
        gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_14);

        
        spi_parameter_struct spi1_parameter_struct;
        spi_i2s_deinit(SPI1);
        
        spi1_parameter_struct.device_mode = SPI_SLAVE;
        spi1_parameter_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX;
        spi1_parameter_struct.frame_size = SPI_FRAMESIZE_8BIT;
        spi1_parameter_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE;
        spi1_parameter_struct.endian = SPI_ENDIAN_MSB;
        spi1_parameter_struct.nss = SPI_NSS_SOFT;
        spi_init(SPI1, &spi1_parameter_struct);
        
        spi_enable(SPI1);
}

int main(void)
{
        spi0_init_MASTER();
        spi1_init_SLAVE();
        systick_config();
        
        while(send_cnt < NUM)
                {
    // 从机先准备数据
    while(spi_i2s_flag_get(SPI1, SPI_FLAG_TBE) == RESET); // 等待从机发送缓冲区空
    spi_i2s_data_transmit(SPI1, spi1_send_array[send_cnt]); // 从机准备数据

    // 主机启动传输
    while(spi_i2s_flag_get(SPI0, SPI_FLAG_TBE) == RESET);
    spi_i2s_data_transmit(SPI0, spi0_send_array[send_cnt]);
   
    // 等待主机传输完成
    while(spi_i2s_flag_get(SPI0, SPI_FLAG_RBNE) == RESET);
    spi0_receive_array[receive_cnt] = spi_i2s_data_receive(SPI0);

    // 等待从机接收完成
    while(spi_i2s_flag_get(SPI1, SPI_FLAG_RBNE) == RESET);
    spi1_receive_array[receive_cnt] = spi_i2s_data_receive(SPI1);

    send_cnt++;
    receive_cnt++;
                }
        return 0;
}

下载 (2).png



回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116230
QQ
发表于 3 天前 | 显示全部楼层
当前SPI时钟速度多少,从机的速度至少要比主机低一倍,可以先试试1MHz的情况
回复

使用道具 举报

4

主题

100

回帖

112

积分

初级会员

积分
112
发表于 3 天前 | 显示全部楼层
时钟是SPI0提供的,你这样SPI1发送与接收的时候没有时钟,数据出不来的,使用DMA工作方式吧  
回复

使用道具 举报

4

主题

100

回帖

112

积分

初级会员

积分
112
发表于 3 天前 | 显示全部楼层
时钟是SPI0提供的,你这样SPI1发送与接收的时候没有时钟,数据出不来的,使用DMA工作方式吧  
回复

使用道具 举报

2

主题

1

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 3 天前 | 显示全部楼层
将从机引脚配置为:
gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_13 | GPIO_PIN_15);
gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_14);
就可以传输了,但是不知道原因
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116230
QQ
发表于 前天 10:13 | 显示全部楼层
zznl_zq 发表于 2025-6-7 11:43
将从机引脚配置为:
gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_13 | GPIO_PI ...

这个配置方式确实和stm32不太一样
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-10 23:32 , Processed in 0.253344 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表