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
Code:
#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\interrupt.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
Code:
#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\interrupt.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
}
}
}
}
Lesezeichen