打印

GD32 spi的半双工通信异常,接收的数据一直有问题

[复制链接]
2291|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ZLN4EVER|  楼主 | 2024-3-25 18:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

下面是初始化和发送函数,难道GD的库要在发送和接收时分别切换一次模式,切换发送和接收模式。

#define CURRENT_SPI     SPI1
#define READ_MODE   spi_disable(CURRENT_SPI); \
                    spi_bidirectional_transfer_config(CURRENT_SPI, SPI_BIDIRECTIONAL_RECEIVE); \
                    spi_enable(CURRENT_SPI);
#define WRITE_MODE  spi_disable(CURRENT_SPI); \
                    spi_bidirectional_transfer_config(CURRENT_SPI, SPI_BIDIRECTIONAL_TRANSMIT); \
                    spi_enable(CURRENT_SPI);

void spi_config(void)
{
       
        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 | GPIO_PIN_15);//MOSI 和 CLK

        //gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_6);

        gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_12);//片选引脚cs
        rcu_periph_clock_enable(RCU_SPI1);

       
        spi_i2s_deinit(CURRENT_SPI);   
        spi_struct_para_init(&spi2);                // 初始化spi_init_struct结构体,设置默认参数       
        spi2.device_mode = SPI_MASTER;
        spi2.trans_mode  = SPI_TRANSMODE_BDTRANSMIT;
        spi2.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE;
        spi2.frame_size = SPI_FRAMESIZE_8BIT;
        spi2.nss = SPI_NSS_SOFT;
        spi2.prescale = SPI_PSC_64;
        spi2.endian = SPI_ENDIAN_MSB;
        spi_init(CURRENT_SPI, &spi2);        // 使用配置好的spi2结构体初始化SPI2
         
    spi_crc_polynomial_set(CURRENT_SPI, 10);

    spi_crc_on(CURRENT_SPI);
        spi_enable(CURRENT_SPI);
        //spi_nss_output_enable(CURRENT_SPI);
       
}

void Well_Hal_spi_write_byte(uint8_t btye)
{
//        SPI_I2S_SendData(&hspi2,&btye,1,1000);

        while (spi_i2s_flag_get(CURRENT_SPI, SPI_FLAG_TBE) == RESET);       
        spi_i2s_data_transmit(CURRENT_SPI, btye);
        while(spi_i2s_flag_get(CURRENT_SPI, SPI_FLAG_TRANS));


}

使用特权

评论回复
沙发
理想阳| | 2024-3-26 16:31 | 只看该作者
SPI正常发送时就同时接收,没什么模式切换一说吧,

使用特权

评论回复
板凳
呐咯密密| | 2024-3-28 10:29 | 只看该作者
发送的同时就会接受,不存在切换的问题

使用特权

评论回复
地板
b5z1giu| | 2024-5-17 13:55 | 只看该作者
你说的接收有问题,是什么问题?

使用特权

评论回复
5
g0d5xs| | 2024-5-17 15:04 | 只看该作者
时钟极性(CPOL)和时钟相位(CPHA)设置错误会出现问题

使用特权

评论回复
6
ex7s4| | 2024-5-17 16:13 | 只看该作者
其实SPI通信需要确保主设备和从设备的时钟极性和相位设置一致。请检查主设备和从设备的CPOL和CPHA设置是否匹配。如果设置不正确,可能导致数据接收错误

使用特权

评论回复
7
y1n9an| | 2024-5-17 17:18 | 只看该作者
你可以使用逻辑分析仪抓波形啊,看看数据都是啥

使用特权

评论回复
8
w2nme1ai7| | 2024-5-17 18:22 | 只看该作者
SPI通信中,数据位的传输顺序可以是最高位先传输(MSB First)或最低位先传输(LSB First)

使用特权

评论回复
9
q1d0mnx| | 2024-5-17 19:31 | 只看该作者
建议楼主最好保证主设备和从设备的数据位顺序设置一致,否则会导致数据接收错误

使用特权

评论回复
10
kaif2n9j| | 2024-5-17 19:46 | 只看该作者
SPI通信的时钟速度需要根据从设备的规格要求进行设置。如果时钟速度设置过快,从设备可能无法正确接收数据

使用特权

评论回复
11
kaif2n9j| | 2024-5-18 07:35 | 只看该作者
一般是检查时钟速度设置是否符合从设备的要求

使用特权

评论回复
12
su1yirg| | 2024-5-18 10:07 | 只看该作者
建议,在半双工通信中,主设备发送数据的同时,从设备也会发送数据。如果主设备没有及时读取从设备发送的数据,可能会导致数据缓冲区溢出,从而影响后续数据的接收。请确保主设备及时读取从设备发送的数据

使用特权

评论回复
13
cen9ce| | 2024-5-18 11:24 | 只看该作者
检查SPI接口的电气连接是否正确,包括时钟线、数据线和片选线等。确保连接稳定可靠,没有松动或接触不良的情况

使用特权

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

本版积分规则

1

主题

2

帖子

0

粉丝