sd_card_spi.cpp 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. // Driver and interface for accessing SD card in SPI mode
  2. //
  3. // Copyright (c) 2022 Rabbit Hole Computing™
  4. #include "BlueSCSI_platform.h"
  5. #include "BlueSCSI_log.h"
  6. #include <hardware/spi.h>
  7. #include <SdFat.h>
  8. #ifndef SD_USE_SDIO
  9. class RP2040SPIDriver : public SdSpiBaseClass
  10. {
  11. public:
  12. void begin(SdSpiConfig config) {
  13. }
  14. void activate() {
  15. _spi_init(SD_SPI, m_sckfreq);
  16. spi_set_format(SD_SPI, 8, SPI_CPOL_0, SPI_CPHA_0, SPI_MSB_FIRST);
  17. }
  18. void deactivate() {
  19. }
  20. void wait_idle() {
  21. while (!(spi_get_hw(SD_SPI)->sr & SPI_SSPSR_TFE_BITS));
  22. while (spi_get_hw(SD_SPI)->sr & SPI_SSPSR_BSY_BITS);
  23. }
  24. // Single byte receive
  25. uint8_t receive() {
  26. uint8_t tx = 0xFF;
  27. uint8_t rx;
  28. spi_write_read_blocking(SD_SPI, &tx, &rx, 1);
  29. return rx;
  30. }
  31. // Single byte send
  32. void send(uint8_t data) {
  33. spi_write_blocking(SD_SPI, &data, 1);
  34. wait_idle();
  35. }
  36. // Multiple byte receive
  37. uint8_t receive(uint8_t* buf, size_t count)
  38. {
  39. spi_read_blocking(SD_SPI, 0xFF, buf, count);
  40. return 0;
  41. }
  42. // Multiple byte send
  43. void send(const uint8_t* buf, size_t count) {
  44. spi_write_blocking(SD_SPI, buf, count);
  45. }
  46. void setSckSpeed(uint32_t maxSck) {
  47. m_sckfreq = maxSck;
  48. }
  49. private:
  50. uint32_t m_sckfreq;
  51. };
  52. void sdCsInit(SdCsPin_t pin)
  53. {
  54. }
  55. void sdCsWrite(SdCsPin_t pin, bool level)
  56. {
  57. if (level)
  58. sio_hw->gpio_set = (1 << SD_SPI_CS);
  59. else
  60. sio_hw->gpio_clr = (1 << SD_SPI_CS);
  61. }
  62. RP2040SPIDriver g_sd_spi_port;
  63. SdSpiConfig g_sd_spi_config(0, DEDICATED_SPI, SD_SCK_MHZ(25), &g_sd_spi_port);
  64. void platform_set_sd_callback(sd_callback_t func, const uint8_t *buffer)
  65. {
  66. }
  67. #endif