硬汉嵌入式论坛

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

[有问必答] gd32f单片机spi求助

[复制链接]

2

主题

1

回帖

7

积分

新手上路

积分
7
发表于 前天 17:03 | 显示全部楼层 |阅读模式
在代码中进行spi0与spi1的单工传输,为什么运行后收到的数据与发送的数据不一致
引脚:spi0  SCK/PA5, MISO/PA6, MOSI/PA7,NSS/PA4  SPI1 SCK/PB13, MISO/PB14, MOSI/PB15  NSS/PB12
大致代码如下:


#define SLVAE_TRANSMIT_MASTER_RECEIVE

#define SET_SPI1_NSS_HIGH          gpio_bit_set(GPIOB,GPIO_PIN_12);
#define SET_SPI1_NSS_LOW           gpio_bit_reset(GPIOB,GPIO_PIN_12);

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

uint8_t spi0_receive_array[NUM] = {0,0,0,0,0,0,0,0,0,0};
uint8_t spi1_receive_array[NUM] = {0,0,0,0,0,0,0,0,0,0};




int main(void)
{
        rcu_config();
        led_init();
  gpio_config();
        SET_SPI1_NSS_HIGH
       
  spi_config();
  dma_config();


#ifdef SLVAE_TRANSMIT_MASTER_RECEIVE

  dma_channel_enable(DMA0, DMA_CH1);
  dma_channel_enable(DMA0, DMA_CH4);

  spi_dma_enable(SPI1, SPI_DMA_TRANSMIT);
  spi_dma_enable(SPI0, SPI_DMA_RECEIVE);
#endif


  spi_enable(SPI0);
  spi_enable(SPI1);

  SET_SPI1_NSS_LOW

#ifdef SLVAE_TRANSMIT_MASTER_RECEIVE

  while(!dma_flag_get(DMA0, DMA_CH1, DMA_FLAG_FTF));
  while(!dma_flag_get(DMA0, DMA_CH4, DMA_FLAG_FTF));
   
  if(ERROR !=memory_compare(spi0_receive_array, spi1_send_array, NUM))
                gpio_bit_reset(GPIOA, GPIO_PIN_1);
        else
                gpio_bit_set(GPIOA, GPIO_PIN_1);
#endif
       
  SET_SPI1_NSS_HIGH
   
  spi_disable(SPI1);
  spi_disable(SPI0);


        while(1) ;
       

        return 0;
}


void led_init(void)
{
        gpio_bit_set(GPIOA, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2);
}

void rcu_config(void)
{
  rcu_periph_clock_enable(RCU_GPIOA);
  rcu_periph_clock_enable(RCU_GPIOB);
  rcu_periph_clock_enable(RCU_AF);
  rcu_periph_clock_enable(RCU_DMA0);
  rcu_periph_clock_enable(RCU_SPI0);
  rcu_periph_clock_enable(RCU_SPI1);
}

void gpio_config(void)
{
  gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2);
  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);
        gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4);
  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);
        gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_12);
       
}

void spi_config(void)
{
  spi_parameter_struct spi_init_struct;
  spi_i2s_deinit(SPI0);
  spi_i2s_deinit(SPI1);
  spi_struct_para_init(&spi_init_struct);

#ifdef MASTER_TRANSMIT_SLVAE_RECEIVE
  spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX;
#endif
#ifdef SLVAE_TRANSMIT_MASTER_RECEIVE
  spi_init_struct.trans_mode = SPI_TRANSMODE_RECEIVEONLY;
#endif
  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_SOFT;
  spi_init_struct.prescale = SPI_PSC_16;
  spi_init_struct.endian = SPI_ENDIAN_MSB;
  spi_init(SPI0, &spi_init_struct);

#ifdef MASTER_TRANSMIT_SLVAE_RECEIVE
  spi_init_struct.trans_mode = SPI_TRANSMODE_RECEIVEONLY;
#endif
#ifdef SLVAE_TRANSMIT_MASTER_RECEIVE
  spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX;
#endif
  spi_init_struct.device_mode = SPI_SLAVE;
        spi_init_struct.nss = SPI_NSS_HARD;
//spi_init_struct.nss = SPI_NSS_SOFT;//FULL
  spi_init(SPI1, &spi_init_struct);
  
}

void dma_config(void)
{
  dma_parameter_struct dma_init_struct;
  dma_deinit(DMA0, DMA_CH2);
  dma_struct_para_init(&dma_init_struct);
   
  dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI0);
  dma_init_struct.memory_addr = (uint32_t)spi0_send_array;
  dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL;
  dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;
  dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
  dma_init_struct.priority = DMA_PRIORITY_LOW;
  dma_init_struct.number = NUM;
  dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
  dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
  dma_init(DMA0, DMA_CH2, &dma_init_struct);

  dma_circulation_disable(DMA0, DMA_CH2);
  dma_memory_to_memory_disable(DMA0, DMA_CH2);

  dma_deinit(DMA0, DMA_CH1);
  dma_init_struct.periph_addr  = (uint32_t)&SPI_DATA(SPI0);
  dma_init_struct.memory_addr  = (uint32_t)spi0_receive_array;
  dma_init_struct.direction    = DMA_PERIPHERAL_TO_MEMORY;
  dma_init_struct.priority     = DMA_PRIORITY_HIGH;
  dma_init(DMA0, DMA_CH1, &dma_init_struct);

  dma_circulation_disable(DMA0, DMA_CH1);
  dma_memory_to_memory_disable(DMA0, DMA_CH1);

  dma_deinit(DMA0, DMA_CH4);
  dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI1);
  dma_init_struct.memory_addr = (uint32_t)spi1_send_array;
  dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL;
  dma_init_struct.priority = DMA_PRIORITY_MEDIUM;
  dma_init(DMA0, DMA_CH4, &dma_init_struct);
  
  dma_circulation_disable(DMA0, DMA_CH4);
  dma_memory_to_memory_disable(DMA0, DMA_CH4);

  dma_deinit(DMA0, DMA_CH3);
  dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI1);
  dma_init_struct.memory_addr = (uint32_t)spi1_receive_array;
  dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY;
  dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
  dma_init(DMA0, DMA_CH3, &dma_init_struct);
  
  dma_circulation_disable(DMA0, DMA_CH3);
  dma_memory_to_memory_disable(DMA0, DMA_CH3);
}

ErrStatus memory_compare(uint8_t* src, uint8_t* dst, uint8_t length)
{
  while(length--)
    {
      if(*src++ != *dst++)
        return ERROR;
    }
  return SUCCESS;
}



回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-10 03:58 , Processed in 0.233280 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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