Sziasztok!
Adott az alábbi 3 kód, amit x86 kompatibilissé akarok tenni.
Van egy Intel Galileo-m, de a hozzá vett shield kódját ATmega-ra írták.
Megpróbáltam hát átírni több, de mégis kevesebb sikerrel...
A kód SPI kommunikációval olvas ki biteket az ADC-ből.
A probléma, hogy a 3 kódra több átírást is megpróbáltam, de mégsem tudok kiolvasni semmit...
Tudom hogy itt sok okos ember van. Én meg viszonylag kezdö vagyok ezen a területen.
Tud valaki segíteni?
Kód0:
void AudioHackerClass::begin() {
pinMode(SCK, OUTPUT);
pinMode(MISO, INPUT);
pinMode(MOSI, OUTPUT);
pinMode(SS, OUTPUT);
digitalWrite(SCK, LOW);
digitalWrite(MISO, LOW);
digitalWrite(MOSI, LOW);
digitalWrite(SS, HIGH);
pinMode(SRAM0_SS, OUTPUT);
pinMode(SRAM1_SS, OUTPUT);
pinMode(DAC_SS, OUTPUT);
pinMode(ADC_SS, OUTPUT);
digitalWrite(SRAM0_SS, HIGH);
digitalWrite(SRAM1_SS, HIGH);
digitalWrite(DAC_SS, HIGH);
digitalWrite(ADC_SS, HIGH);
// Configure SPI
SPCR |= _BV(SPE); // enable SPI
SPCR &= ~_BV(SPIE); // SPI interrupts off
SPCR &= ~_BV(DORD); // MSB first
SPCR |= _BV(MSTR); // SPI master mode
SPCR &= ~_BV(CPOL); // leading edge rising
SPCR &= ~_BV(CPHA); // sample on leading edge
SPCR &= ~_BV(SPR1); // speed = clock/4
SPCR &= ~_BV(SPR0);
SPSR |= _BV(SPI2X); // 2X speed
// Disable Timer1 interrupt
TIMSK1 &= ~_BV(TOIE1);
TCCR1A = 0;
TCCR1B = 0;
// Set prescalar to 1;
TCCR1B |= _BV(CS10);
// Enable Timer1 interrupt
TIMSK1 |= _BV(TOIE1);
}
Kód1:
unsigned int AudioHackerClass::readADC() {
unsigned int signal = 0;
SPCR &= ~_BV(SPE); // disable hardware SPI while we bang this out
SELECT_ADC;
// begin sample
NOP;
NOP;
NOP;
NOP;
SCK_HIGH;
NOP;
NOP;
NOP;
NOP;
SCK_LOW;
// second clock
NOP;
NOP;
NOP;
NOP;
SCK_HIGH;
NOP;
NOP;
NOP;
NOP;
SCK_LOW;
// null bit
NOP;
NOP;
NOP;
NOP;
SCK_HIGH;
NOP;
NOP;
NOP;
NOP;
SCK_LOW;
readBit(signal, 11);
readBit(signal, 10);
readBit(signal, 9);
readBit(signal, 8);
readBit(signal, 7);
readBit(signal, 6);
readBit(signal, 5);
readBit(signal, 4);
readBit(signal, 3);
readBit(signal, 2);
readBit(signal, 1);
readBit(signal, 0);
DESELECT_ADC;
SPCR |= _BV(SPE); // enable hardware SPI
return signal;
}
Kód2:
static inline __attribute__((always_inline)) void readBit(uint16_t &v, uint8_t bit) {
NOP;
NOP;
NOP;
SCK_HIGH;
NOP;
NOP;
if (MISO_READ) v |= (1 << bit);
SCK_LOW;
}
Így írtam át:
Kód0:
void AudioHackerClass::begin() {
pinMode(SRAM0_selpin, OUTPUT);
pinMode(SRAM1_selpin, OUTPUT);
pinMode(DAC_selpin, OUTPUT);
pinMode(ADC_selpin, OUTPUT);
digitalWrite(SRAM0_selpin, HIGH);
digitalWrite(SRAM1_selpin, HIGH);
digitalWrite(DAC_selpin, HIGH);
digitalWrite(ADC_selpin, HIGH);
digitalWrite(SS, HIGH);
SPI.begin ();
SPI.setClockDivider(SPI_CLOCK_DIV1);
}
Kód1:
uint16_t AudioHackerClass::readADC() {
uint16_t signal = 0;
digitalWrite(ADC_selpin,HIGH);
digitalWrite(SS, LOW);
signal = SPI.transfer (signal);
digitalWrite(SS, HIGH);
digitalWrite(ADC_selpin,LOW);
return signal;
}
Kód2 (Nincs használva! Az eredeti kód gondolatmente miatt hagytam benn.):
void AudioHackerClass::readBit(uint16_t &v, uint8_t bit) {
digitalWrite(SS, LOW);
SPI.transfer (0x01);
v = SPI.transfer (0);
digitalWrite(SS, HIGH);
}