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

[复制链接]
3237|13
 楼主| ZLN4EVER 发表于 2024-3-25 18:26 | 显示全部楼层 |阅读模式

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

  1. #define CURRENT_SPI     SPI1
  2. #define READ_MODE   spi_disable(CURRENT_SPI); \
  3.                     spi_bidirectional_transfer_config(CURRENT_SPI, SPI_BIDIRECTIONAL_RECEIVE); \
  4.                     spi_enable(CURRENT_SPI);
  5. #define WRITE_MODE  spi_disable(CURRENT_SPI); \
  6.                     spi_bidirectional_transfer_config(CURRENT_SPI, SPI_BIDIRECTIONAL_TRANSMIT); \
  7.                     spi_enable(CURRENT_SPI);

  8. void spi_config(void)
  9. {
  10.        
  11.         rcu_periph_clock_enable(RCU_GPIOB);
  12.         //rcu_periph_clock_enable(RCU_AF);
  13.         gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13 | GPIO_PIN_15);//MOSI 和 CLK

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

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

  17.        
  18.         spi_i2s_deinit(CURRENT_SPI);   
  19.         spi_struct_para_init(&spi2);                // 初始化spi_init_struct结构体,设置默认参数       
  20.         spi2.device_mode = SPI_MASTER;
  21.         spi2.trans_mode  = SPI_TRANSMODE_BDTRANSMIT;
  22.         spi2.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE;
  23.         spi2.frame_size = SPI_FRAMESIZE_8BIT;
  24.         spi2.nss = SPI_NSS_SOFT;
  25.         spi2.prescale = SPI_PSC_64;
  26.         spi2.endian = SPI_ENDIAN_MSB;
  27.         spi_init(CURRENT_SPI, &spi2);        // 使用配置好的spi2结构体初始化SPI2
  28.          
  29.     spi_crc_polynomial_set(CURRENT_SPI, 10);

  30.     spi_crc_on(CURRENT_SPI);
  31.         spi_enable(CURRENT_SPI);
  32.         //spi_nss_output_enable(CURRENT_SPI);
  33.        
  34. }

  35. void Well_Hal_spi_write_byte(uint8_t btye)
  36. {
  37. //        SPI_I2S_SendData(&hspi2,&btye,1,1000);

  38.         while (spi_i2s_flag_get(CURRENT_SPI, SPI_FLAG_TBE) == RESET);       
  39.         spi_i2s_data_transmit(CURRENT_SPI, btye);
  40.         while(spi_i2s_flag_get(CURRENT_SPI, SPI_FLAG_TRANS));


  41. }
理想阳 发表于 2024-3-26 16:31 | 显示全部楼层
SPI正常发送时就同时接收,没什么模式切换一说吧,
呐咯密密 发表于 2024-3-28 10:29 | 显示全部楼层
发送的同时就会接受,不存在切换的问题
b5z1giu 发表于 2024-5-17 13:55 | 显示全部楼层
你说的接收有问题,是什么问题?
g0d5xs 发表于 2024-5-17 15:04 | 显示全部楼层
时钟极性(CPOL)和时钟相位(CPHA)设置错误会出现问题
ex7s4 发表于 2024-5-17 16:13 | 显示全部楼层
其实SPI通信需要确保主设备和从设备的时钟极性和相位设置一致。请检查主设备和从设备的CPOL和CPHA设置是否匹配。如果设置不正确,可能导致数据接收错误
y1n9an 发表于 2024-5-17 17:18 | 显示全部楼层
你可以使用逻辑分析仪抓波形啊,看看数据都是啥
w2nme1ai7 发表于 2024-5-17 18:22 | 显示全部楼层
SPI通信中,数据位的传输顺序可以是最高位先传输(MSB First)或最低位先传输(LSB First)
q1d0mnx 发表于 2024-5-17 19:31 | 显示全部楼层
建议楼主最好保证主设备和从设备的数据位顺序设置一致,否则会导致数据接收错误
kaif2n9j 发表于 2024-5-17 19:46 | 显示全部楼层
SPI通信的时钟速度需要根据从设备的规格要求进行设置。如果时钟速度设置过快,从设备可能无法正确接收数据
kaif2n9j 发表于 2024-5-18 07:35 | 显示全部楼层
一般是检查时钟速度设置是否符合从设备的要求
su1yirg 发表于 2024-5-18 10:07 | 显示全部楼层
建议,在半双工通信中,主设备发送数据的同时,从设备也会发送数据。如果主设备没有及时读取从设备发送的数据,可能会导致数据缓冲区溢出,从而影响后续数据的接收。请确保主设备及时读取从设备发送的数据
cen9ce 发表于 2024-5-18 11:24 | 显示全部楼层
检查SPI接口的电气连接是否正确,包括时钟线、数据线和片选线等。确保连接稳定可靠,没有松动或接触不良的情况
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部