15#include <avr/interrupt.h>
21#define TWI_TIMEOUT_LIMIT_DEFAULT 200
45#if (TWI_DEBUG_MODE == 1)
47volatile uint8_t debug_twi_last_status = 0;
51volatile uint8_t debug_twi_counter = 0;
61 return (uint8_t)((
F_CPU / scl_freq) - 16UL) / 2UL;
76 TWCR = (1 << TWEN) | (1 << TWIE);
80 TWCR = (1 << TWEN) | (1 << TWIE) | (1 << TWEA);
120 TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN) | (1 << TWIE);
130 uint8_t twsr = TW_STATUS;
133 #if (TWI_DEBUG_MODE == 1)
134 debug_twi_last_status = twsr;
147 TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN) | (1 << TWIE);
150 #if (TWI_DEBUG_MODE == 1)
151 debug_twi_last_status = 0xFF;
165 TWDR = (
g_twi_txn.slave_addr << 1) | TW_WRITE;
168 TWDR = (
g_twi_txn.slave_addr << 1) | TW_READ;
171 TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWIE);
182 TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWIE);
185 TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN) | (1 << TWIE);
190 TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN) | (1 << TWIE);
200 TWCR = (1 << TWINT) | (1 << TWEA) | (1 << TWEN) | (1 << TWIE);
203 TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWIE);
214 TWCR = (1 << TWINT) | (1 << TWEA) | (1 << TWEN) | (1 << TWIE);
216 TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWIE);
221 case TW_MR_DATA_NACK:
226 TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN) | (1 << TWIE);
234 case TW_SR_GCALL_ACK:
237 TWCR = (1 << TWINT) | (1 << TWEA) | (1 << TWEN) | (1 << TWIE);
244 case TW_SR_GCALL_DATA_ACK:
250 TWCR = (1 << TWINT) | sr_ack | (1 << TWEN) | (1 << TWIE);
261 TWCR = (1 << TWINT) | (1 << TWEA) | (1 << TWEN) | (1 << TWIE);
276 TWCR = (1 << TWINT) | (1 << TWEA) | (1 << TWEN) | (1 << TWIE);
286 TWCR = (1 << TWINT) | (1 << TWEA) | (1 << TWEN) | (1 << TWIE);
290 case TW_ST_DATA_NACK:
293 case TW_ST_LAST_DATA:
294 TWCR = (1 << TWINT) | (1 << TWEA) | (1 << TWEN) | (1 << TWIE);
306 TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN) | (1 << TWIE);
310 case TW_MT_DATA_NACK:
313 TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN) | (1 << TWIE);
318 TWCR = (1 << TWINT) | (1 << TWEA) | (1 << TWEN) | (1 << TWIE);
343 TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN) | (1 << TWIE);
356 TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN) | (1 << TWIE);
362 const uint8_t* write_data,
size_t write_length,
363 uint8_t* read_data,
size_t read_length) {
376 TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN) | (1 << TWIE);
448 TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN) | (1 << TWIE);
void on_complete(TWI_Status_t st, const uint8_t *data, size_t len)
Callback de conclusão para transações Master.
size_t on_transmit(uint8_t *buffer, size_t max_len)
Callback de transmissão (Slave -> Master).
void on_receive(const uint8_t *dados, size_t len)
Callback de recebimento (Master -> Slave).
Estrutura de controle para a transação TWI ativa.
void twi_handle_state(void)
Gerenciador principal da Máquina de Estados.
void twi_master_register_callbacks(TWI_Master_Complete_Callback_t on_complete, TWI_Error_Callback_t on_error)
Registra os callbacks de eventos para o modo Master.
static uint8_t slave_internal_rx_buffer[TWI_RX_BUFFER_SIZE]
Buffer interno para recepção de dados no modo Slave.
void twi_slave_register_callbacks(TWI_Slave_Receive_Callback_t on_receive, TWI_Slave_Transmit_Callback_t on_transmit)
Registra os callbacks de eventos para o modo Slave.
TWI_Status_t twi_master_start_read(uint8_t slave_address, uint8_t *data, size_t length)
Inicia leitura assíncrona de dados como Master.
static TWI_Slave_Transmit_Callback_t slave_transmit_cb
static uint8_t twi_calc_twbr(TWI_Clock_t clock)
Calcula o valor do registrador TWBR baseado na frequência de CPU e SCL desejada.
static TWI_Error_Callback_t error_cb
#define TWI_TIMEOUT_LIMIT_DEFAULT
Limite padrão de timeout para evitar travamento do barramento.
ISR(TWI_vect)
Vetor de Interrupção TWI.
TWI_Status_t twi_master_start_probe(uint8_t slave_address)
Realiza um "ping" no endereço para verificar se o Slave está presente.
TWI_Status_t twi_slave_process(void)
Processa eventos pendentes no Slave.
static TWI_Slave_Receive_Callback_t slave_receive_cb
static TWI_Master_Complete_Callback_t master_complete_cb
TWI_Status_t twi_init(TWI_Mode_t mode, uint8_t address, TWI_Clock_t clock)
Inicializa o módulo TWI.
TWI_Status_t twi_master_start_write_read(uint8_t slave_address, const uint8_t *write_data, size_t write_length, uint8_t *read_data, size_t read_length)
Inicia uma transação combinada (Escrita seguida de Leitura) com Repeated Start.
static size_t slave_rx_idx
Índice atual do buffer de recepção do Slave.
void twi_deinit(void)
Desabilita o módulo TWI e reseta o estado da transação.
TWI_Status_t twi_master_start_write(uint8_t slave_address, const uint8_t *data, size_t length)
Inicia envio assíncrono de dados como Master.
TWI_Status_t twi_master_write_read(uint8_t slave_addr, const uint8_t *tx_data, size_t tx_len, uint8_t *rx_data, size_t rx_len)
Inicia uma transação combinada de escrita seguida de leitura (Repeated Start).
TWI_BusState_t twi_get_bus_status(void)
Retorna o estado atual do barramento.
static uint8_t slave_internal_tx_buffer[TWI_RX_BUFFER_SIZE]
Buffer interno para transmissão de dados no modo Slave.
Interface pública do driver TWI/I2C para AVR.
#define F_CPU
Define a frequência da CPU caso não tenha sido definida via compilador.
TWI_BusState_t
Estados lógicos do barramento TWI.
Configurações estáticas do driver TWI.
#define TWI_ENABLE_GENERAL_CALL
Habilita a resposta ao endereço de chamada geral (0x00).
#define TWI_RX_BUFFER_SIZE
Tamanho dos buffers internos de recepção e transmissão do Slave.
Definições internas e Máquina de Estados (FSM) do driver TWI.
TWI_State_t
Estados da Máquina de Estados Finita (FSM) do TWI.
volatile TWI_Transaction_t g_twi_txn
Instância global da transação ativa.
size_t(* TWI_Slave_Transmit_Callback_t)(uint8_t *data, size_t max_length)
Callback para o modo Slave: acionado quando o Master solicita dados.
TWI_Mode_t
Modos de operação do módulo TWI.
TWI_Status_t
Códigos de status e erro para operações TWI.
void(* TWI_Master_Complete_Callback_t)(TWI_Status_t status, const uint8_t *data, size_t length)
Callback de conclusão para o modo Master.
void(* TWI_Slave_Receive_Callback_t)(const uint8_t *data, size_t length)
Callback para o modo Slave: acionado após o recebimento de dados.
void(* TWI_Error_Callback_t)(TWI_Status_t error)
Callback genérico para tratamento de erros no barramento.
TWI_Clock_t
Frequências de clock (SCL) suportadas para o barramento.