PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : TWI/I2C Atmega32 <-> Atmega8 mit AVR311 & AVR315



lecrascheur
29.12.2006, 17:33
Ich habe ein Project bei dem ich mehrere Atmegas auf verschiedenen Boards betreibe und welche ich über die TWI Schnittstelle gerne miteinander kommunizieren lassen würde.

Ein Atmega32 wird im Mastermode betrieben AVR315 Application Note
und die bzw zurzeit ein Atmega8 im Slavemode AVR311 Application Note.
Ich habe den Code angepasst für das AVRStudio 4.
Was mir bisher gelungen ist, dass ich vom Master bytes zum Slave schicken kann und dort verarbeiten.


Zum Problem:

Ich würde gerne vom Master aus den Buffer meines Slaves auslesen, jedoch gelingt mir das leider nicht...


Hat vielleicht einer von euch schon Erfahrung mit dem AVR311 bzw AVR315 und könnte mir helfen ?

main.c des Slaves


#include <C:\Programme\Atmel\WinAVR\avr\include\avr\io.h>
#include <C:\Programme\Atmel\WinAVR\avr\include\stdio.h>
#include <C:\Programme\Atmel\WinAVR\avr\include\avr\interrup t.h>
#include <C:\Programme\Atmel\WinAVR\avr\include\compat\ina90 .h>


#include "twi-master.h"


// Sample TWI transmission states, used in the main application.
#define SEND_DATA 0x01
#define REQUEST_DATA 0x02
#define READ_DATA_FROM_BUFFER 0x03


int main(void)
{
unsigned char messageBuf[4];
unsigned char TWI_targetSlaveAddress;
unsigned char TWI_operation=0;

TWI_targetSlaveAddress = 0xFF;

DDRB = 0x1F;
DDRA = 0xFF;

PORTA = 0x0F;

sei();
TWI_Master_Initialise();

TWI_operation = SEND_DATA; // Set the start operation

for(;;)
{


if(PINC & 0x80)
{
if (TWI_operation == SEND_DATA)
{
messageBuf[0] = (TWI_targetSlaveAddress<<TWI_ADR_BITS) | (FALSE<<TWI_READ_BIT);
messageBuf[1] = 0xAA;
TWI_Start_Transceiver_With_Data( messageBuf, 2);

TWI_operation = REQUEST_DATA;
}
else if (TWI_operation == REQUEST_DATA)
{
messageBuf[0] = (TWI_targetSlaveAddress<<TWI_ADR_BITS) | (TRUE<<TWI_READ_BIT);
messageBuf[1] = 0x00;
TWI_Start_Transceiver_With_Data( messageBuf, 2 );

TWI_operation = READ_DATA_FROM_BUFFER;
}
else if (TWI_operation == READ_DATA_FROM_BUFFER)
{
TWI_Get_Data_From_Transceiver( messageBuf, 2 );
PORTA = messageBuf[1];

TWI_operation = SEND_DATA;
}

}

}
}


main.c des Masters


#include <C:\Programme\Atmel\WinAVR\avr\include\avr\io.h>
#include <C:\Programme\Atmel\WinAVR\avr\include\stdio.h>
#include <C:\Programme\Atmel\WinAVR\avr\include\avr\interrup t.h>
#include <C:\Programme\Atmel\WinAVR\avr\include\compat\ina90 .h>


#include "twi-slave.h"


int main(void)
{
unsigned char messageBuf[4];

DDRB = 0x00;
DDRD = 0xFF; // Set to ouput
PORTD = 0xFF; // Startup pattern

sei();
TWI_Slave_Initialise(0xFF);
TWI_Start_Transceiver();

for(;;)
{

if ( ! TWI_Transceiver_Busy() )
{

if ( TWI_statusReg.lastTransOK )
{

if ( TWI_statusReg.RxDataInBuf )
{
TWI_Get_Data_From_Transceiver( messageBuf, 1);
PORTD = messageBuf[0];

TWI_Start_Transceiver();
}
//Test Anfang
messageBuf[0] = 0x13;
TWI_Start_Transceiver_With_Data(messageBuf, 1);
//Test Ende
}
}


}
}