<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="sk">
	<id>https://senzor.robotika.sk/sensorwiki/index.php?action=history&amp;feed=atom&amp;title=Twimaster.c</id>
	<title>Twimaster.c - História úprav</title>
	<link rel="self" type="application/atom+xml" href="https://senzor.robotika.sk/sensorwiki/index.php?action=history&amp;feed=atom&amp;title=Twimaster.c"/>
	<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Twimaster.c&amp;action=history"/>
	<updated>2026-05-31T08:57:08Z</updated>
	<subtitle>História úprav pre túto stránku na wiki</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://senzor.robotika.sk/sensorwiki/index.php?title=Twimaster.c&amp;diff=3784&amp;oldid=prev</id>
		<title>StudentDVPS: Vytvorená stránka „&lt;source lang=&quot;c&quot;&gt; /************************************************************************* * Title:    I2C master library using hardware TWI interface * Author:   Pete...“</title>
		<link rel="alternate" type="text/html" href="https://senzor.robotika.sk/sensorwiki/index.php?title=Twimaster.c&amp;diff=3784&amp;oldid=prev"/>
		<updated>2013-01-15T13:07:32Z</updated>

		<summary type="html">&lt;p&gt;Vytvorená stránka „&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt; /************************************************************************* * Title:    I2C master library using hardware TWI interface * Author:   Pete...“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nová stránka&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*************************************************************************&lt;br /&gt;
* Title:    I2C master library using hardware TWI interface&lt;br /&gt;
* Author:   Peter Fleury &amp;lt;pfleury@gmx.ch&amp;gt;  http://jump.to/fleury&lt;br /&gt;
* File:     $Id: twimaster.c,v 1.3 2005/07/02 11:14:21 Peter Exp $&lt;br /&gt;
* Software: AVR-GCC 3.4.3 / avr-libc 1.2.3&lt;br /&gt;
* Target:   any AVR device with hardware TWI &lt;br /&gt;
* Usage:    API compatible with I2C Software Library i2cmaster.h&lt;br /&gt;
**************************************************************************/&lt;br /&gt;
#include &amp;lt;inttypes.h&amp;gt;&lt;br /&gt;
#include &amp;lt;compat/twi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;i2cmaster.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* define CPU frequency in Mhz here if not defined in Makefile */&lt;br /&gt;
#ifndef F_CPU&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/* I2C clock in Hz */&lt;br /&gt;
#define SCL_CLOCK  100000L&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*************************************************************************&lt;br /&gt;
 Initialization of the I2C bus interface. Need to be called only once&lt;br /&gt;
*************************************************************************/&lt;br /&gt;
void i2c_init(void)&lt;br /&gt;
{&lt;br /&gt;
  /* initialize TWI clock: 100 kHz clock, TWPS = 0 =&amp;gt; prescaler = 1 */&lt;br /&gt;
  &lt;br /&gt;
  TWSR = 0;                         /* no prescaler */&lt;br /&gt;
  TWBR = ((F_CPU/SCL_CLOCK)-16)/2;  /* must be &amp;gt; 10 for stable operation */&lt;br /&gt;
&lt;br /&gt;
}/* i2c_init */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*************************************************************************	&lt;br /&gt;
  Issues a start condition and sends address and transfer direction.&lt;br /&gt;
  return 0 = device accessible, 1= failed to access device&lt;br /&gt;
