mirror of
https://github.com/esp8266/Arduino.git
synced 2025-10-15 11:26:40 +03:00
Some Due pins are connected to both PWM and SPI pins on SAM3X. This patch fix SPI side.
This commit is contained in:
@@ -15,18 +15,17 @@ SPIClass::SPIClass(Spi *_spi, uint32_t _id, void(*_initCb)(void)) :
|
||||
{
|
||||
initCb();
|
||||
|
||||
SPI_Configure(spi, id, SPI_MR_MSTR | SPI_MR_PS);
|
||||
SPI_Configure(spi, id, SPI_MR_MSTR | SPI_MR_PS | SPI_MR_MODFDIS);
|
||||
SPI_Enable(spi);
|
||||
}
|
||||
|
||||
void SPIClass::begin(uint8_t _pin) {
|
||||
if (_pin == 0)
|
||||
return;
|
||||
uint32_t spiPin = BOARD_PIN_TO_SPI_PIN(_pin);
|
||||
PIO_Configure(
|
||||
g_APinDescription[_pin].pPort,
|
||||
g_APinDescription[_pin].ulPinType,
|
||||
g_APinDescription[_pin].ulPin,
|
||||
g_APinDescription[_pin].ulPinConfiguration);
|
||||
g_APinDescription[spiPin].pPort,
|
||||
g_APinDescription[spiPin].ulPinType,
|
||||
g_APinDescription[spiPin].ulPin,
|
||||
g_APinDescription[spiPin].ulPinConfiguration);
|
||||
setClockDivider(_pin, 1);
|
||||
setDataMode(_pin, SPI_MODE0);
|
||||
}
|
||||
@@ -40,19 +39,19 @@ void SPIClass::end() {
|
||||
//}
|
||||
|
||||
void SPIClass::setDataMode(uint8_t _pin, uint8_t _mode) {
|
||||
uint32_t _channel = SPI_PIN_TO_SPI_CHANNEL(_pin);
|
||||
uint32_t _channel = BOARD_PIN_TO_SPI_CHANNEL(_pin);
|
||||
mode[_channel] = _mode | SPI_CSR_CSAAT;
|
||||
SPI_ConfigureNPCS(spi, _channel, mode[_channel] | SPI_CSR_SCBR(divider[_channel]));
|
||||
SPI_ConfigureNPCS(spi, _channel, mode[_channel] | SPI_CSR_SCBR(divider[_channel]) | SPI_CSR_DLYBCT(1));
|
||||
}
|
||||
|
||||
void SPIClass::setClockDivider(uint8_t _pin, uint8_t _divider) {
|
||||
uint32_t _channel = SPI_PIN_TO_SPI_CHANNEL(_pin);
|
||||
uint32_t _channel = BOARD_PIN_TO_SPI_CHANNEL(_pin);
|
||||
divider[_channel] = _divider;
|
||||
SPI_ConfigureNPCS(spi, _channel, mode[_channel] | SPI_CSR_SCBR(divider[_channel]));
|
||||
SPI_ConfigureNPCS(spi, _channel, mode[_channel] | SPI_CSR_SCBR(divider[_channel]) | SPI_CSR_DLYBCT(1));
|
||||
}
|
||||
|
||||
byte SPIClass::transfer(byte _pin, uint8_t _data, SPITransferMode _mode) {
|
||||
uint32_t _channel = SPI_PIN_TO_SPI_CHANNEL(_pin);
|
||||
uint32_t _channel = BOARD_PIN_TO_SPI_CHANNEL(_pin);
|
||||
uint32_t d = _data | SPI_PCS(_channel);
|
||||
if (_mode == SPI_LAST)
|
||||
d |= SPI_TDR_LASTXFER;
|
||||
|
@@ -28,7 +28,7 @@ class SPIClass {
|
||||
public:
|
||||
SPIClass(Spi *_spi, uint32_t _id, void(*_initCb)(void));
|
||||
|
||||
byte transfer(uint8_t _data, SPITransferMode _mode = SPI_LAST) { transfer(PIN_SPI_SS_DEFAULT, _data, _mode); }
|
||||
//byte transfer(uint8_t _data, SPITransferMode _mode = SPI_LAST) { transfer(BOARD_PIN_SS_DEFAULT, _data, _mode); }
|
||||
byte transfer(byte _channel, uint8_t _data, SPITransferMode _mode = SPI_LAST);
|
||||
|
||||
// SPI Configuration methods
|
||||
@@ -37,7 +37,7 @@ class SPIClass {
|
||||
void detachInterrupt(void);
|
||||
|
||||
void begin(uint8_t _channel);
|
||||
void begin(void) { begin(PIN_SPI_SS_DEFAULT); };
|
||||
//void begin(void) { begin(BOARD_PIN_SS_DEFAULT); };
|
||||
void end(void);
|
||||
|
||||
// These methods sets a parameter on a single pin
|
||||
@@ -47,8 +47,8 @@ class SPIClass {
|
||||
|
||||
// These methods sets the same parameters but on default pin PIN_SPI_SS_DEFAULT
|
||||
//void setBitOrder(uint8_t _order) { setBitOrder(PIN_SPI_SS_DEFAULT, _order); };
|
||||
void setDataMode(uint8_t _mode) { setDataMode(PIN_SPI_SS_DEFAULT, _mode); };
|
||||
void setClockDivider(uint8_t _div) { setClockDivider(PIN_SPI_SS_DEFAULT, _div); };
|
||||
//void setDataMode(uint8_t _mode) { setDataMode(BOARD_PIN_SS_DEFAULT, _mode); };
|
||||
//void setClockDivider(uint8_t _div) { setClockDivider(BOARD_PIN_SS_DEFAULT, _div); };
|
||||
|
||||
private:
|
||||
Spi *spi;
|
||||
|
Reference in New Issue
Block a user