X-Git-Url: http://git.smho.de/gw/?p=owSlave2.git;a=blobdiff_plain;f=common%2FI2C%2FTWI_Master.c;fp=common%2FI2C%2FTWI_Master.c;h=ed125ec25ad2bdcd6047793c56fff96e45c1270f;hp=0000000000000000000000000000000000000000;hb=81a79648a168a1167c5ad97d4068621c1751a353;hpb=6467d8138460abffd9ddabc7b0a9f00c764af19c diff --git a/common/I2C/TWI_Master.c b/common/I2C/TWI_Master.c new file mode 100644 index 0000000..ed125ec --- /dev/null +++ b/common/I2C/TWI_Master.c @@ -0,0 +1,367 @@ + +#ifdef __4MHZ__ +#define F_CPU 4000000UL +#else +#define F_CPU 8000000UL +#endif +#include +#include "TWI_Master.h" +#include + +#if defined(__AVR_AT90Mega169__) | defined(__AVR_ATmega169PA__) | \ +defined(__AVR_AT90Mega165__) | defined(__AVR_ATmega165__) | \ +defined(__AVR_ATmega325__) | defined(__AVR_ATmega3250__) | \ +defined(__AVR_ATmega645__) | defined(__AVR_ATmega6450__) | \ +defined(__AVR_ATmega329__) | defined(__AVR_ATmega3290__) | \ +defined(__AVR_ATmega649__) | defined(__AVR_ATmega6490__) |\ +defined(__AVR_ATtiny25__) | defined(__AVR_ATtiny45__) | defined(__AVR_ATtiny85__) | \ +defined(__AVR_AT90Tiny26__) | defined(__AVR_ATtiny26__) |\ +defined(__AVR_AT90Tiny2313__) | defined(__AVR_ATtiny2313__) |\ +defined(__AVR_ATtiny84__) | defined(__AVR_ATtiny84A__) + +unsigned char USI_TWI_Master_Transfer( unsigned char ); +unsigned char USI_TWI_Master_Stop( void ); + +union USI_TWI_state +{ + unsigned char errorState; // Can reuse the TWI_state for error states due to that it will not be need if there exists an error. + struct + { + unsigned char addressMode : 1; + unsigned char masterWriteDataMode : 1; + unsigned char unused : 6; + }; +} USI_TWI_state; + +/*--------------------------------------------------------------- + USI TWI single master initialization function +---------------------------------------------------------------*/ +void TWI_Master_Initialise( void ) +{ + PORT_USI |= (1< (unsigned char*)RAMEND) // Test if address is outside SRAM space + { + USI_TWI_state.errorState = USI_TWI_DATA_OUT_OF_BOUND; + return (FALSE); + } + if(msgSize <= 1) // Test if the transmission buffer is empty + { + USI_TWI_state.errorState = USI_TWI_NO_DATA; + return (FALSE); + } +#endif + +#ifdef NOISE_TESTING // Test if any unexpected conditions have arrived prior to this execution. + if( USISR & (1< + +void TWI_Wait_Busy() { + _delay_us(100); + while (!( TWCR & (1<