Arduino x86 SPI kommunikáció segítség kérés

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);
}

Hozzászólások

A kód2-d kifejezetten elmés.
Hová tűnt a bit nevű paraméter?

Vagyis... khm... nem is használod a readbit rutint. Akkor miért kell egyáltalán szerepeltetni? Csak megzavarsz vele. :(

Az igazság az, hogy már a sokadszorra próbálkoztam ebből fakad ez a két baki.

A bit paraméter véletlen maradt benn, ezt bevallom most észre sem vettem.

Valóban nem írtam le, de lehet a readbit (kód2) sem kell. Hiszen a kód1-ben már vissza adjuk a jelet.
Azért hagytam benn mégis a kód2-t, mert követni akartam az eredeti vonalat. Plusz nem akartam csak kérdezni, le szerettem volna írni, hogy meddig jutottam el én.

Persze ha zavaró hogy ott van kivehetem, vagy megjelölhetem valahogy.

UI.: Amúgy köszi, hogy megnézted. :)

Igen ez igaz.
2 út volt előttem:
- két lépcsőben olvasni az SPI függvénnyel, először a 8 utána a 4 bitet (ezt fogalmam sincs hogy lehet megoldani)
- vagy átírni a kódot az alábbira (ez egyrészt szintén nem jó valamiért - nem kapok értéket - másrészt mintha lassabb lenne az SPI függvénynél):

Itt már van szerepe a readbit rutinnak.

void AudioHackerClass::begin() {

pinMode(SCK_selpin, OUTPUT);
pinMode(MISO_selpin, INPUT);

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

}

uint16_t AudioHackerClass::readADC() {
uint16_t signal = 0;

digitalWrite(ADC_selpin,HIGH);

// begin sample
NOP;
NOP;
NOP;
NOP;
digitalWrite(SCK_selpin,HIGH);
NOP;
NOP;
NOP;
NOP;
digitalWrite(SCK_selpin,LOW);

// second clock
NOP;
NOP;
NOP;
NOP;
digitalWrite(SCK_selpin,HIGH);
NOP;
NOP;
NOP;
NOP;
digitalWrite(SCK_selpin,LOW);

// null bit
NOP;
NOP;
NOP;
NOP;
digitalWrite(SCK_selpin,HIGH);
NOP;
NOP;
NOP;
NOP;
digitalWrite(SCK_selpin,LOW);

AudioHackerClass::readBit(signal, 11);
AudioHackerClass::readBit(signal, 10);
AudioHackerClass::readBit(signal, 9);
AudioHackerClass::readBit(signal, 8);
AudioHackerClass::readBit(signal, 7);
AudioHackerClass::readBit(signal, 6);
AudioHackerClass::readBit(signal, 5);
AudioHackerClass::readBit(signal, 4);
AudioHackerClass::readBit(signal, 3);
AudioHackerClass::readBit(signal, 2);
AudioHackerClass::readBit(signal, 1);
AudioHackerClass::readBit(signal, 0);

digitalWrite(ADC_selpin,LOW);

return signal;
}

void AudioHackerClass::readBit(uint16_t &v, uint8_t bit) {
NOP;
NOP;
NOP;
digitalWrite(SCK_selpin,HIGH);
NOP;
NOP;
if (digitalRead(MISO_selpin) == HIGH) v |= (1 << bit);
digitalWrite(SCK_selpin,LOW);

}