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
main.c des MastersCode:#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; } } } }
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