Bob Kuhn
6 years ago
committed by
Scott Lahteine
14 changed files with 549 additions and 16 deletions
@ -0,0 +1,195 @@ |
|||
/**
|
|||
* Marlin 3D Printer Firmware |
|||
* Copyright (C) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|||
* |
|||
* Based on Sprinter and grbl. |
|||
* Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm |
|||
* |
|||
* This program is free software: you can redistribute it and/or modify |
|||
* it under the terms of the GNU General Public License as published by |
|||
* the Free Software Foundation, either version 3 of the License, or |
|||
* (at your option) any later version. |
|||
* |
|||
* This program is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
* GNU General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU General Public License |
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
* |
|||
*/ |
|||
|
|||
/**
|
|||
* Based on u8g_com_st7920_hw_spi.c |
|||
* |
|||
* Universal 8bit Graphics Library |
|||
* |
|||
* Copyright (c) 2011, olikraus@gmail.com |
|||
* All rights reserved. |
|||
* |
|||
* Redistribution and use in source and binary forms, with or without modification, |
|||
* are permitted provided that the following conditions are met: |
|||
* |
|||
* * Redistributions of source code must retain the above copyright notice, this list |
|||
* of conditions and the following disclaimer. |
|||
* |
|||
* * Redistributions in binary form must reproduce the above copyright notice, this |
|||
* list of conditions and the following disclaimer in the documentation and/or other |
|||
* materials provided with the distribution. |
|||
* |
|||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND |
|||
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, |
|||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
|||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
|||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR |
|||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
|||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
|||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
|||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, |
|||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
|||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
|||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|||
*/ |
|||
|
|||
#if defined(ARDUINO) && !defined(ARDUINO_ARCH_STM32) && !defined(ARDUINO_ARCH_SAM) |
|||
|
|||
#include "../../inc/MarlinConfigPre.h" |
|||
|
|||
#if HAS_GRAPHICAL_LCD |
|||
|
|||
#include "../shared/Marduino.h" |
|||
#include "../shared/Delay.h" |
|||
|
|||
#include <U8glib.h> |
|||
|
|||
uint8_t u8g_bitData, u8g_bitNotData; |
|||
uint8_t u8g_bitClock, u8g_bitNotClock; |
|||
volatile uint8_t *u8g_outData; |
|||
volatile uint8_t *u8g_outClock; |
|||
|
|||
static void u8g_com_arduino_init_shift_out(uint8_t dataPin, uint8_t clockPin) { |
|||
u8g_outData = portOutputRegister(digitalPinToPort(dataPin)); |
|||
u8g_outClock = portOutputRegister(digitalPinToPort(clockPin)); |
|||
u8g_bitData = digitalPinToBitMask(dataPin); |
|||
u8g_bitClock = digitalPinToBitMask(clockPin); |
|||
|
|||
u8g_bitNotClock = u8g_bitClock; |
|||
u8g_bitNotClock ^= 0xFF; |
|||
|
|||
u8g_bitNotData = u8g_bitData; |
|||
u8g_bitNotData ^= 0xFF; |
|||
} |
|||
|
|||
void U8G_spiSend_sw_AVR_mode_0(uint8_t val) { |
|||
uint8_t bitData = u8g_bitData; |
|||
uint8_t bitNotData = u8g_bitNotData; |
|||
uint8_t bitClock = u8g_bitClock; |
|||
uint8_t bitNotClock = u8g_bitNotClock; |
|||
volatile uint8_t *outData = u8g_outData; |
|||
volatile uint8_t *outClock = u8g_outClock; |
|||
U8G_ATOMIC_START(); |
|||
for (uint8_t i = 0; i < 8; i++) { |
|||
if (val & 0x80) |
|||
*outData |= bitData; |
|||
else |
|||
*outData &= bitNotData; |
|||
*outClock |= bitClock; |
|||
val <<= 1; |
|||
*outClock &= bitNotClock; |
|||
} |
|||
U8G_ATOMIC_END(); |
|||
} |
|||
|
|||
void U8G_spiSend_sw_AVR_mode_3(uint8_t val) { |
|||
uint8_t bitData = u8g_bitData; |
|||
uint8_t bitNotData = u8g_bitNotData; |
|||
uint8_t bitClock = u8g_bitClock; |
|||
uint8_t bitNotClock = u8g_bitNotClock; |
|||
volatile uint8_t *outData = u8g_outData; |
|||
volatile uint8_t *outClock = u8g_outClock; |
|||
U8G_ATOMIC_START(); |
|||
for (uint8_t i = 0; i < 8; i++) { |
|||
*outClock &= bitNotClock; |
|||
if (val & 0x80) |
|||
*outData |= bitData; |
|||
else |
|||
*outData &= bitNotData; |
|||
*outClock |= bitClock; |
|||
val <<= 1; |
|||
} |
|||
U8G_ATOMIC_END(); |
|||
} |
|||
|
|||
|
|||
#if ENABLED(FYSETC_MINI_12864) |
|||
#define U8G_spiSend_sw_AVR U8G_spiSend_sw_AVR_mode_3 |
|||
#else |
|||
#define U8G_spiSend_sw_AVR U8G_spiSend_sw_AVR_mode_0 |
|||
#endif |
|||
|
|||
uint8_t u8g_com_HAL_AVR_sw_sp_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { |
|||
switch (msg) { |
|||
case U8G_COM_MSG_INIT: |
|||
u8g_com_arduino_init_shift_out(u8g->pin_list[U8G_PI_MOSI], u8g->pin_list[U8G_PI_SCK]); |
|||
u8g_com_arduino_assign_pin_output_high(u8g); |
|||
u8g_com_arduino_digital_write(u8g, U8G_PI_SCK, 0); |
|||
u8g_com_arduino_digital_write(u8g, U8G_PI_MOSI, 0); |
|||
break; |
|||
|
|||
case U8G_COM_MSG_STOP: |
|||
break; |
|||
|
|||
case U8G_COM_MSG_RESET: |
|||
if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_RESET]) u8g_com_arduino_digital_write(u8g, U8G_PI_RESET, arg_val); |
|||
break; |
|||
|
|||
case U8G_COM_MSG_CHIP_SELECT: |
|||
#if ENABLED(FYSETC_MINI_12864) // LCD SPI is running mode 3 while SD card is running mode 0
|
|||
if (arg_val) { // SCK idle state needs to be set to the proper idle state before
|
|||
// the next chip select goes active
|
|||
u8g_com_arduino_digital_write(u8g, U8G_PI_SCK, 1); // Set SCK to mode 3 idle state before CS goes active
|
|||
u8g_com_arduino_digital_write(u8g, U8G_PI_CS, LOW); |
|||
} |
|||
else { |
|||
u8g_com_arduino_digital_write(u8g, U8G_PI_CS, HIGH); |
|||
u8g_com_arduino_digital_write(u8g, U8G_PI_SCK, 0); // Set SCK to mode 0 idle state after CS goes inactive
|
|||
} |
|||
#else |
|||
u8g_com_arduino_digital_write(u8g, U8G_PI_CS, !arg_val); |
|||
#endif |
|||
break; |
|||
|
|||
case U8G_COM_MSG_WRITE_BYTE: |
|||
U8G_spiSend_sw_AVR(arg_val); |
|||
break; |
|||
|
|||
case U8G_COM_MSG_WRITE_SEQ: { |
|||
uint8_t *ptr = (uint8_t *)arg_ptr; |
|||
while (arg_val > 0) { |
|||
U8G_spiSend_sw_AVR(*ptr++); |
|||
arg_val--; |
|||
} |
|||
} |
|||
break; |
|||
|
|||
case U8G_COM_MSG_WRITE_SEQ_P: { |
|||
uint8_t *ptr = (uint8_t *)arg_ptr; |
|||
while (arg_val > 0) { |
|||
U8G_spiSend_sw_AVR(u8g_pgm_read(ptr)); |
|||
ptr++; |
|||
arg_val--; |
|||
} |
|||
} |
|||
break; |
|||
|
|||
case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ |
|||
u8g_com_arduino_digital_write(u8g, U8G_PI_A0, arg_val); |
|||
break; |
|||
} |
|||
return 1; |
|||
} |
|||
|
|||
#endif // HAS_GRAPHICAL_LCD
|
|||
#endif // ARDUINO_ARCH_SAM
|
@ -0,0 +1,154 @@ |
|||
/**
|
|||
* Marlin 3D Printer Firmware |
|||
* Copyright (C) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|||
* |
|||
* Based on Sprinter and grbl. |
|||
* Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm |
|||
* |
|||
* This program is free software: you can redistribute it and/or modify |
|||
* it under the terms of the GNU General Public License as published by |
|||
* the Free Software Foundation, either version 3 of the License, or |
|||
* (at your option) any later version. |
|||
* |
|||
* This program is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
* GNU General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU General Public License |
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
* |
|||
*/ |
|||
|
|||
/**
|
|||
* Based on u8g_com_std_sw_spi.c |
|||
* |
|||
* Universal 8bit Graphics Library |
|||
* |
|||
* Copyright (c) 2015, olikraus@gmail.com |
|||
* All rights reserved. |
|||
* |
|||
* Redistribution and use in source and binary forms, with or without modification, |
|||
* are permitted provided that the following conditions are met: |
|||
* |
|||
* * Redistributions of source code must retain the above copyright notice, this list |
|||
* of conditions and the following disclaimer. |
|||
* |
|||
* * Redistributions in binary form must reproduce the above copyright notice, this |
|||
* list of conditions and the following disclaimer in the documentation and/or other |
|||
* materials provided with the distribution. |
|||
* |
|||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND |
|||
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, |
|||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
|||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
|||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR |
|||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
|||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
|||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
|||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, |
|||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
|||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
|||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|||
*/ |
|||
|
|||
#ifdef ARDUINO_ARCH_SAM |
|||
|
|||
#include "../../inc/MarlinConfigPre.h" |
|||
|
|||
#if HAS_GRAPHICAL_LCD && !ENABLED(U8GLIB_ST7920) |
|||
|
|||
#undef SPI_SPEED |
|||
#define SPI_SPEED 2 // About 2 MHz
|
|||
|
|||
#include "../shared/Marduino.h" |
|||
#include "../shared/Delay.h" |
|||
|
|||
#include <U8glib.h> |
|||
|
|||
void u8g_SetPIOutput_DUE(u8g_t *u8g, uint8_t pin_index); |
|||
void u8g_SetPILevel_DUE(u8g_t *u8g, uint8_t pin_index, uint8_t level); |
|||
void U8G_spiSend_sw_DUE_mode_0(uint8_t val); |
|||
void U8G_spiSend_sw_DUE_mode_3(uint8_t val); |
|||
|
|||
Pio *SCK_pPio, *MOSI_pPio; |
|||
uint32_t SCK_dwMask, MOSI_dwMask; |
|||
|
|||
#if ENABLED(FYSETC_MINI_12864) |
|||
#define U8G_spiSend_sw_DUE U8G_spiSend_sw_DUE_mode_3 |
|||
#else |
|||
#define U8G_spiSend_sw_DUE U8G_spiSend_sw_DUE_mode_0 |
|||
#endif |
|||
|
|||
uint8_t u8g_com_HAL_DUE_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { |
|||
switch (msg) { |
|||
case U8G_COM_MSG_INIT: |
|||
SCK_pPio = g_APinDescription[u8g->pin_list[U8G_PI_SCK]].pPort; |
|||
SCK_dwMask = g_APinDescription[u8g->pin_list[U8G_PI_SCK]].ulPin; |
|||
MOSI_pPio = g_APinDescription[u8g->pin_list[U8G_PI_MOSI]].pPort; |
|||
MOSI_dwMask = g_APinDescription[u8g->pin_list[U8G_PI_MOSI]].ulPin; |
|||
u8g_SetPIOutput_DUE(u8g, U8G_PI_SCK); |
|||
u8g_SetPIOutput_DUE(u8g, U8G_PI_MOSI); |
|||
u8g_SetPIOutput_DUE(u8g, U8G_PI_CS); |
|||
u8g_SetPIOutput_DUE(u8g, U8G_PI_A0); |
|||
if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_RESET]) u8g_SetPIOutput_DUE(u8g, U8G_PI_RESET); |
|||
u8g_SetPILevel_DUE(u8g, U8G_PI_SCK, 0); |
|||
u8g_SetPILevel_DUE(u8g, U8G_PI_MOSI, 0); |
|||
break; |
|||
|
|||
case U8G_COM_MSG_STOP: |
|||
break; |
|||
|
|||
case U8G_COM_MSG_RESET: |
|||
if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_RESET]) u8g_SetPILevel_DUE(u8g, U8G_PI_RESET, arg_val); |
|||
break; |
|||
|
|||
case U8G_COM_MSG_CHIP_SELECT: |
|||
#if ENABLED(FYSETC_MINI_12864) // LCD SPI is running mode 3 while SD card is running mode 0
|
|||
if (arg_val) { // SCK idle state needs to be set to the proper idle state before
|
|||
// the next chip select goes active
|
|||
u8g_SetPILevel_DUE(u8g, U8G_PI_SCK, 1); //set SCK to mode 3 idle state before CS goes active
|
|||
u8g_SetPILevel_DUE(u8g, U8G_PI_CS, LOW); |
|||
} |
|||
else { |
|||
u8g_SetPILevel_DUE(u8g, U8G_PI_CS, HIGH); |
|||
u8g_SetPILevel_DUE(u8g, U8G_PI_SCK, 0); //set SCK to mode 0 idle state after CS goes inactive
|
|||
} |
|||
#else |
|||
u8g_SetPILevel_DUE(u8g, U8G_PI_CS, !arg_val); |
|||
#endif |
|||
break; |
|||
|
|||
case U8G_COM_MSG_WRITE_BYTE: |
|||
U8G_spiSend_sw_DUE(arg_val); |
|||
break; |
|||
|
|||
case U8G_COM_MSG_WRITE_SEQ: { |
|||
uint8_t *ptr = (uint8_t *)arg_ptr; |
|||
while (arg_val > 0) { |
|||
U8G_spiSend_sw_DUE(*ptr++); |
|||
arg_val--; |
|||
} |
|||
} |
|||
break; |
|||
|
|||
case U8G_COM_MSG_WRITE_SEQ_P: { |
|||
uint8_t *ptr = (uint8_t *)arg_ptr; |
|||
while (arg_val > 0) { |
|||
U8G_spiSend_sw_DUE(u8g_pgm_read(ptr)); |
|||
ptr++; |
|||
arg_val--; |
|||
} |
|||
} |
|||
break; |
|||
|
|||
case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ |
|||
u8g_SetPILevel_DUE(u8g, U8G_PI_A0, arg_val); |
|||
break; |
|||
} |
|||
return 1; |
|||
} |
|||
|
|||
#endif // HAS_GRAPHICAL_LCD
|
|||
#endif // ARDUINO_ARCH_SAM
|
@ -0,0 +1,114 @@ |
|||
/**
|
|||
* Marlin 3D Printer Firmware |
|||
* Copyright (C) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|||
* |
|||
* Based on Sprinter and grbl. |
|||
* Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm |
|||
* |
|||
* This program is free software: you can redistribute it and/or modify |
|||
* it under the terms of the GNU General Public License as published by |
|||
* the Free Software Foundation, either version 3 of the License, or |
|||
* (at your option) any later version. |
|||
* |
|||
* This program is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
* GNU General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU General Public License |
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
* |
|||
*/ |
|||
|
|||
/**
|
|||
* Based on u8g_com_st7920_hw_spi.c |
|||
* |
|||
* Universal 8bit Graphics Library |
|||
* |
|||
* Copyright (c) 2011, olikraus@gmail.com |
|||
* All rights reserved. |
|||
* |
|||
* Redistribution and use in source and binary forms, with or without modification, |
|||
* are permitted provided that the following conditions are met: |
|||
* |
|||
* * Redistributions of source code must retain the above copyright notice, this list |
|||
* of conditions and the following disclaimer. |
|||
* |
|||
* * Redistributions in binary form must reproduce the above copyright notice, this |
|||
* list of conditions and the following disclaimer in the documentation and/or other |
|||
* materials provided with the distribution. |
|||
* |
|||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND |
|||
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, |
|||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
|||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
|||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR |
|||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
|||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
|||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
|||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, |
|||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
|||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
|||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|||
*/ |
|||
|
|||
#ifdef ARDUINO_ARCH_SAM |
|||
|
|||
#include "../../inc/MarlinConfigPre.h" |
|||
|
|||
//C:\Users\bobku\Documents\GitHub\Marlin-Bob-2\Marlin\src\inc\MarlinConfigPre.h
|
|||
//C:\Users\bobku\Documents\GitHub\Marlin-Bob-2\Marlin\src\HAL\HAL_DUE\u8g_com_HAL_DUE_sw_spi_shared.cpp
|
|||
|
|||
#if HAS_GRAPHICAL_LCD |
|||
|
|||
#include "../shared/Marduino.h" |
|||
#include "../shared/Delay.h" |
|||
|
|||
#include <U8glib.h> |
|||
|
|||
void u8g_SetPIOutput_DUE(u8g_t *u8g, uint8_t pin_index) { |
|||
PIO_Configure(g_APinDescription[u8g->pin_list[pin_index]].pPort, PIO_OUTPUT_1, |
|||
g_APinDescription[u8g->pin_list[pin_index]].ulPin, g_APinDescription[u8g->pin_list[pin_index]].ulPinConfiguration); // OUTPUT
|
|||
} |
|||
|
|||
void u8g_SetPILevel_DUE(u8g_t *u8g, uint8_t pin_index, uint8_t level) { |
|||
volatile Pio* port = g_APinDescription[u8g->pin_list[pin_index]].pPort; |
|||
uint32_t mask = g_APinDescription[u8g->pin_list[pin_index]].ulPin; |
|||
if (level) port->PIO_SODR = mask; else port->PIO_CODR = mask; |
|||
} |
|||
|
|||
extern Pio *SCK_pPio, *MOSI_pPio; |
|||
extern uint32_t SCK_dwMask, MOSI_dwMask; |
|||
|
|||
void U8G_spiSend_sw_DUE_mode_0(uint8_t val) { // 800KHz
|
|||
for (uint8_t i = 0; i < 8; i++) { |
|||
if (val & 0x80) |
|||
MOSI_pPio->PIO_SODR = MOSI_dwMask; |
|||
else |
|||
MOSI_pPio->PIO_CODR = MOSI_dwMask; |
|||
DELAY_NS(48); |
|||
SCK_pPio->PIO_SODR = SCK_dwMask; |
|||
DELAY_NS(905); // 762 dead, 810 garbage, 858/0 900kHz, 905/1 825k, 953/1 800k, 1000/2 725KHz
|
|||
val <<= 1; |
|||
SCK_pPio->PIO_CODR = SCK_dwMask; |
|||
} |
|||
} |
|||
|
|||
|
|||
void U8G_spiSend_sw_DUE_mode_3(uint8_t val) { // 800KHz
|
|||
for (uint8_t i = 0; i < 8; i++) { |
|||
SCK_pPio->PIO_CODR = SCK_dwMask; |
|||
DELAY_NS(48); |
|||
if (val & 0x80) |
|||
MOSI_pPio->PIO_SODR = MOSI_dwMask; |
|||
else |
|||
MOSI_pPio->PIO_CODR = MOSI_dwMask; |
|||
SCK_pPio->PIO_SODR = SCK_dwMask; |
|||
DELAY_NS(905); // 762 dead, 810 garbage, 858/0 900kHz, 905/1 825k, 953/1 800k, 1000/2 725KHz
|
|||
val <<= 1; |
|||
} |
|||
} |
|||
|
|||
#endif // HAS_GRAPHICAL_LCD
|
|||
#endif // ARDUINO_ARCH_SAM
|
Loading…
Reference in new issue