Advertisement
Guest User

Untitled

a guest
Aug 22nd, 2017
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.81 KB | None | 0 0
  1. static bool spi_send_cmd(spi_cmd_t *p_cmd) {
  2. spi_status_t rc;
  3. int i;
  4. uint16_t data;
  5. uint8_t pcs, last = 0;
  6.  
  7. /* Clear dummy byte */
  8. if (spi_is_rx_full(CONF_TEST_SPI)) spi_read(CONF_TEST_SPI, &data, &pcs);
  9.  
  10. /* Wait until no activity on bus */
  11. while(!spi_is_tx_empty(CONF_TEST_SPI));
  12.  
  13. /* Send command */
  14. for (i = 0; i < p_cmd->cmd_size; i ++) {
  15. last = (i == (p_cmd->cmd_size-1)) &&
  16. (p_cmd->dummy_size == 0) &&
  17. (p_cmd->data_size == 0);
  18. rc = spi_write(CONF_TEST_SPI, p_cmd->cmd[i], TEST_DF_PCS, last);
  19.  
  20. if (p_cmd->cmd_rx) rc |= spi_read(CONF_TEST_SPI, &data, &pcs);
  21. if (rc != SPI_OK) return false;
  22. }
  23.  
  24. /* Send dummy clocks */
  25. for (i = 0; i < p_cmd->dummy_size; i ++) {
  26. rc = spi_write(CONF_TEST_SPI, 0xFF, TEST_DF_PCS, 0);
  27. if (p_cmd->cmd_rx) rc |= spi_read(CONF_TEST_SPI, &data, &pcs);
  28. if (rc != SPI_OK) return false;
  29. }
  30. if (p_cmd->data_size == 0) return true;
  31.  
  32. /* Read/Write data */
  33. for (i = 0; i < p_cmd->data_size; i ++) {
  34. last = (i == (p_cmd->data_size-1));
  35. rc = spi_write(CONF_TEST_SPI, p_cmd->data[i], TEST_DF_PCS, last);
  36. if (p_cmd->cmd_rx) rc |= spi_read(CONF_TEST_SPI, &data, &pcs);
  37. if (rc != SPI_OK) return false;
  38. if (p_cmd->cmd_rx) p_cmd->data[i] = (uint8_t)data;
  39. }
  40. return true;
  41. }
  42.  
  43. #define SPI_CHIP_SEL 0
  44. #define SPI_CHIP_PCS ((~(1u << SPI_CHIP_SEL)) & 0xF)
  45. #define SPI_CLK_POLARITY 0
  46. #define SPI_CLK_PHASE 0
  47. #define SPI_CLOCK 1000000
  48.  
  49. void sst26_init(void) {
  50. /* SPI configuration */
  51. gpio_configure_pin(SPI_MISO_GPIO, SPI_MISO_FLAGS);
  52. gpio_configure_pin(SPI_MOSI_GPIO, SPI_MOSI_FLAGS);
  53. gpio_configure_pin(SPI_SPCK_GPIO, SPI_SPCK_FLAGS);
  54. gpio_configure_pin(SPI_NPCS0_GPIO, SPI_NPCS0_FLAGS);
  55. // Enable SPI Clock
  56. spi_enable_clock(SPI);
  57. // Reset SPI
  58. spi_reset(SPI);
  59. // Disable SPI
  60. spi_disable(SPI);
  61. // Set Master Mode for data flash access
  62. spi_set_lastxfer(SPI);
  63. spi_set_master_mode(SPI);
  64. spi_disable_mode_fault_detect(SPI);
  65. // Set Chip Select
  66. spi_set_variable_peripheral_select(SPI);
  67. spi_set_peripheral_chip_select_value(SPI, SPI_CHIP_SEL);
  68. // Set Polarity and Phase
  69. spi_set_clock_polarity(SPI, SPI_CHIP_SEL, SPI_CLK_POLARITY);
  70. spi_set_clock_phase(SPI, SPI_CHIP_SEL, SPI_CLK_PHASE);
  71. // Set transfer rate
  72. spi_set_bits_per_transfer(SPI, SPI_CHIP_SEL, SPI_CSR_BITS_8_BIT);
  73. spi_set_baudrate_div(SPI, SPI_CHIP_SEL, (sysclk_get_peripheral_hz() / SPI_CLOCK));
  74. // No delays
  75. spi_set_transfer_delay(SPI, SPI_CHIP_SEL, 0, 0);
  76. // Since it's the only slave chip... keep signal low (?)
  77. spi_configure_cs_behavior(SPI, SPI_CHIP_SEL, SPI_CS_KEEP_LOW);
  78. // Enable SPI
  79. spi_enable(SPI);
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement