sd_card_spi.cpp 1.7 KB

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