spi_common.c 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #include "at32f403a_407.h"
  2. #include "spi_common.h"
  3. void common_spi_init(void)
  4. {
  5. gpio_init_type gpio_initstructure;
  6. spi_init_type spi_init_struct;
  7. crm_periph_clock_enable(CRM_IOMUX_PERIPH_CLOCK, TRUE);
  8. crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  9. crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
  10. gpio_pin_remap_config(SWJTAG_MUX_010, TRUE);
  11. gpio_pin_remap_config(SPI3_GMUX_0010, TRUE);
  12. // SCK
  13. gpio_initstructure.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  14. gpio_initstructure.gpio_pull = GPIO_PULL_DOWN;
  15. gpio_initstructure.gpio_mode = GPIO_MODE_MUX;
  16. gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  17. gpio_initstructure.gpio_pins = GPIO_PINS_3;
  18. gpio_init(GPIOB, &gpio_initstructure);
  19. // MISO
  20. gpio_initstructure.gpio_pull = GPIO_PULL_UP;
  21. gpio_initstructure.gpio_mode = GPIO_MODE_INPUT;
  22. gpio_initstructure.gpio_pins = GPIO_PINS_4;
  23. gpio_init(GPIOB, &gpio_initstructure);
  24. // MOSI
  25. gpio_initstructure.gpio_pull = GPIO_PULL_UP;
  26. gpio_initstructure.gpio_mode = GPIO_MODE_MUX;
  27. gpio_initstructure.gpio_pins = GPIO_PINS_5;
  28. gpio_init(GPIOB, &gpio_initstructure);
  29. // CS
  30. gpio_initstructure.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  31. gpio_initstructure.gpio_pull = GPIO_PULL_UP;
  32. gpio_initstructure.gpio_mode = GPIO_MODE_OUTPUT;
  33. gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  34. gpio_initstructure.gpio_pins = GPIO_PINS_15;
  35. gpio_init(GPIOA, &gpio_initstructure);
  36. SPI_FLASH_CS_H();
  37. crm_periph_clock_enable(CRM_SPI3_PERIPH_CLOCK, TRUE);
  38. spi_default_para_init(&spi_init_struct);
  39. spi_init_struct.transmission_mode = SPI_TRANSMIT_FULL_DUPLEX;
  40. spi_init_struct.master_slave_mode = SPI_MODE_MASTER;
  41. spi_init_struct.mclk_freq_division = SPI_MCLK_DIV_32; //SPI_MCLK_DIV_2;
  42. spi_init_struct.first_bit_transmission = SPI_FIRST_BIT_MSB;
  43. spi_init_struct.frame_bit_num = SPI_FRAME_8BIT;
  44. spi_init_struct.clock_polarity = SPI_CLOCK_POLARITY_HIGH;
  45. spi_init_struct.clock_phase = SPI_CLOCK_PHASE_2EDGE;
  46. spi_init_struct.cs_mode_selection = SPI_CS_SOFTWARE_MODE;
  47. spi_init(SPI3, &spi_init_struct);
  48. //spi_hardware_cs_output_enable(SPI3, TRUE);
  49. spi_enable(SPI3, TRUE);
  50. }
  51. void common_spi_send(spi_type *spi, uint16_t data)
  52. {
  53. while (spi_i2s_flag_get(spi, SPI_I2S_TDBE_FLAG) == RESET);
  54. spi->dt = data;
  55. }
  56. uint8_t common_spi_receive(spi_type *spi)
  57. {
  58. while (spi_i2s_flag_get(spi, SPI_I2S_RDBF_FLAG) == RESET);
  59. return spi->dt;
  60. }
  61. uint8_t common_spi_tx_rx(spi_type *spi, uint8_t data)
  62. {
  63. while (spi_i2s_flag_get(spi, SPI_I2S_TDBE_FLAG) == RESET);
  64. spi->dt = data;
  65. while (spi_i2s_flag_get(spi, SPI_I2S_RDBF_FLAG) == RESET);
  66. return spi->dt;
  67. }