1
0
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:
Cristian Maglie
2012-06-08 22:34:38 +02:00
parent e43dcd8bed
commit 22e24fd5e0
4 changed files with 47 additions and 28 deletions

View File

@@ -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;

View File

@@ -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;