Tut mir leid, dass ich so lange nicht geantwortet habe, hatte soeben Prüfungen an der ETH.
Ich habe mal einen Versuch unternommen, einen Schaltplan zu zeichen, ich hoffe er ist genug klar, auch wenn mir bewusst ist, dass es eindeutig besser gehen würde 
Das Program wird auf einem ArduinoMega ausgeführt und ist dementsprechend minimal anders als C
Code:
#include <avr/io.h>
uint8_t data[] = {0,0,0};
void SPI_init(void)
{
DDRB = ((1<<DDB2)|(1<<DDB1)|(1<<DDB0)); //spi pins on port b MOSI SCK,SS outputs
SPCR = ((1<<SPE)|(1<<MSTR)|(1<<SPR1)); // SPI enable, Master, f/64
}
uint8_t SPI_Transmit(uint8_t cData)
{
SPDR = cData;
while(!(SPSR & (1<<SPIF)))
;
return SPDR;
}
uint8_t SPI_receive()
{
SPCR &= ~(1 << SPE); //disable SPI
DDRB |= ( 1 << DDB1); //set clock to output
DDRB &= ~(1 << DDB2); //set MISO & MOSI to input
DDRB &= ~(1 << DDB3);
PORTB |= (1 << PB1); //generate 8 cycles on SCK
delayMicroseconds(2);
PORTB &= ~(1 << PB1);
delayMicroseconds(2);
PORTB |= (1 << PB1);
delayMicroseconds(2);
PORTB &= ~(1 << PB1);
delayMicroseconds(2);
PORTB |= (1 << PB1);
delayMicroseconds(2);
PORTB &= ~(1 << PB1);
delayMicroseconds(2);
PORTB |= (1 << PB1);
delayMicroseconds(2);
PORTB &= ~(1 << PB1);
delayMicroseconds(2);
PORTB |= (1 << PB1);
delayMicroseconds(2);
PORTB &= ~(1 << PB1);
delayMicroseconds(2);
PORTB |= (1 << PB1);
delayMicroseconds(2);
PORTB &= ~(1 << PB1);
delayMicroseconds(2);
PORTB |= (1 << PB1);
delayMicroseconds(2);
PORTB &= ~(1 << PB1);
delayMicroseconds(2);
PORTB |= (1 << PB1);
delayMicroseconds(2);
PORTB &= ~(1 << PB1);
SPI_init(); //initialise SPI again
return SPDR; //only formal (for later use)
}
void ADS1211_receive()
{
delayMicroseconds(10);
SPI_Transmit(B00000100); //send INSR: write 1 Byte to Command Register Byte 3 (MSB)
delayMicroseconds(5);
SPI_Transmit(B01000010);//send Data: everything default except SDL = 1
delayMicroseconds(5);
SPI_Transmit(B10000100);//send INSR: read 1 Byte (Command Register Byte 3 (MSB))
delayMicroseconds(5);
data[0] = SPI_receive();//receive, expecting B01000010
}
void setup()
{
Serial.begin(9600);
Serial.write("starting up..."); //say hello
DDRL &= ~( 1 << DDL1 ); //set DL1 to input pin for DRDY
SPI_init(); //initialise SPI
delay(1000);
}
void loop()
{
ADS1211_receive();
delayMicroseconds(20);
delay(2);
}
Lesezeichen