PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : tips suggestions SPI-->I2C



Kostas
27.02.2007, 18:32
Thatīs a code for making data aquisition from a chip through SPI of a
mega16 and then I want to sent the data through I2C in a mega128. If
you see some "illigal" things or something that is not going well
please let me know. I canīt try to interface it to see if it works
because I need at least 50-70€ to make the pcd. Thanks a lot for your
try and your time!!


#include <mega16.h>
// SPI functions
#include <spi.h>
#include <stdio.h>
#include <stdlib.h>


// Declare your global variables here


//#define TWCR _SFR_IO8(0x36)
#define AD7708_CS PORTA.3

#define TWIE 0
#define TWEN 2
#define TWWC 3
#define TWSTO 4
#define TWSTA 5
#define TWEA 6
#define TWINT 7

#define TWI_START 0x08 // START has been transmitted
#define SLA_W 0x20 // Slave address 0x10 + 0 write bit
#define MT_SLA_ACK 0x18
#define MT_DATA_ACK 0x28
#define TWI_BUFFER_SIZE 100

unsigned char TWI_Buffer[TWI_BUFFER_SIZE+1];
unsigned int TWI_Wr_Index;
unsigned int TWI_Rd_Index;
unsigned int TWI_Counter;
unsigned int h,g;
unsigned char c;


void SPI_to_BuFF (void)
{
//unsigned char c;
c = SPDR;
TWI_Buffer[TWI_Wr_Index++] = c;
if (TWI_Wr_Index > TWI_BUFFER_SIZE)
TWI_Wr_Index = 0;
if (++TWI_Counter > TWI_BUFFER_SIZE)
{

TWI_Counter = TWI_BUFFER_SIZE;
//TWI_Buffer_Overflow = 1;
printf("overflow");

};


}

unsigned char message (void)
{
g = h;
TWDR = g;
}

void SPI_MasterDataReceive(void)
{
SPDR=0x00;//Trigger first transaction
while(!(SPSR&0x80)); //wait for transmission
c=SPDR; //fetch first 8 bits from the ADC
}


// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
int reg1;
//
// 8 To write to the Communication Register to go to the ADC Control register
//

SPDR = 0x02; //communications register
while((SPSR&0x80)==0);
SPDR = 0x7F; // 8 To write to the ADC Control register my parameters
while((SPSR&0x80)==0);

//
// 8 To read the Status register
//
SPDR = 0x40; //communications register = read of data reg
while((SPSR&0x80)==0);
SPDR = 0x00;
while((SPSR&0x80)==0);
reg1 = SPDR;

//reg1 the data which come from the Ad7708(to make the data aqui in the Status Reg the flag mustn`t be set)


if (reg1<128)
{
//
// 8 To read(dataq) the 8th ch
//

SPDR = 0x44; //communications register = read of data reg
while((SPSR&0x80)==0);


SPI_MasterDataReceive();
SPI_to_BuFF();

}

}



// 2 Wire bus interrupt service routine
interrupt [TWI] void twi_isr(void)
{
if ( TWI_Counter != 0 )
{
h = TWI_Buffer[TWI_Rd_Index];
if (++TWI_Rd_Index > TWI_BUFFER_SIZE)
TWI_Rd_Index = 0;
TWI_Counter--;

}

resend_again:
message();
//TWDR=SPDR
TWCR = (1<<TWINT)|(1<<TWEN); /* Clear TWI INT flag to start transmission*/
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) !=MT_DATA_ACK)
{

goto resend_again;

};
}



// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=Out Func6=In Func5=Out Func4=Out Func3=In Func2=In Func1=In Func0=In
// State7=0 State6=T State5=0 State4=0 State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0xB0;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Falling Edge
// INT1: Off
// INT2: Off
GICR|=0x40;
MCUCR=0x02;
MCUCSR=0x00;
GIFR=0x40;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 2*3686,400 kHz
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
SPCR=0x50;
SPSR=0x01;

// 2 Wire Bus initialization
// Generate Acknowledge Pulse: On
// 2 Wire Bus Slave Address: 10h
// General Call Recognition: Off
// Bit Rate: 388,042 kHz
TWSR=0x00;
TWBR=0x0B;
TWAR=0x20;
TWCR=0x45;



// Global enable interrupts
#asm("sei")

start_again:
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != TWI_START)
{

goto start_again;

};

repeat_again:
TWDR = SLA_W;
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != MT_SLA_ACK)
{

goto repeat_again;

};




//
// To write to the Communication Register to go to the IO Register
//

SPDR = 0x00;
//reg &= 0x07;
PORTA &= ~(1<<AD7708_CS); //CS low
SPDR = 0x07;
while((SPSR&0x80)==0); //wait for transmition to complete
//reg = SPDR;
SPDR = 0x02; // To write to the IO Register ???!!!!!!!!
while((SPSR&0x80)==0);
//reg = SPDR;
//PORTA |= (1<<AD7708_CS); //CS high


// To write to the Communication Register to go to the Mode Register
//
//reg &= 0x01;
//PORTA &= ~(1<<AD7708_CS); //CS low
SPDR = 0x01 ; //communications register
while((SPSR&0x80)==0);
//reg = SPDR ;
SPDR = 0x83;
while((SPSR&0x80)==0);
//reg = SPDR;
//PORTA |= (1<<AD7708_CS); //CS high

//
// To write to the Communication Register to go to the Filter Register
//
//reg &= 0x03;
//PORTA &= ~(1<<AD7708_CS); //CS low
SPDR = 0x03 ; //communications register
while((SPSR&0x80)==0);
//reg = SPDR ;
SPDR = 0x03;
while((SPSR&0x80)==0);
//reg = SPDR;
//PORTA |= (1<<AD7708_CS); //CS high






while (1)
{
// Place your code here

};
}