main.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. /*!
  2. \file main.c
  3. \brief SPI fullduplex communication use polling mode
  4. */
  5. /*
  6. Copyright (C) 2017 GigaDevice
  7. 2017-06-06, V1.0.0, firmware for GD32F3x0
  8. */
  9. #include "gd32f3x0.h"
  10. #include "gd32f3x0_libopt.h"
  11. #include "gd32f3x0_eval.h"
  12. #define arraysize 10
  13. uint32_t send_n = 0, receive_n = 0;
  14. uint8_t spi0_send_array[arraysize] = {0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA };
  15. uint8_t spi1_send_array[arraysize] = {0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA };
  16. uint8_t spi0_receive_array[arraysize];
  17. uint8_t spi1_receive_array[arraysize];
  18. ErrStatus memory_compare(uint8_t* src, uint8_t* dst, uint8_t length);
  19. void rcu_config(void);
  20. void gpio_config(void);
  21. void spi_config(void);
  22. /*!
  23. \brief main function
  24. \param[in] none
  25. \param[out] none
  26. \retval none
  27. */
  28. int main(void)
  29. {
  30. /* init led1 and led2 */
  31. gd_eval_led_init(LED1);
  32. gd_eval_led_init(LED2);
  33. /* peripheral clock enable */
  34. rcu_config();
  35. /* GPIO config */
  36. gpio_config();
  37. /* SPI config */
  38. spi_config();
  39. /* SPI enable */
  40. spi_enable(SPI1);
  41. spi_enable(SPI0);
  42. /* wait for transmit complete */
  43. while(send_n < arraysize){
  44. while(RESET == spi_i2s_flag_get(SPI1, SPI_FLAG_TBE));
  45. spi_i2s_data_transmit(SPI1, spi1_send_array[send_n]);
  46. while(RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_TBE));
  47. spi_i2s_data_transmit(SPI0, spi0_send_array[send_n++]);
  48. while(RESET == spi_i2s_flag_get(SPI1, SPI_FLAG_RBNE));
  49. spi1_receive_array[receive_n] = spi_i2s_data_receive(SPI1);
  50. while(RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_RBNE));
  51. spi0_receive_array[receive_n++] = spi_i2s_data_receive(SPI0);
  52. }
  53. /* compare receive data with send data */
  54. if(memory_compare(spi1_receive_array, spi0_send_array, arraysize))
  55. gd_eval_led_on(LED1);
  56. else
  57. gd_eval_led_off(LED1);
  58. if(memory_compare(spi0_receive_array, spi1_send_array, arraysize))
  59. gd_eval_led_on(LED2);
  60. else
  61. gd_eval_led_off(LED2);
  62. while (1);
  63. }
  64. /*!
  65. \brief configure different peripheral clocks
  66. \param[in] none
  67. \param[out] none
  68. \retval none
  69. */
  70. void rcu_config(void)
  71. {
  72. rcu_periph_clock_enable(RCU_GPIOA);
  73. rcu_periph_clock_enable(RCU_GPIOB);
  74. rcu_periph_clock_enable(RCU_SPI0);
  75. rcu_periph_clock_enable(RCU_SPI1);
  76. }
  77. /*!
  78. \brief configure the GPIO peripheral
  79. \param[in] none
  80. \param[out] none
  81. \retval none
  82. */
  83. void gpio_config(void)
  84. {
  85. /* SPI0 GPIO config: SCK/PA5, MISO/PA6, MOSI/PA7 */
  86. gpio_af_set(GPIOA, GPIO_AF_0, GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7);
  87. gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7);
  88. gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7);
  89. /* SPI1 GPIO config: SCK/PB13, MISO/PB14, MOSI/PB15 */
  90. gpio_af_set(GPIOB, GPIO_AF_0, GPIO_PIN_13 | GPIO_PIN_14 |GPIO_PIN_15);
  91. gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_13 | GPIO_PIN_14 |GPIO_PIN_15);
  92. gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13 | GPIO_PIN_14 |GPIO_PIN_15);
  93. }
  94. /*!
  95. \brief configure the SPI peripheral
  96. \param[in] none
  97. \param[out] none
  98. \retval none
  99. */
  100. void spi_config(void)
  101. {
  102. spi_parameter_struct spi_init_struct;
  103. /* SPI0 parameter config */
  104. spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX;
  105. spi_init_struct.device_mode = SPI_MASTER;
  106. spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT;
  107. spi_init_struct.clock_polarity_phase = SPI_CK_PL_HIGH_PH_2EDGE;
  108. spi_init_struct.nss = SPI_NSS_SOFT;
  109. spi_init_struct.prescale = SPI_PSC_8;
  110. spi_init_struct.endian = SPI_ENDIAN_MSB;
  111. spi_init(SPI0, &spi_init_struct);
  112. /* SPI1 parameter config */
  113. spi_init_struct.device_mode = SPI_SLAVE;
  114. spi_init_struct.nss = SPI_NSS_SOFT;
  115. spi_init(SPI1, &spi_init_struct);
  116. }
  117. /*!
  118. \brief memory compare function
  119. \param[in] src: source data pointer
  120. \param[in] dst: destination data pointer
  121. \param[in] length: the compare data length
  122. \param[out] none
  123. \retval ErrStatus: ERROR or SUCCESS
  124. */
  125. ErrStatus memory_compare(uint8_t* src, uint8_t* dst, uint8_t length)
  126. {
  127. while (length--){
  128. if (*src++ != *dst++)
  129. return ERROR;
  130. }
  131. return SUCCESS;
  132. }