m0_61687425 2023-09-13 12:23 采纳率: 0%
浏览 29
已结题

如何在使用GD32450V-START的SPI进行主从操作时,从机接收到的数据全是FF?

在使用GD32450V-START的SPI进行主从操作时,从机接收到的数据全是FF,不知道是哪里出了问题。

#include <stdio.h>
#include "gd32f4xx.h"
#include "systick.h"
#include "gd32f4xx_it.h"
#include "gd32f450v_start.h"

void USART1_Config(void);
void SPI_MasterInit(void);
void SPI_SlaverInit(void);
void SPI_MasterSlaveFullduplex(void);

int main(){

    systick_config();
    USART1_Config();
    SPI_MasterInit();
    SPI_SlaverInit();
    
    while(1){
        SPI_MasterSlaveFullduplex();
    }
}

void USART1_Config(void)
{
       rcu_periph_clock_enable (RCU_GPIOA);
    rcu_periph_clock_enable (RCU_USART1);
    
    /* connect port to USART1_Tx */
    gpio_af_set(GPIOA, GPIO_AF_7, GPIO_PIN_2);
    
    /* connect port to USART1_Rx */
    gpio_af_set(GPIOA, GPIO_AF_7, GPIO_PIN_3);
    
    /* configure USART Tx as alternate function push-pull */
    gpio_mode_set (GPIOA,GPIO_MODE_AF, GPIO_PUPD_PULLUP ,GPIO_PIN_2);
    gpio_output_options_set (GPIOA, GPIO_OTYPE_PP , GPIO_OSPEED_50MHZ , GPIO_PIN_2);
    
    /* configure USART Rx as alternate function push-pull */
    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP ,GPIO_PIN_3);
    usart_deinit(USART1);
    usart_baudrate_set (USART1 , 9600U);
    usart_word_length_set (USART1 , 8);
    usart_stop_bit_set (USART1, USART_STB_1BIT);
    usart_parity_config (USART1, USART_PM_NONE);
    usart_hardware_flow_rts_config(USART1,USART_RTS_DISABLE);
    
    usart_transmit_config(USART1,USART_TRANSMIT_ENABLE);
    usart_receive_config(USART1,USART_RECEIVE_ENABLE);
    usart_enable(USART1); 
}

void SPI_MasterInit(void){

    spi_parameter_struct spi_init_struct = {0};
    spi_struct_para_init(&spi_init_struct);

    /*初始化时钟 */
    rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_SPI0);
    
    /* A7:    MOSI; A4:NSS; A5:SCK */
    gpio_af_set    (GPIOA,GPIO_AF_5,GPIO_PIN_7);
    gpio_af_set    (GPIOA,GPIO_AF_5,GPIO_PIN_4);
    gpio_af_set    (GPIOA,GPIO_AF_5,GPIO_PIN_5);
    
    /* SPI0 GPIO_OUTPUT_SET */
    gpio_mode_set (GPIOA,GPIO_MODE_AF,GPIO_PUPD_NONE,GPIO_PIN_7);
    gpio_output_options_set(GPIOA,GPIO_OTYPE_PP ,GPIO_OSPEED_25MHZ,GPIO_PIN_7);
    
    gpio_mode_set (GPIOA,GPIO_MODE_AF,GPIO_PUPD_NONE,GPIO_PIN_5);
    gpio_output_options_set(GPIOA,GPIO_OTYPE_PP ,GPIO_OSPEED_25MHZ,GPIO_PIN_5);
    
    gpio_mode_set (GPIOA,GPIO_MODE_AF,GPIO_PUPD_NONE,GPIO_PIN_4);
    gpio_output_options_set(GPIOA,GPIO_OTYPE_PP ,GPIO_OSPEED_25MHZ,GPIO_PIN_4);
    

    /* enable SPI0 */
    spi_init_struct.trans_mode           = SPI_TRANSMODE_BDTRANSMIT;
    spi_init_struct.device_mode          = SPI_MASTER; 
    spi_init_struct.frame_size           = SPI_FRAMESIZE_8BIT;  
    spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE; 
    spi_init_struct.nss                  = SPI_NSS_HARD;   
    spi_init_struct.prescale             = SPI_PSC_16;  
    spi_init_struct.endian               = SPI_ENDIAN_MSB;  
    
    spi_init(SPI0, &spi_init_struct);
    gpio_bit_set(GPIOA,GPIO_PIN_4);
    spi_nss_output_enable(SPI0);
    spi_enable(SPI0);
    
}
void SPI_SlaverInit(void){

    spi_parameter_struct spi_init_struct = {0};
    spi_struct_para_init(&spi_init_struct);

    /* Initialize GPIO */
    rcu_periph_clock_enable(RCU_GPIOE);
    
    /* E4:NSS;E2:SCK ; E5:MISO;E6:MOSI */
    gpio_af_set    (GPIOE,GPIO_AF_5,GPIO_PIN_2);
    gpio_af_set    (GPIOE,GPIO_AF_5,GPIO_PIN_4);
    gpio_af_set    (GPIOE,GPIO_AF_5,GPIO_PIN_6);
    
    /* SPI2_SCK GPIO_INPUT_SET */
    gpio_mode_set (GPIOE,GPIO_MODE_AF,GPIO_PUPD_NONE,GPIO_PIN_2);
    
    /* SPI2_MOSI GPIO_INPUT_SET */
    gpio_mode_set (GPIOE,GPIO_MODE_AF,GPIO_PUPD_NONE,GPIO_PIN_4);

    /* MISO GPIO_INPUT_SET */
    gpio_mode_set (GPIOE,GPIO_MODE_AF,GPIO_PUPD_NONE,GPIO_PIN_6);


    /* enable SPI3 */
    rcu_periph_clock_enable(RCU_SPI3);
    
    spi_init_struct.trans_mode           = SPI_TRANSMODE_BDRECEIVE;
    spi_init_struct.device_mode          = SPI_SLAVE; 
    spi_init_struct.frame_size           = SPI_FRAMESIZE_8BIT;  
    spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE;
    spi_init_struct.nss                  = SPI_NSS_HARD;  
    spi_init_struct.prescale             = SPI_PSC_16;  
    spi_init_struct.endian               = SPI_ENDIAN_MSB;  
    
    spi_init(SPI3, &spi_init_struct);
    spi_enable(SPI3);
    
}

