My Marlin configs for Fabrikator Mini and CTC i3 Pro B
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

HAL_spi_Teensy.cpp 3.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #if defined(__MK64FX512__) || defined(__MK66FX1M0__)
  2. #include "HAL.h"
  3. #include <SPI.h>
  4. #include <pins_arduino.h>
  5. #include "spi_pins.h"
  6. #include "../../core/macros.h"
  7. static SPISettings spiConfig;
  8. // Standard SPI functions
  9. /** Initialize SPI bus */
  10. void spiBegin(void) {
  11. #if !PIN_EXISTS(SS)
  12. #error SS_PIN not defined!
  13. #endif
  14. SET_OUTPUT(SS_PIN);
  15. WRITE(SS_PIN, HIGH);
  16. SET_OUTPUT(SCK_PIN);
  17. SET_INPUT(MISO_PIN);
  18. SET_OUTPUT(MOSI_PIN);
  19. //#if DISABLED(SOFTWARE_SPI)
  20. #if 0
  21. // set SS high - may be chip select for another SPI device
  22. #if SET_SPI_SS_HIGH
  23. WRITE(SS_PIN, HIGH);
  24. #endif // SET_SPI_SS_HIGH
  25. // set a default rate
  26. spiInit(SPI_HALF_SPEED); // 1
  27. #endif // SOFTWARE_SPI
  28. }
  29. /** Configure SPI for specified SPI speed */
  30. void spiInit(uint8_t spiRate) {
  31. // Use datarates Marlin uses
  32. uint32_t clock;
  33. switch (spiRate) {
  34. case SPI_FULL_SPEED: clock = 10000000; break;
  35. case SPI_HALF_SPEED: clock = 5000000; break;
  36. case SPI_QUARTER_SPEED: clock = 2500000; break;
  37. case SPI_EIGHTH_SPEED: clock = 1250000; break;
  38. case SPI_SPEED_5: clock = 625000; break;
  39. case SPI_SPEED_6: clock = 312500; break;
  40. default:
  41. clock = 4000000; // Default from the SPI libarary
  42. }
  43. spiConfig = SPISettings(clock, MSBFIRST, SPI_MODE0);
  44. SPI.begin();
  45. }
  46. //------------------------------------------------------------------------------
  47. /** SPI receive a byte */
  48. uint8_t spiRec(void) {
  49. SPI.beginTransaction(spiConfig);
  50. uint8_t returnByte = SPI.transfer(0xFF);
  51. SPI.endTransaction();
  52. return returnByte;
  53. // SPDR = 0xFF;
  54. // while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ }
  55. // return SPDR;
  56. }
  57. //------------------------------------------------------------------------------
  58. /** SPI read data */
  59. void spiRead(uint8_t* buf, uint16_t nbyte) {
  60. SPI.beginTransaction(spiConfig);
  61. SPI.transfer(buf, nbyte);
  62. SPI.endTransaction();
  63. //if (nbyte-- == 0) return;
  64. // SPDR = 0xFF;
  65. //for (uint16_t i = 0; i < nbyte; i++) {
  66. // while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ }
  67. // buf[i] = SPDR;
  68. // SPDR = 0xFF;
  69. //}
  70. //while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ }
  71. //buf[nbyte] = SPDR;
  72. }
  73. //------------------------------------------------------------------------------
  74. /** SPI send a byte */
  75. void spiSend(uint8_t b) {
  76. SPI.beginTransaction(spiConfig);
  77. SPI.transfer(b);
  78. SPI.endTransaction();
  79. // SPDR = b;
  80. // while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ }
  81. }
  82. //------------------------------------------------------------------------------
  83. /** SPI send block */
  84. void spiSendBlock(uint8_t token, const uint8_t* buf) {
  85. SPI.beginTransaction(spiConfig);
  86. SPDR = token;
  87. for (uint16_t i = 0; i < 512; i += 2) {
  88. while (!TEST(SPSR, SPIF)) { /* nada */ };
  89. SPDR = buf[i];
  90. while (!TEST(SPSR, SPIF)) { /* nada */ };
  91. SPDR = buf[i + 1];
  92. }
  93. while (!TEST(SPSR, SPIF)) { /* nada */ };
  94. SPI.endTransaction();
  95. }
  96. /** Begin SPI transaction, set clock, bit order, data mode */
  97. void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) {
  98. spiConfig = SPISettings(spiClock, bitOrder, dataMode);
  99. SPI.beginTransaction(spiConfig);
  100. }
  101. #endif // __MK64FX512__ || __MK66FX1M0__