- LiTime Speicher und Akkus         
Ergebnis 1 bis 1 von 1

Thema: TWI/I2C Atmega32 <-> Atmega8 mit AVR311 & AVR315

  1. #1

    TWI/I2C Atmega32 <-> Atmega8 mit AVR311 & AVR315

    Anzeige

    Praxistest und DIY Projekte
    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
    				}
    		}
    		
    
    	}
    }
    Angehängte Dateien Angehängte Dateien

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiTime Speicher und Akkus