*************************************************************************/&lt;br /&gt;
unsigned char i2c_start(unsigned char address)&lt;br /&gt;
{&lt;br /&gt;
    uint8_t   twst;&lt;br /&gt;
&lt;br /&gt;
	// send START condition&lt;br /&gt;
	TWCR = (1&amp;lt;&amp;lt;TWINT) | (1&amp;lt;&amp;lt;TWSTA) | (1&amp;lt;&amp;lt;TWEN);&lt;br /&gt;
&lt;br /&gt;
	// wait until transmission completed&lt;br /&gt;
	while(!(TWCR &amp;amp; (1&amp;lt;&amp;lt;TWINT)));&lt;br /&gt;
&lt;br /&gt;
	// check value of TWI Status Register. Mask prescaler bits.&lt;br /&gt;
	twst = TW_STATUS &amp;amp; 0xF8;&lt;br /&gt;
	if ( (twst != TW_START) &amp;amp;&amp;amp; (twst != TW_REP_START)) return 1;&lt;br /&gt;
&lt;br /&gt;
	// send device address&lt;br /&gt;
	TWDR = address;&lt;br /&gt;
	TWCR = (1&amp;lt;&amp;lt;TWINT) | (1&amp;lt;&amp;lt;TWEN);&lt;br /&gt;
&lt;br /&gt;
	// wail until transmission completed and ACK/NACK has been received&lt;br /&gt;
	while(!(TWCR &amp;amp; (1&amp;lt;&amp;lt;TWINT)));&lt;br /&gt;
&lt;br /&gt;
	// check value of TWI Status Register. Mask prescaler bits.&lt;br /&gt;
	twst = TW_STATUS &amp;amp; 0xF8;&lt;br /&gt;
	if ( (twst != TW_MT_SLA_ACK) &amp;amp;&amp;amp; (twst != TW_MR_SLA_ACK) ) return 1;&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
&lt;br /&gt;
}/* i2c_start */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*************************************************************************&lt;br /&gt;
 Issues a start condition and sends address and transfer direction.&lt;br /&gt;
 If device is busy, use ack polling to wait until device is ready&lt;br /&gt;
 &lt;br /&gt;
 Input:   address and transfer direction of I2C device&lt;br /&gt;
