spi.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. #include <string.h>
  2. #include "spi.h"
  3. /*
  4. * spi driver for ML5238 and CS1180
  5. */
  6. void spi0_init(void){
  7. rcu_periph_clock_enable(RCU_GPIOA);
  8. rcu_periph_clock_enable(RCU_GPIOB);
  9. rcu_periph_clock_enable(RCU_SPI0);
  10. gpio_mode_af(GPIOB, GPIO_PUPD_NONE, GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5);
  11. gpio_af_set(GPIOB, GPIO_AF_0, GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5);
  12. gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_3|GPIO_PIN_5);
  13. ml5238_cs(1);
  14. spi_i2s_deinit(SPI0);
  15. spi_parameter_struct spi_init_struct;
  16. /* SPI0 parameter config */
  17. spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX;
  18. spi_init_struct.device_mode = SPI_MASTER;
  19. spi_init_struct.frame_size = SPI_FRAMESIZE_16BIT;
  20. spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE;
  21. spi_init_struct.nss = SPI_NSS_SOFT;
  22. spi_init_struct.prescale = SPI_PSC_32 ;
  23. spi_init_struct.endian = SPI_ENDIAN_MSB;
  24. spi_init(SPI0, &spi_init_struct);
  25. /* set crc polynomial */
  26. spi_crc_polynomial_set(SPI0,7);
  27. /* enable SPI0 */
  28. spi_enable(SPI0);
  29. }
  30. void spi0_deinit(void){
  31. spi_disable(SPI0);
  32. rcu_periph_clock_disable(RCU_SPI0);
  33. gpio_mode_input(GPIOB, GPIO_PUPD_NONE, GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5);
  34. }
  35. void spi1_init(void){
  36. rcu_periph_clock_enable(RCU_GPIOA);
  37. rcu_periph_clock_enable(RCU_GPIOB);
  38. rcu_periph_clock_enable(RCU_SPI1);
  39. gpio_mode_af(GPIOB, GPIO_PUPD_NONE, GPIO_PIN_13|GPIO_PIN_15);
  40. gpio_mode_af(GPIOB, GPIO_PUPD_PULLUP, GPIO_PIN_14);
  41. gpio_af_set(GPIOB, GPIO_AF_0, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15);
  42. gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13|GPIO_PIN_15);
  43. spi_i2s_deinit(SPI1);
  44. spi_parameter_struct spi_init_struct;
  45. /* SPI1 parameter config */
  46. spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX;
  47. spi_init_struct.device_mode = SPI_MASTER;
  48. spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT;
  49. spi_init_struct.clock_polarity_phase = SPI_CK_PL_HIGH_PH_2EDGE;
  50. spi_init_struct.nss = SPI_NSS_SOFT;
  51. spi_init_struct.prescale = SPI_PSC_128 ;
  52. spi_init_struct.endian = SPI_ENDIAN_MSB;
  53. spi_init(SPI1, &spi_init_struct);
  54. /* set crc polynomial */
  55. spi_crc_polynomial_set(SPI1,7);
  56. /* enable SPI1 */
  57. spi_enable(SPI1);
  58. }
  59. void spi1_deinit(void){
  60. spi_disable(SPI1);
  61. rcu_periph_clock_disable(RCU_SPI1);
  62. gpio_mode_input(GPIOB, GPIO_PUPD_NONE, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15);
  63. }
  64. #define max_wait_count 1024
  65. int spi0_send_uint16(uint16_t s_data, uint8_t *r_data)
  66. {
  67. /* loop while data register in not emplty */
  68. int count = 0;
  69. while (RESET == spi_i2s_flag_get(SPI0,SPI_FLAG_TBE) && count < max_wait_count){
  70. count ++;
  71. };
  72. if (RESET == spi_i2s_flag_get(SPI0,SPI_FLAG_TBE)){
  73. return -1;
  74. }
  75. /* send byte through the SPI0 peripheral */
  76. spi_i2s_data_transmit(SPI0,s_data);
  77. /* wait to receive a byte */
  78. count = 0;
  79. while(RESET == spi_i2s_flag_get(SPI0,SPI_FLAG_RBNE) && count < max_wait_count){
  80. count ++;
  81. };
  82. if (RESET == spi_i2s_flag_get(SPI0,SPI_FLAG_RBNE)){
  83. return -1;
  84. }
  85. /* return the byte read from the SPI bus */
  86. uint8_t r = spi_i2s_data_receive(SPI0);
  87. if (r_data != NULL){
  88. *r_data = r;
  89. }
  90. return 0;
  91. }
  92. #define max_wait1_count 4096
  93. int spi1_send_byte(uint8_t byte, uint8_t *r_data)
  94. {
  95. /* loop while data register in not emplty */
  96. int count = 0;
  97. while (RESET == spi_i2s_flag_get(SPI1,SPI_FLAG_TBE) && count < max_wait1_count){
  98. count ++;
  99. };
  100. if (RESET == spi_i2s_flag_get(SPI1,SPI_FLAG_TBE)){
  101. return -1;
  102. }
  103. /* send byte through the SPI1 peripheral */
  104. spi_i2s_data_transmit(SPI1,byte);
  105. /* wait to receive a byte */
  106. count = 0;
  107. while(RESET == spi_i2s_flag_get(SPI1,SPI_FLAG_RBNE) && count < max_wait1_count){
  108. count ++;
  109. };
  110. if (RESET == spi_i2s_flag_get(SPI1,SPI_FLAG_RBNE)){
  111. return -1;
  112. }
  113. /* return the byte read from the SPI bus */
  114. uint8_t r = spi_i2s_data_receive(SPI1);
  115. if (r_data != NULL){
  116. *r_data = r;
  117. }
  118. return 0;
  119. }