spi.c 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #include "spi.h"
  2. #include "gd32f30x_libopt.h"
  3. #define arraysize 11520
  4. //uint16_t spi1_send_array[arraysize / 2] = {0};
  5. #define SET_SPI1_NSS_HIGH gpio_bit_set(GPIOB,GPIO_PIN_12);
  6. #define SET_SPI1_NSS_LOW gpio_bit_reset(GPIOB,GPIO_PIN_12);
  7. void spix_init(void)
  8. {
  9. rcu_periph_clock_enable(RCU_SPI1);
  10. rcu_periph_clock_enable(RCU_GPIOB);
  11. rcu_periph_clock_enable(RCU_DMA0);
  12. gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13 |GPIO_PIN_15);
  13. gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_12);
  14. // i2s_init(SPI1, I2S_MODE_MASTERTX, I2S_STD_PHILLIPS, I2S_CKPL_LOW);
  15. // i2s_psc_config(SPI1, I2S_AUDIOSAMPLE_11K, I2S_FRAMEFORMAT_DT16B_CH16B, I2S_MCKOUT_DISABLE);
  16. // i2s_enable(SPI1);
  17. //
  18. spi_i2s_deinit(SPI1);
  19. spi_parameter_struct spi1_init = {0};
  20. spi1_init.device_mode = SPI_MASTER;
  21. spi1_init.trans_mode = SPI_TRANSMODE_FULLDUPLEX;
  22. spi1_init.clock_polarity_phase = SPI_CK_PL_HIGH_PH_2EDGE;
  23. spi1_init.frame_size = SPI_FRAMESIZE_8BIT;
  24. spi1_init.nss = SPI_NSS_SOFT;
  25. spi1_init.prescale = SPI_PSC_2;
  26. spi1_init.endian = SPI_ENDIAN_MSB;
  27. spi_init(SPI1,&spi1_init);
  28. //spi_nssp_mode_enable(SPI1);
  29. //spi_nss_output_enable(SPI1);
  30. spi_enable(SPI1);
  31. dma_parameter_struct dma_init_struct;
  32. dma_deinit(DMA0, DMA_CH4);
  33. dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL;
  34. dma_init_struct.memory_addr = (uint32_t)0;
  35. dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;
  36. dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
  37. dma_init_struct.number = 0;
  38. dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI1);
  39. dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
  40. dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_32BIT;
  41. dma_init_struct.priority = DMA_PRIORITY_LOW;
  42. dma_init(DMA0, DMA_CH4, &dma_init_struct);
  43. // /* configure DMA mode */
  44. dma_circulation_disable(DMA0, DMA_CH4);
  45. dma_memory_to_memory_disable(DMA0, DMA_CH4);
  46. dma_channel_disable(DMA0, DMA_CH4);
  47. //SET_SPI1_NSS_LOW
  48. spi_dma_enable(SPI1, SPI_DMA_TRANSMIT);
  49. }
  50. void spix_send(void *buff,int size)
  51. {
  52. dma_channel_disable(DMA0,DMA_CH4);
  53. dma_memory_address_config(DMA0,DMA_CH4,(uint32_t)(buff));
  54. dma_transfer_number_config(DMA0,DMA_CH4,size);
  55. dma_channel_enable(DMA0,DMA_CH4);
  56. spi_dma_enable(SPI1, SPI_DMA_TRANSMIT);
  57. while(!dma_flag_get(DMA0, DMA_CH4, DMA_FLAG_FTF));
  58. dma_flag_clear(DMA0, DMA_CH4, DMA_FLAG_FTF);
  59. }