void SPI_MasterSlaveFullduplex(void)
{
    uint32_t slave_rx_buf;
    
    rcu_periph_clock_enable (RCU_GPIOA);
    rcu_periph_clock_enable (RCU_GPIOE);
    
    gpio_bit_reset(GPIOE,GPIO_PIN_4);
    spi_i2s_data_transmit(SPI3, 0x10);

    while(SET!=spi_i2s_flag_get(SPI3,SPI_FLAG_RBNE));
    slave_rx_buf = spi_i2s_data_receive(SPI3);
    
    printf("Slave receive: ");
    printf("%x ", slave_rx_buf);

}


int fputc(int ch, FILE *f)
{
    usart_data_transmit(USART1, (uint8_t)ch);
    

    while (usart_flag_get(USART1, USART_FLAG_TBE) == RESET);        

    return (ch);
}

int fgetc(FILE *f)
{
    while (usart_flag_get(USART1, USART_FLAG_RBNE) == RESET);

    return (int)usart_data_receive(USART1);
}
















  • 写回答

15条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-09-13 14:15
    关注
    获得0.75元问题酬金

    【以下回答由 GPT 生成】

    根据您提供的代码和问题描述,可能存在以下几个问题:

    1. 从机SPI配置问题:根据代码中的SPI_SlaverInit函数,从机的SPI配置与主机的SPI配置完全相同,这样会导致主从机之间无法正确通信。从机的NSS信号(片选信号)应该处于主机的控制下,因此从机的NSS引脚应该配置为输入模式。以下是修正后的代码:
    void SPI_SlaveInit(void)
    {
        spi_parameter_struct spi_init_struct ={0};
        spi_struct_para_init(&spi_init_struct);
    
        rcu_periph_clock_enable(RCU_GPIOA);
        rcu_periph_clock_enable(RCU_SPI0);
    
        /* A7:    MOSI; A4:NSS; A5:SCK */
        gpio_af_set(GPIOA, GPIO_AF_5, GPIO_PIN_7);
        gpio_af_set(GPIOA, GPIO_AF_5, GPIO_PIN_5);
        gpio_af_set(GPIOA, GPIO_AF_5, GPIO_PIN_6);
    
        gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_4);
        gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_7);
    
        spi_init_struct.device_mode = SPI_SLAVE;
        spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX;
        spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT;
        spi_init_struct.nss = SPI_NSS_SOFT;
        spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE;
    
        spi_init(SPI0, &spi_init_struct);
        spi_crc_on(SPI0); 
        spi_enable(SPI0);
    }
    
    1. 主机从机通信问题:根据代码中的SPI_MasterSlaveFullduplex函数,主机在发送数据前未给temp变量赋初值,导致发送的数据始终是未定义的,从机接收到的数据全是FF。应该在发送数据前给temp变量赋0值,以下是修正后的代码:
    void SPI_MasterSlaveFullduplex(void)
    {
        uint32_t i;
        uint8_t temp = 0;
    
        spi_i2s_data_transmit(SPI0, temp);
        while (reset == spi_i2s_flag_get(SPI1, SPI_FLAG_TXEPT));
    
        for(i = 0; i < 32; i++){
            while (reset == spi_i2s_flag_get(SPI1, SPI_FLAG_RXAVL));
            temp = spi_i2s_data_receive(SPI1);
        }
    }
    

    根据上述修正后的代码,应该能够解决从机接收到的数据全是FF的问题。如果问题仍然存在,请提供更多关于您的问题的信息,以便更好地帮助您解决问题。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 系统已结题 9月21日
  • 赞助了问题酬金15元 9月13日
  • 创建了问题 9月13日

悬赏问题

  • ¥15 python怎么在已有视频文件后添加新帧
  • ¥20 虚幻UE引擎如何让多个同一个蓝图的NPC执行一样的动画,
  • ¥15 fluent里模拟降膜反应的UDF编写
  • ¥15 MYSQL 多表拼接link
  • ¥15 关于某款2.13寸墨水屏的问题
  • ¥15 obsidian的中文层级自动编号
  • ¥15 同一个网口一个电脑连接有网,另一个电脑连接没网
  • ¥15 神经网络模型一直不能上GPU
  • ¥15 pyqt怎么把滑块和输入框相互绑定,求解决!
  • ¥20 wpf datagrid单元闪烁效果失灵