spi.c 3.8 KB

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