SSD1306/lib/twi.h

182 lines
7.0 KiB
C
Raw Normal View History

2020-10-13 04:45:09 -04:00
/**
2022-12-15 15:50:49 -05:00
* --------------------------------------------------------------------------------------+
2020-10-13 04:45:09 -04:00
* @desc Two Wire Interface / I2C Communication
2022-12-15 15:50:49 -05:00
* --------------------------------------------------------------------------------------+
2020-10-13 04:45:09 -04:00
* Copyright (C) 2020 Marian Hrinko.
* Written by Marian Hrinko (mato.hrinko@gmail.com)
*
* @author Marian Hrinko
* @datum 06.09.2020
* @file twi.h
2021-04-29 02:47:08 -04:00
* @tested AVR Atmega16, ATmega8, Atmega328
*
2022-12-15 15:50:49 -05:00
* @depend avr/io.h
* --------------------------------------------------------------------------------------+
2021-04-29 02:47:08 -04:00
* @usage Basic Master Transmit Operation
2020-10-13 04:45:09 -04:00
*/
#ifndef __TWI_H__
#define __TWI_H__
2022-12-15 15:50:49 -05:00
// @includes
#include <avr/io.h>
2020-10-13 04:45:09 -04:00
// define register for TWI communication
2022-12-15 15:50:49 -05:00
// -------------------------------------------------------------------------------------
2021-04-29 02:47:08 -04:00
#if defined(__AVR_ATmega16__) || defined(__AVR_ATmega8__) || defined(__AVR_ATmega328P__)
2020-10-13 04:45:09 -04:00
2021-04-29 02:47:08 -04:00
#define TWI_TWAR TWAR // TWI (Slave) Address Register
#define TWI_TWBR TWBR // TWI Bit Rate Register
#define TWI_TWDR TWDR // TWI Data Register
#define TWI_TWCR TWCR // TWI Control Register
#define TWI_TWSR TWSR // TWI Status Register
2020-10-13 04:45:09 -04:00
2021-04-29 02:47:08 -04:00
#endif
2020-10-13 04:45:09 -04:00
2021-04-29 02:47:08 -04:00
// Success
2022-12-15 15:50:49 -05:00
// -------------------------------------------------------------------------------------
2021-04-29 02:47:08 -04:00
#ifndef SUCCESS
#define SUCCESS 0
#endif
2020-10-13 04:45:09 -04:00
2021-04-29 02:47:08 -04:00
// Error
2022-12-15 15:50:49 -05:00
// -------------------------------------------------------------------------------------
2021-04-29 02:47:08 -04:00
#ifndef ERROR
#define ERROR 1
#endif
2020-10-13 04:45:09 -04:00
2022-12-15 15:50:49 -05:00
// -------------------------------------------------------------------------------------
2020-10-13 04:45:09 -04:00
//
// M A S T E R M O D E
//
2022-12-15 15:50:49 -05:00
// -------------------------------------------------------------------------------------
2020-10-13 04:45:09 -04:00
// Master Mode - Transmitter / Receiver
#define TWI_START_ACK 0x08 // A START condition has been transmitted
#define TWI_REP_START_ACK 0x10 // A repeated START condition has been transmitted
#define TWI_FLAG_ARB_LOST 0x38 // Arbitration lost in SLA+W or NOT ACK bit
// Master Transmitter Mode
#define TWI_MT_SLAW_ACK 0x18 // SLA+W has been transmitted; ACK has been received
#define TWI_MT_SLAW_NACK 0x20 // SLA+W has been transmitted; NOT ACK has been received
#define TWI_MT_DATA_ACK 0x28 // Data byte has been transmitted; ACK has been received
#define TWI_MT_DATA_NACK 0x30 // Data byte has been transmitted; NOT ACK has been received
// Master Receiver Mode
#define TWI_MR_SLAR_ACK 0x40 // SLA+R has been transmitted; ACK has been received
#define TWI_MR_SLAR_NACK 0x48 // SLA+R has been transmitted; NOT ACK has been received
#define TWI_MR_DATA_ACK 0x50 // Data byte has been received; ACK has been received
#define TWI_MR_DATA_NACK 0x58 // Data byte has been received; NOT ACK has been received
2022-12-15 15:50:49 -05:00
// -------------------------------------------------------------------------------------
2020-10-13 04:45:09 -04:00
//
// S L A V E M O D E
//
2022-12-15 15:50:49 -05:00
// -------------------------------------------------------------------------------------
2020-10-13 04:45:09 -04:00
// Slave Receiver Mode
#define TWI_SR_SLAW_ACK 0x60 // Own Slave address has been received; ACK returned
#define TWI_SR_ALMOA_ACK 0x68 // Arbitration Lost in SLA+R/W as Master; Own Slave address has been received; ACK returned
#define TWI_SR_GCALL_ACK 0x70 // General call address has been received; ACK returned
#define TWI_SR_ALMGA_ACK 0x78 // Arbitration lost in SLA+R/W as Master; General call address has been received; ACK returned
#define TWI_SR_OA_DATA_ACK 0x80 // Previously addressed with own SLA+W; data has been received; ACK returned
#define TWI_SR_OA_DATA_NACK 0x88 // Previously addressed with own SLA+W; data has been received; NOT ACK returned
#define TWI_SR_GC_DATA_ACK 0x90 // Previously addressed with general call; data has been received; ACK returned
#define TWI_SR_GC_DATA_NACK 0x98 // Previously addressed with general call; data has been received; NOT ACK returned
#define TWI_SR_STOP_RSTART 0xA0 // A STOP condition or repeated START condition has been received while still addressed as Slave
// Slave Transmitter Mode
#define TWI_ST_OA_ACK 0xA8 // Own SLA+R has been received; ACK has been returned
#define TWI_ST_ALMOA_ACK 0xB0 // Arbitration lost in SLA+R/W as Master; own SLA+R has been received; ACK has been received
#define TWI_ST_DATA_ACK 0xB8 // Data byte in TWDR has been transmitted; ACK has been received
#define TWI_ST_DATA_NACK 0xC0 // Data byte in TWDR has been transmitted; NOT ACK has been received
#define TWI_ST_DATA_LOST_ACK 0xC8 // Last data byte in TWDR has been transmitted (TWEA = '0'); ACK has been received
2021-04-29 02:47:08 -04:00
// TWI CLK frequency
2022-12-15 15:50:49 -05:00
// -------------------------------------------------------------------------------------
2021-04-29 02:47:08 -04:00
// @param TWBR
// @param Prescaler
// TWPS1 TWPS0 - PRESCALER
// 0 0 - 1
// 0 1 - 4
// 1 0 - 16
// 1 1 - 64
#define TWI_FREQ(BIT_RATE, PRESCALER) { TWI_TWBR = BIT_RATE; TWI_TWSR |= (TWI_TWSR & 0x03) | PRESCALER; }
// TWI start condition
2022-12-15 15:50:49 -05:00
// -------------------------------------------------------------------------------------
2021-04-29 02:47:08 -04:00
// (1 << TWEN) - TWI Enable
// (1 << TWINT) - TWI Interrupt Flag - must be cleared by set
// (1 << TWSTA) - TWI Start
#define TWI_START() { TWI_TWCR = (1 << TWEN) | (1 << TWINT) | (1 << TWSTA); }
// TWI stop condition
2022-12-15 15:50:49 -05:00
// -------------------------------------------------------------------------------------
2021-04-29 02:47:08 -04:00
// (1 << TWEN) - TWI Enable
// (1 << TWINT) - TWI Interrupt Flag - must be cleared by set
// (1 << TWSTO) - TWI Stop
#define TWI_STOP() { TWI_TWCR = (1 << TWEN) | (1 << TWINT) | (1 << TWSTO); }
// TWI enable
2022-12-15 15:50:49 -05:00
// -------------------------------------------------------------------------------------
2021-04-29 02:47:08 -04:00
// (1 << TWEN) - TWI Enable
// (1 << TWINT) - TWI Interrupt Flag - must be cleared by set
#define TWI_ENABLE() { TWI_TWCR = (1 << TWEN) | (1 << TWINT); }
// TWI test if TWINT Flag is set
#define TWI_WAIT_TILL_TWINT_IS_SET() { while (!(TWI_TWCR & (1 << TWINT))); }
// TWI status mask
#define TWI_STATUS ( TWI_TWSR & 0xF8 )
2020-10-13 04:45:09 -04:00
/**
2021-04-29 02:47:08 -04:00
* @desc TWI init
2020-10-13 04:45:09 -04:00
*
* @param void
*
* @return void
*/
2022-12-05 16:46:24 -05:00
void TWI_Init (void);
2020-10-13 04:45:09 -04:00
/**
* @desc TWI MT Start
*
* @param void
*
* @return char
*/
2022-12-05 16:46:24 -05:00
char TWI_MT_Start (void);
2020-10-13 04:45:09 -04:00
/**
* @desc TWI Send SLAW
*
* @param void
*
* @return unsigned char
*/
2022-12-05 16:46:24 -05:00
char TWI_MT_Send_SLAW (char);
2020-10-13 04:45:09 -04:00
/**
* @desc TWI Send data
*
* @param char
*
* @return char
*/
2022-12-05 16:46:24 -05:00
char TWI_MT_Send_Data (char);
2020-10-13 04:45:09 -04:00
/**
* @desc TWI Send SLAR
*
* @param void
*
* @return unsigned char
*/
2022-12-05 16:46:24 -05:00
char TWI_MR_Send_SLAR (char);
2020-10-13 04:45:09 -04:00
/**
* @desc TWI stop
*
* @param void
*
* @return void
*/
2022-12-05 16:46:24 -05:00
void TWI_Stop (void);
2020-10-13 04:45:09 -04:00
#endif