*************************************************************************/&lt;br /&gt;
void i2c_start_wait(unsigned char address)&lt;br /&gt;
{&lt;br /&gt;
    uint8_t   twst;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    while ( 1 )&lt;br /&gt;
    {&lt;br /&gt;
	    // send START condition&lt;br /&gt;
	    TWCR = (1&amp;lt;&amp;lt;TWINT) | (1&amp;lt;&amp;lt;TWSTA) | (1&amp;lt;&amp;lt;TWEN);&lt;br /&gt;
    &lt;br /&gt;
    	// wait until transmission completed&lt;br /&gt;
    	while(!(TWCR &amp;amp; (1&amp;lt;&amp;lt;TWINT)));&lt;br /&gt;
    &lt;br /&gt;
    	// check value of TWI Status Register. Mask prescaler bits.&lt;br /&gt;
    	twst = TW_STATUS &amp;amp; 0xF8;&lt;br /&gt;
    	if ( (twst != TW_START) &amp;amp;&amp;amp; (twst != TW_REP_START)) continue;&lt;br /&gt;
    &lt;br /&gt;
    	// send device address&lt;br /&gt;
    	TWDR = address;&lt;br /&gt;
    	TWCR = (1&amp;lt;&amp;lt;TWINT) | (1&amp;lt;&amp;lt;TWEN);&lt;br /&gt;
    &lt;br /&gt;
    	// wail until transmission completed&lt;br /&gt;
    	while(!(TWCR &amp;amp; (1&amp;lt;&amp;lt;TWINT)));&lt;br /&gt;
    &lt;br /&gt;
    	// check value of TWI Status Register. Mask prescaler bits.&lt;br /&gt;
    	twst = TW_STATUS &amp;amp; 0xF8;&lt;br /&gt;
    	if ( (twst == TW_MT_SLA_NACK )||(twst ==TW_MR_DATA_NACK) ) &lt;br /&gt;
    	{    	    &lt;br /&gt;
    	    /* device busy, send stop condition to terminate write operation */&lt;br /&gt;
	        TWCR = (1&amp;lt;&amp;lt;TWINT) | (1&amp;lt;&amp;lt;TWEN) | (1&amp;lt;&amp;lt;TWSTO);&lt;br /&gt;
	        &lt;br /&gt;
	        // wait until stop condition is executed and bus released&lt;br /&gt;
	        while(TWCR &amp;amp; (1&amp;lt;&amp;lt;TWSTO));&lt;br /&gt;
	        &lt;br /&gt;
    	    continue;&lt;br /&gt;
    	}&lt;br /&gt;
    	//if( twst != TW_MT_SLA_ACK) return 1;&lt;br /&gt;
    	break;&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
}/* i2c_start_wait */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*************************************************************************&lt;br /&gt;
 Issues a repeated start condition and sends address and transfer direction &lt;br /&gt;
&lt;br /&gt;
 Input:   address and transfer direction of I2C device&lt;br /&gt;
 &lt;br /&gt;
 Return:  0 device accessible&lt;br /&gt;
          1 failed to access device&lt;br /&gt;
*************************************************************************/&lt;br /&gt;
unsigned char i2c_rep_start(unsigned char address)&lt;br /&gt;
{&lt;br /&gt;
    return i2c_start( address );&lt;br /&gt;
&lt;br /&gt;
}/* i2c_rep_start */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*************************************************************************&lt;br /&gt;
 Terminates the data transfer and releases the I2C bus&lt;br /&gt;
*************************************************************************/&lt;br /&gt;
void i2c_stop(void)&lt;br /&gt;
{&lt;br /&gt;
    /* send stop condition */&lt;br /&gt;
	TWCR = (1&amp;lt;&amp;lt;TWINT) | (1&amp;lt;&amp;lt;TWEN) | (1&amp;lt;&amp;lt;TWSTO);&lt;br /&gt;
	&lt;br /&gt;
	// wait until stop condition is executed and bus released&lt;br /&gt;
	while(TWCR &amp;amp; (1&amp;lt;&amp;lt;TWSTO));&lt;br /&gt;
&lt;br /&gt;
}/* i2c_stop */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*************************************************************************&lt;br /&gt;
  Send one byte to I2C device&lt;br /&gt;
  &lt;br /&gt;
  Input:    byte to be transfered&lt;br /&gt;
  Return:   0 write successful &lt;br /&gt;
            1 write failed&lt;br /&gt;
*************************************************************************/&lt;br /&gt;
unsigned char i2c_write( unsigned char data )&lt;br /&gt;
{	&lt;br /&gt;
    uint8_t   twst;&lt;br /&gt;
    &lt;br /&gt;
	// send data to the previously addressed device&lt;br /&gt;
	TWDR = data;&lt;br /&gt;
	TWCR = (1&amp;lt;&amp;lt;TWINT) | (1&amp;lt;&amp;lt;TWEN);&lt;br /&gt;
&lt;br /&gt;
	// wait until transmission completed&lt;br /&gt;
	while(!(TWCR &amp;amp; (1&amp;lt;&amp;lt;TWINT)));&lt;br /&gt;
&lt;br /&gt;
	// check value of TWI Status Register. Mask prescaler bits&lt;br /&gt;
	twst = TW_STATUS &amp;amp; 0xF8;&lt;br /&gt;
	if( twst != TW_MT_DATA_ACK) return 1;&lt;br /&gt;
	return 0;&lt;br /&gt;
&lt;br /&gt;
}/* i2c_write */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*************************************************************************&lt;br /&gt;
 Read one byte from the I2C device, request more data from device &lt;br /&gt;
 &lt;br /&gt;
 Return:  byte read from I2C device&lt;br /&gt;
*************************************************************************/&lt;br /&gt;
unsigned char i2c_readAck(void)&lt;br /&gt;
{&lt;br /&gt;
	TWCR = (1&amp;lt;&amp;lt;TWINT) | (1&amp;lt;&amp;lt;TWEN) | (1&amp;lt;&amp;lt;TWEA);&lt;br /&gt;
	while(!(TWCR &amp;amp; (1&amp;lt;&amp;lt;TWINT)));    &lt;br /&gt;
&lt;br /&gt;
    return TWDR;&lt;br /&gt;
&lt;br /&gt;
}/* i2c_readAck */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*************************************************************************&lt;br /&gt;
 Read one byte from the I2C device, read is followed by a stop condition &lt;br /&gt;
 &lt;br /&gt;
 Return:  byte read from I2C device&lt;br /&gt;
*************************************************************************/&lt;br /&gt;
unsigned char i2c_readNak(void)&lt;br /&gt;
{&lt;br /&gt;
	TWCR = (1&amp;lt;&amp;lt;TWINT) | (1&amp;lt;&amp;lt;TWEN);&lt;br /&gt;
	while(!(TWCR &amp;amp; (1&amp;lt;&amp;lt;TWINT)));&lt;br /&gt;
	&lt;br /&gt;
    return TWDR;&lt;br /&gt;
&lt;br /&gt;
}/* i2c_readNak */&lt;/div&gt;</summary>
		<author><name>StudentDVPS</name></author>
	</entry>
</feed>